一。計畫任務#
主要內容:周期性的計畫任務 crontab
==/var/spool/cron/ 統一存放計畫任務的目錄 ==
==/var/log/cron 日誌文件 ==
==/etc/cron cron.daily/cron.hourly/ cron.monthly/cron.weekly/ crontab 的順風車 ==
/etc/crontab
==crontab -l==
==crontab -e==
crontab ==-u cali== -e
crontab -u cali -l
== 如何知道計畫任務是否執行?==
== 使用者沒有登入,計畫任務是否執行?答:會執行 ==
== 駭客也會去利用計畫任務定時執行程式,你如何去檢查?==
==anacron 將電腦主機因為系統故障關機導致計畫任務沒有被執行,正常啟動後,anacron 會去檢測沒有執行的計畫任何,重新執行一次 ==
at 一次性的計畫任務
==at 11:45==
==at -l==
cron#
計畫任務
1. 什麼是計畫任務? (鬧鐘)
計畫什麼時候去做什麼事情
一次性的計畫任務
at
週期性的計畫任務
crontab
linux 系統裡的 == 執行計畫任務的進程 ==--》==crond==
crond 會 == 每分鐘 == 去檢查下所有使用者的計畫任務
# ps aux|grep crond
root 887 0.0 0.1 36300 3508 ? Ss 9 月 24 0:00 /usr/sbin/==crond== -n
root 16948 0.0 0.0 12320 984 pts/0 S+ 10:05 0:00 grep --color=auto ==crond==
# cd ==/var/spool/cron/ (註:統一存放計畫任務的目錄)==
# ls
#
計畫任務 原理
原理 時間的格式和語法(筆試)
(註:每個使用者都可以用的命令)
# ==crontab -l (註:查看當前使用者的計畫任務)==(每個使用者只能看自己的,root 使用者能看所有的)
no crontab for root
#
# ==crontab -e (註:創建計畫任務)==
…… (註:vim 編輯器 本質上是文本文件)
# crontab -l
==30 4 * * *== bash /lianxi/9_25/backup_log.sh
==*/5 * * * *== bash /lianxi/9_25/backup_log.sh
==50 3 6-9 10 *== bash /lianxi/9_25/backup_log.sh
==*== 該範圍內的任意時間
==,== 間隔的多個不連續時間點
==-== 一個連續的時間範圍
==/n== 指定間隔的時間頻率
==(註:crond 進程 最低的時間間隔是 1 分鐘)==
(註:時間不能衝突 日期和星期不能衝突)
#
# cd ==/var/spool/cron/ (註:統一存放計畫任務的目錄,一個使用者對應一個檔名)==
# ls
cali liangluyao ==root==
# ==cat root (註:檔案裡面 就是 cronta -e 編輯的)==
30 4 * * * bash /lianxi/9_25/backup_log.sh
*/5 * * * * bash /lianxi/9_25/backup_log.sh
50 3 6-9 10 * bash /lianxi/9_25/backup_log.sh
#
# ll ==(註:每一個使用者的計畫任務都會放在 /var/spool/cron/ 目錄下)==
總用量 12
-rw-------. 1 ==cali== cali 31 9 月 25 10:27 cali
-rw-------. 1 ==liangluyao== liangluyao 31 9 月 25 10:28 liangluyao
-rw-------. 1 ==root== root 139 9 月 25 10:25 root
#
== 問:如何知道計畫任務是否執行?==
== 答:看日誌文件,/var/log/cron。==
== 或者直接去看效果。==
======================
日誌文件 ==(註:記錄 crond 執行的計畫任務,存放在 /var/log/cron,用來排錯。)==
# tail -f ==/var/log/cron== (註:tail -f 盯著檔案末尾看)
Sep 25 10:30:01 sanchuang-linux CROND[17143]: (root) CMD (bash /lianxi/9_25/backup_log.sh)
Sep 25 10:30:01 sanchuang-linux CROND[17147]: (liangluyao) CMD (date >>~/liang.txt)
Sep 25 10:30:02 sanchuang-linux CROND [17119]: (root) CMDOUT (tar: 從成員名中刪除開頭的 “/”)
Sep 25 10:30:02 sanchuang-linux CROND [17119]: (root) CMDOUT (tar: /var/log/audit/audit.log: 在我們讀入檔案時檔案發生了變化)
Sep 25 10:30:02 sanchuang-linux CROND[17155]: (cali) CMD (date >>~/cali.txt)
示例 1(root 使用者):
每天早上 7:50 自動開啟 sshd 服務,22 點 50 時關閉
==service sshd start (註:開啟 sshd 服務)==
==service sshd stop (註:關閉 sshd 服務)==
50 7 * * * service sshd start
50 22 * * * service sshd stop
每隔 5 天的 12 點整 == 清空 == 一次 FTP 伺服器公共目錄 /var/ftp/pub
0 12 /5 * * rm -rf /var/ftp/pub==/ (註:清空:刪除裡面所有東西)==
每週六的 7:30 時,== 重新 == 啟動 httpd 服務
==service httpd restart (註:重啟 httpd 服務)==
30 7 * * 6 service httpd restart
每週一、三、五的 17:30 時,打包備份 /etc/httpd 目錄
30 17 * * 1,3,5 tar czf /==backup==/httpd.tar.gz /etc/httpd ==(註:/backup/ 是備份目錄)==
示例 2(jerry 使用者): ==(註:宿主目錄:~/)==
每週日晚上 23:55 時將 “/etc/passwd” 檔案的內容複製到 == 宿主目錄 == 中,保存為 pwd.txt 檔案
55 23 * * 0 ==/usr/bin/cp== /etc/passwd ~/pwd.txt ==(註:命令的絕對路徑)==
/etc/crontab 是 cron 的一個配置檔
# vim /etc/crontab
SHELL=/bin/bash (註:計畫任務執行命令時用 /bin/bash 執行)
==PATH===/sbin:/bin:/usr/sbin:/usr/bin ==(註:它有自己的 PATH 變數,和 shell 的 PATH 變數不同)==
MAILTO=root ==(註:所有 計畫任務裡的命令,建議使用命令的絕對路徑,因為 PATH 變數的問題)==
==(註↑:預設情況,計畫任務出了問題,crontab 會給 root 發郵件)==
# For details see man 4 crontabs
# 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
# crontab ==-u cali== -e ==(註:用 root 使用者為 cali 創建計畫任務)==
# crontab -u cali -l (註:查看)
1. 電腦關機了計畫任務是否執行?答:不執行
==2. 使用者沒有登入,計畫任務是否執行?答:會執行 ==
# ==w (註:查看哪個使用者從哪裡登入)==
# ==tail -f /var/log/cron (註:日誌文件)==
==3. 駭客也會去利用計畫任務定時執行程式,你如何去檢查?==
去 ==/var/spool/cron== 目錄下查看每一個計畫任務檔
看日誌 ==/var/log/cron==
crontd 的順風車目錄 (如下)
#
# ==cd /etc/cron*******==
cron.d/ ==cron.daily/== cron.deny ==cron.hourly/ cron.monthly/== crontab ==cron.weekly/==
# cd /etc/cron
(註:crontab 的順風車)
== 駭客也可以把需要執行的程式放到這些資料夾裡 ==
==cron.daily --》Linux 系統裡要求 crond 每天去執行的事情 ==
==cron.hourly --》Linux 系統裡要求 crond 每小時去執行的事情 ==
==cron.monthly --》Linux 系統裡要求 crond 每月去執行的事情 ==
==cron.weekly --》Linux 系統裡要求 crond 每週去執行的事情 ==
(註:# ls cron.daily
logrotate (每天都會執行,crond 每天運行一次(腳本,用 sh 執行))
# ls cron.hourly
0==anacron (annacron 將電腦主機因為系統故障關機導致計畫任務沒有被執行,正常啟動後,anacron 會去檢測沒有執行的計畫任何,重新執行一次)==
at#
at 命令 一次性的計畫任務
yum install at -y
# ==at 11:45==
warning: commands will be executed using /bin/sh
at> touch $(date +%F).txt
at> ==(註:退出 Ctrl+D)==
job 1 at Fri Sep 25 11:45:00 2020
Can't open /var/run/atd.pid to signal atd. No atd running?
# ==at -l (註:查看)==
1 Fri Sep 25 11:45:00 2020 a root
#
二。計畫任務練習 - 備份腳本#
主要內容:==chmod 777== /opt/fnum.txt (註:== 設定任何使用者都可以對檔案 /opt/fnum.txt 讀寫執行 ==)
==2>/dev/null==
==/dev/null 特殊的檔案,相當於黑洞檔案,任何的內容重定向到這個檔案都會消失,不保存 ==
== 正確的輸出重定向 ==
==>==
==>>==
== 錯誤的輸出重定向 ==
==2>==
==2>> 追加 ==
== 不管正確的還是錯誤的都往一個檔案裡重定向 ==
==&>==
==&>> 追加 ==
==>1.txt 清空 1.txt 檔案裡的內容 ==
== 刪除 xull 這個使用者所有的計畫任務 == rm -rf /var/spool/cron/xull
==# crontab -u xull -r (註 *)==
取消計畫任務
腳本 + 計畫任務 = 自動化
先編寫腳本,再創建計畫任務
計畫任務實驗#
計畫任務實驗:
1. 為 root 使用者編寫計畫任務:每週 2、4、6 的 10 點到 17 點的每隔 5 分鐘自動將 /etc/passwd、/etc/shadow 這 2 個重要系統檔案到 user. 備份的日期和時間.tar.gz 這種名稱的檔案裡(例如:user.201202011615.tar.gz)備份檔案放到 /opt/ 目錄下面。
backup_shadow_pwd.sh
# cat backup_shadow_pwd.sh
#!/bin/bash
mkdir -p /opt # 註:date +% Y% m% d% H% M% S , ==date 後面有空格 ==
tar czf /opt/user.$(date +%Y%m%d%H%M%S).tar.gz /etc/passwd /etc/shadow
# $(date +% Y-% m-% d-% H) 注意空格 上面的
==crontab -e==
*/5 10-17 * * 2,4,6 bash /lianxi/9_25/backup_shadow_pwd.sh #==(註:路徑要接對,絕對路徑)==
2.==root 使用者 == 在 /opt== 新建 == 了一個檔案 fnum.txt 專門用來統計普通使用者的檔案個數。請 == 為普通使用者 hello 編寫計畫任務 ==:要求每 5 分鐘,將系統中屬於 hello 使用者的檔案的個數自動保存到 /opt/fnum.txt 檔案中。內容格式為:“日期時間 姓名 擁有的檔案個數是:數目”。每行中間用 “******************************” 隔開
file_num.sh
# touch /opt/fnum.txt (註:== 新建空檔案,普通使用者建不了,root 使用者去建 ==)
# ==chmod 777== /opt/fnum.txt (註:== 設定任何使用者都可以對檔案 /opt/fnum.txt 讀寫執行 ==)
[cali@sanchuang-linux ~]$ crontab -l
*/5 * * * * date >>~/cali.txt
5 12-18 * * * date >>~/cali.txt
*/1 * * * * bash /home/cali/file_num.sh
[cali@sanchuang-linux ~]$ pwd
/home/cali
$ cat file_num.sh ==(註:腳本放在普通使用者家目錄裡)==
#!/bin/bash
fnum=$(find /-user cali -type f ==2>/dev/null== |wc -l) ==(註:普通使用者 檔案權限不夠 是出錯的)==
(註↑:錯誤重對象)
ctime=$(date +%F_%H%M%S)
echo "${ctime} cali the number of files : $fnum" ==>>/opt/fnum.txt (註:追加重定向 寫到檔案裡去)==
echo "******************************" ==>>/opt/fnum.txt (註:追加重定向 寫到檔案裡去)==
$
$ crontab -e ==(註:是哪些使用者就哪些使用者創建計畫任務,==cali 創建)==
*/1 * * * * bash /home/cali/file_num.sh
$ pwd
/home/cali ==(註:腳本的路徑)==
每行中間用 “*************************” 隔開 解決方法
# cat a.sh
echo "helllo"
echo "**********************"
echo "cali"
echo "**********************"
#
# num=$(find / -user liangluyao |wc -l)
$ find / -user cali -type f 2>/dev/null|wc -l
==/dev/null 特殊的檔案,相當於黑洞檔案,任何的內容重定向到這個檔案都會消失,不保存 ==
null 零,空,無效的
重定向#
== 正確的輸出重定向 ==
==>==
==>>==
======
== 錯誤的輸出重定向 ==
==2>==
==2>> 追加 ==
======
== 不管正確的還是錯誤的都往一個檔案裡重定向 ==
==&>==
==&>> 追加 ==
==ls 命令執行成功重定向到 1.txt 執行失敗重定向到 2.txt==
$ ==ls >1.txt 2>2.txt==
$ ==>1.txt 清空 1.txt 檔案裡的內容 ==
$ cat 1.txt
$
$ ls &>1.txt == 不管正確的還是錯誤的都往一個檔案裡重定向 ==
練習總結#
練習總結:
問題:
2>/dev/null
如何查看效果
# cat fnum.txt
# tail -f /var/log/cron (日誌文件)
- 取消計畫任務
== 刪除 xull 這個使用者所有的計畫任務 == rm -rf /var/spool/cron/xull
==# crontab -u xull -r (註 *)==
將檔案裡的計畫任務註解或者刪除 #*/1 * * * * bash /home/xull/file_num.sh
# cd /var/spool/cron/ ——》# rm -rf xull ==# crontab -u xull -r==
# cd /var/spool/cron/ ——》# vim xull ——》 加 # 註解掉
某個使用者的計畫任務如何創建
檔案的路徑問題和權限問題(root 可以訪問任務地方的檔案,但是普通不行,只能訪問有限的路徑)
將 root 使用者的所有計畫任務追加到 xull 使用者的計畫任務裡
# cd /var/spool/cron
# cat root >>xull (註:注意權限問題,能否訪問)
每一個使用者的計畫任務都存放在一個檔案裡 /var/spool/cron/
2.root 使用者在 /opt2 新建了一個檔案 fnum.txt 專門用來統計普通使用者的檔案個數。請為普通使用者 xull 編寫計畫任務:要求每 5 分鐘,將 == 系統中屬於 xull 使用者的檔案的個數 == 自動保存到 /opt2/fnum.txt 檔案中。內容格式為:“日期時間 姓名 擁有的檔案個數是:數目”。每行中間用 “*************************” 隔開
使用 root 使用者新建 /opt2 目錄
mkdir /opt2
cd /opt2/
touch /opt2/fnum.txt 檔案
chmod 777 /opt2/fnum.txt 授權
==xull 使用者需要去編寫腳本,創建計畫任務(普通使用者)==
== 腳本:建議放在使用者的家目錄下 ==
# su - xull
上一次登入:五 9 月 25 15:53:35 CST 2020pts/1 上
$ pwd
==/home/xull==
$ ls
$ vim file_num.sh (註:腳本放到自己的家目錄下,使用者 xull 去創建)
$ cat file_num.sh
#!/bin/bash
num=$(find / -user xull -type f 2>/dev/null |wc -l)
#current time (註:當前的時間)
ctime=$(date +%F%H%M%S)
echo "${ctime} xull 檔案數量是 $num" >>/opt2/fnum.txt (註:>> 追加)
echo "******************************" >>/opt2/fnum.txt (註:一行隔開)
$
(註:vim 互動式的。腳本是背後執行的,用 echo)
$ crontab -e
*/1 * * * * bash /home/xull/file_num.sh
$
切換到 root 使用者
$ exit
# cd /var/spool/cron/ (註:該目錄下檔案存放計畫任務)
# ls
cali liangluyao root ==xull==
#cat xull (註:檔案存放計畫任務)
==*/1 * * * * bash /home/xull/file_num.sh==
三。駭客 - 計畫任務#
主要內容:假如你是駭客,想在別人的機器上,每 10 分鐘讓它的伺服器重啟一次或者每天重啟一次
關機命令:init 6
reboot
==1. 停止 crond 服務 ==
# service crond stop
2. 查找可能存放計畫任務的目錄
/var/spool/cron (註:先挪走)
/etc/cron.d (註:與 cron.hourly 有關)
/etc/cron.weekly
/etc/cron.daily
/etc/cron.monthly
3. 檢查發現沒有問題了,再重新啟動 crond 服務
# service crond start
Redirecting to /bin/systemctl start crond.service
# ps aux|grep crond
實在有的話
# tail -f /var/log/cron (日誌文件)
開機啟動流程
# cd /root (註:root 使用者家目錄下)
# ls -a (註:隱藏檔案)
# vim .bashrc
# vim .bash_profile
# vim /etc/profile (註:可以快捷篩選查找 /reboot /init)
# vim /etc/bashrc (註:可以快捷篩選查找 /reboot /init)
# cat /etc/rc.local
假如你是駭客,想在別人的機器上,每 10 分鐘讓它的伺服器重啟一次或者每天重啟一次
====
192.168.0.45 root 123456
關機命令:init 6
reboot
============================
在各個路徑下看 有沒有可疑的 init6 和 reboot
==1. 停止 crond 服務 ==
# service crond stop
2. 查找可能存放計畫任務的目錄
/var/spool/cron (註:先挪走)
/etc/cron.d (註:與 cron.hourly 有關)
/etc/cron.weekly
/etc/cron.daily
/etc/cron.monthly
3. 檢查發現沒有問題了,再重新啟動 crond 服務
# service crond start
Redirecting to /bin/systemctl start crond.service
# ps aux|grep crond
root 1506 3.6 0.1 36304 3656 ? Ss 16:54 0:00 /usr/sbin/crond -n
root 1511 0.0 0.0 12320 1052 pts/0 S+ 16:54 0:00 grep --color=auto crond
#
實在有的話
# tail -f /var/log/cron (日誌文件)
(註:通過日誌去排查)
=============================
集中放計畫任務的地方 /var/spool/cron/
# cd /var/spool/cron/
# ls
cali liangluyao root xull
# cat cali
……(查看有沒有可疑的,vim 全部註解掉)
或者把所有檔案全部挪走,如下操作
# ls
cali liangluyao root xull
# mkdir /backup (註:根下面建一個 /backup 目錄)/backup 備份目錄
mv * /backup/ (把檔案 cali liangluyao root xull 挪到 /backup 目錄下)
計畫任務停了,crond 不會執行
# cd /backup/
# ls
cali liangluyao root xull
# cat cali (註:把計畫任務檔案挪走後,再在 /backup 目錄下 一個個排查)
……
# cat liangluyao
……
# w (註:查看哪些使用者登入)
=======================================
順風車
# cd /etc/cron.daily
# ls
# vim …
# cd /etc/cron.hourly/
# cd /etc/cron.monthly
# cd /etc/cron.weekly
# cd /etc/cron.d (註:每小時執行是每小時的第一分鐘執行)
(註:run-parts 是一個命令,運行這個資料夾裡的所有檔案)
===========================================================================
開機啟動流程
# cd /root (註:root 使用者家目錄下)
# ls -a (註:隱藏檔案)
# vim .bashrc
# vim .bash_profile
# vim /etc/profile (註:可以快捷篩選查找 /reboot /init)
# vim /etc/bashrc (註:可以快捷篩選查找 /reboot /init)
# cat /etc/rc.local
===============================================================================
四。變數定義和使用#
主要內容:
變數的命名:1. 下劃線命名法 (shell 裡建議)2. 駝峰命名法 3. 匈牙利命名法
變數命名的注意事項
shell 裡如果變數沒有定義,輸出的是空值
==env== 查看 shell 裡的 == 環境變數 ==
==set== 查看當前 shell 裡 == 所有的變數 ==
==export 輸出變數為全局變數 ==
# ==echo 代表當前 bash 的進程號)==
# ==bash (註:起一個子進程,子 bash)==
# ==echo "$mv $sg hello" (註:輸出一串內容的時候,用雙引號引起來)==
# ==echo '$mv $sg hello' (註:單引號:所見即所得 $ 接變數名不會引用變數的值)==
shell編程
1.變數的定義
variable 變數的
sg=tanglf
變數的命名:
1.下劃線命名法 (shell裡建議)
sc_sg=tanglf
2.駝峰命名法
ScSg=wangtc
小駝峰
scSg=wangtc
大駝峰
ScSg=wangtc
3.匈牙利命名法
變數命名的注意事項:
1.不是以數字開頭
2.不要全部是數字
3.不要包含特殊符號 #!@^$<>等
4.=兩邊不能有空格
linux 系統裡的環境變數都是大寫的
自定義變數儘量使用小寫
變數儘量要先定義後使用
shell 裡如果變數沒有定義,輸出的是空值
# sc_sg=zhangxueyou
# echo $sg_sg
==(←註:變數 sg_sg 沒有定義,輸出的是空值)==
# echo $sc_sg
zhangxueyou
# ==echo $sgsg/$mvmv==
==/ (←註:變數 {sgsg} {mvmv} 沒有定義,輸出的是 “/” 根)==
#
# rm -rf ==$sgsg/$mvmv==
rm: 在 '/' 進行遞歸操作十分危險
rm: 使用 --no-preserve-root 選項跳過安全模式
#
==env== 查看 shell 裡的 == 環境變數 ==
==set== 查看當前 shell 裡 == 所有的變數 ==
變數是有作用域
全局變數
局部變數
==export 輸出變數為全局變數 ==
== 用法:先定義再輸出 ==
ssh 訪問 22 號端口,sshd 監聽 22 號端口
web 服務是 80 端口
# ==echo 代表當前 bash 的進程號)==
1425
#
# ==export sg (註:輸出 sg 這個變數為全局變數)==
# echo $$
==1425==
# mv=xull
# ==bash (註:起一個子進程,子 bash)==
# echo $mv
==(註:輸出為空,變數不繼承)==
# echo $$
==1598==
# mv=xull
# ==export mv (註:輸出變數為全局變數)(註:export 輸出)==
# ==bash (註:起一個子進程,子 bash)==
# echo $mv
Xull ==(註:子進程繼承了變數)==
#
# vim /root/.bash_profile
== 輸出一串內容的時候,用雙引號引起來 ==
== 單引號:所見即所得 $ 接變數名不會引用變數的值 ==
# echo =="$mv $sg hello" (註:輸出一串內容的時候,用雙引號引起來)==
xull wangtc hello
# echo =='$mv $sg hello' (註:單引號:所見即所得 $ 接變數名不會引用變數的值)==
$mv $sg hello
#