0x00 出发点
进程守护可以让自己的目标进程一直处于运行状态,可以用于服务器的重要服务、重要进程等内容,或者线下awd中的守护木马,但进程守护的进程需要一直保持运行,这样的话,可以再写一个守护进程守护守护进程的进程 ╮(╯▽╰)╭,之前学习的定时询问进程是否存在、备份、重启等都是在py环境下的,最近接触到了sh脚本的守护,记录一下自己的学习过程。
0x01 前置知识
ps
的使用
Linux下列进程命令为
ps
,简单回显当前运行进程的信息,但我们需要掌握所有进程信息,通常使用参数-ef
,列出进程和他们的父进程,方便我们查找想要的。详细的帮助可以使用ps --help
或man ps
寻找我们需要的使用方法。
|
管道的使用
linux中
|
管道符表示将前一个命令的正确输出作为第二的命令操作的对象,便于多个命令的拼接执行,例如command1 | command2 #将命令1的正确结果交给命令2处理
grep
的使用
grep
是linux下的文本处理命令,可以用来匹配特定的字符或符合条件的输出,支持正则与反正则,常用的参数为-i 忽略匹配大小写
-v 忽略匹配到的内容
-w 被匹配的文本只能是单词,而不能是单词中的某一部分,如freenote与free的分开匹配
awk
的使用
awk
是一个强大的文本语言操作工具,也有许多的参数,我们仅仅使用他获取想要的字段。awk默认使用空格或TAB制表符分隔文本,awk '{print $1,$2}' test.txt
当我们指定分隔符时可以使用awk -F, '{print $1,$2}' test.txt
0x02 获取目标进程id号并判断是否存在
实验所用的进程为freenote
进程
根据前置知识的学习,获取目标进程的id我们可以使用一条这样的命令:ps -ef | grep -w "freenote" | awk '{print $2}'
效果如下图所示
![](https://i-blog.csdnimg.cn/blog_migrate/b424148b12240e82bf786d3b80f56e38.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b741cc41857147fec133e1cabcafd0c1.png)
此时我们可以看到不只显示了我们需要的进程,还有grep进程本身也被查找了,这是我们所不许要的,所以讲命令完善添加-v
参数,去掉多余进程。ps -ef | grep -w "freenote" | grep -v “grep” | awk '{print $2}'
,这里三次使用了管道符|
,执行的效果为:
![](https://i-blog.csdnimg.cn/blog_migrate/7d1444791bf426d2d96b9e34c1751c96.png)
此时我们只需要判断id号是否存在即可达到询问进程的效果,进而判断PID是否为空,在shell脚本中为
#!/bin/bash
PID=`ps -ef | grep -w "freenote" | grep -v “grep” | awk '{print $2}'`
if [ $PID != "" ]
then echo "process is running!!!"
fi
0x03 编写守护进程
这里使用$PIDS ! = ""
在未运行时会有脚本报错的问题,于是使用简单的判断$PIDS
是否被赋值来执行语句,最后自定义一个重启程序的函数,在else时调用,每隔指定时间执行一次即可作为守护,代码如下:
#!/bin/bash
Test_Path="/home/CTF/freenote/"
Exec_cmd="./freenote"
Process_run()
{
cd $Test_Path
$Exec_cmd
}
while [[ 1 ]]; do
PID=`ps -ef | grep -w "freenote" | grep -v “grep” | awk '{print $2}'`
if [ $PID ]
then echo "process is running!!!"
else
Process_run
fi
done
需要注意的是shell脚本对空格的要求非常严格,在if、while等语句时必须要有空格,而在定义变量时,不能有空格。
若守护的进程是交互式的可能会将守护进程强制停在自己运行的时候,而被外部终结也不会被检测到,因为他是该守护进程创建的子进程,具有PPID的关系,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/cb347c82b161e40ff8508bb4d630ec5e.png)
需要我们单独起一个进程,在后续对其进行梳理。