一。計画タスク#
主な内容:周期的な計画タスク 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/ (注:計画タスクが統一して保存されるディレクトリ、1 ユーザーに対して 1 ファイル名)==
# ls
cali liangluyao ==root==
# ==cat root (注:ファイルの中身は crontab -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 変数を持ち、シェルの PATH 変数とは異なる)==
MAILTO=root ==(注:すべての計画タスクのコマンドは、PATH 変数の問題のため、コマンドの絶対パスを使用することをお勧めします)==
==(注↑:デフォルトでは、計画タスクに問題が発生した場合、crontab は root にメールを送信します)==
# 詳細は man 4 crontabs を参照
# ジョブ定義の例: (注:コマンドの説明)
# .---------------- 分 (0 - 59)
# | .------------- 時間 (0 - 23)
# | | .---------- 月の日 (1 - 31)
# | | | .------- 月 (1 - 12) または jan,feb,mar,apr ...
# | | | | .---- 曜日 (0 - 6) (日曜日 = 0 または 7) または sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * ユーザー名 実行するコマンド
# 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 は毎日 1 回実行される(スクリプト、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 つのファイルにリダイレクト ==
==&>==
==&>> 追加 ==
==>1.txt 1.txt ファイルの内容を空にする ==
==xull というユーザーのすべての計画タスクを削除 == rm -rf /var/spool/cron/xull
==# crontab -u xull -r (注 *)==
計画タスクをキャンセル
スクリプト + 計画タスク = 自動化
先にスクリプトを作成し、その後計画タスクを作成
計画タスク実験#
計画タスク実験:
1.root ユーザーのために計画タスクを作成:毎週火曜日、木曜日、土曜日の 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 ファイルの数 : $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>> 追加 ==
======
== 正しいかエラーかに関わらず、すべての内容を 1 つのファイルにリダイレクト ==
==&>==
==&>> 追加 ==
==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
効果を確認する方法
# 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 (注:権限の問題に注意し、アクセスできるかどうか)
各ユーザーの計画タスクは 1 つのファイルに保存される /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 ディレクトリで 1 つずつ確認)
……
# 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 (注:毎時間実行されるのは毎時間の最初の 1 分間)
(注: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. アンダースコア命名法 (シェルで推奨)2. キャメルケース命名法 3. ハンガリアン命名法
変数命名の注意事項
shell で変数が定義されていない場合、出力は空値
==env== シェル内の == 環境変数 == を確認
==set== 現在のシェル内の == すべての変数 == を確認
==export 変数をグローバル変数として出力 ==
# ==echo は現在の bash のプロセス番号を示す)==
# ==bash (注:子プロセスを起動、子 bash)==
# ==echo "$mv $sg hello" (注:一連の内容を出力する際は、ダブルクォーテーションで囲む)==
# ==echo '$mv $sg hello' (注:シングルクォーテーション:見たままの通り $ が変数名を参照しない)==
シェルプログラミング
1.変数の定義
variable 変数の
sg=tanglf
変数の命名:
1.アンダースコア命名法 (シェルで推奨)
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== シェル内の == 環境変数 == を確認
==set== 現在のシェル内の == すべての変数 == を確認
変数にはスコープがある
グローバル変数
ローカル変数
==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
#