linux程序守護遐想
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}'
效果如下圖所示
此時我們可以看到不只顯示了我們需要的程序,還有grep程序本身也被查找了,這是我們所不許要的,所以講命令完善新增
-v
引數,去掉多餘程序。
ps -ef | grep -w "freenote" | grep -v “grep” | awk '{print $2}'
|
,執行的效果為:
過濾程序
此時我們只需要判斷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的關係,如下圖:
父子關係需要我們單獨起一個程序,在後續對其進行梳理。