mycpen

Mycpen

记录学习历程与受益知识
github
telegram
bilibili

07_Linux基礎-計劃任務-備份腳本-變數定義和使用

一。計畫任務#

主要內容:周期性的計畫任務 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

#

計畫任務 原理

image-20220503205140202

原理 時間的格式和語法(筆試)

image-20220503205205407

(註:每個使用者都可以用的命令)

# ==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

image-20220503205331550

==*== 該範圍內的任意時間

==,== 間隔的多個不連續時間點

==-== 一個連續的時間範圍

==/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 (註:查看哪個使用者從哪裡登入)==

img

# ==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>> 追加 ==

======

== 不管正確的還是錯誤的都往一個檔案裡重定向 ==

==&>==

==&>> 追加 ==

img

==ls 命令執行成功重定向到 1.txt 執行失敗重定向到 2.txt==

$ ==ls >1.txt 2>2.txt==

$ ==>1.txt 清空 1.txt 檔案裡的內容 ==

$ cat 1.txt

$

$ ls &>1.txt == 不管正確的還是錯誤的都往一個檔案裡重定向 ==

練習總結#

練習總結:

問題:

  1. 2>/dev/null

  2. 如何查看效果

# cat fnum.txt

# tail -f /var/log/cron (日誌文件)

  1. 取消計畫任務

== 刪除 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 ——》 加 # 註解掉

  1. 某個使用者的計畫任務如何創建

  2. 檔案的路徑問題和權限問題(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 (註:每小時執行是每小時的第一分鐘執行)

img

(註: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 的進程號)==

​ # ==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的進程號)(註: (註:顯示當前bash的進程號)(註:代表當前 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

img

== 輸出一串內容的時候,用雙引號引起來 ==

== 單引號:所見即所得 $ 接變數名不會引用變數的值 ==

# echo =="$mv $sg hello" (註:輸出一串內容的時候,用雙引號引起來)==

xull wangtc hello

# echo =='$mv $sg hello' (註:單引號:所見即所得 $ 接變數名不會引用變數的值)==

$mv $sg hello

#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。