シェルスクリプトトピック(02):本番環境の一般的なシェルのユースケース

1.テーマの背景

最近、自動化プラットフォーム(自動化された運用および保守プラットフォームSpugテストを参照)を使用して毎週変更を加えています。効果は非常に優れています。プラットフォームは、スクリプトの配布を通じて、多数の反復的で面倒な操作を標準化および自動化しました。プラットフォームのコアは各サーバーに分散されています。シェルスクリプト、シェルスクリプトの要約を作成する必要があると感じたので、このトピックを書くことを考えています。このトピックでは、運用と保守を組み合わせたシェルスクリプトのさまざまな使用法を紹介します。約10の記事に、システムの検査、監視、ftpのアップロードとダウンロード、データベースクエリ、ログのクリーンアップ、クロック同期、タイミングタスクなどが含まれると推定されます。 、一般的に使用されるシェルの文法、メモ、デバッグなどが含まれます。

2.まえがき

この記事はトピックの2番目です。

この記事では、主に、置換、削除、指定された行と指定された文字の検索、ファイル転送、列と列の交換など、日常の生産操作と保守で最近使用されたいくつかのシェルステートメントを紹介します。

3つ、シェルのユースケース

1.rootログインを直接禁止する

要件:安全性を確保するため、本番環境ではrootアカウントでの直接ログインは禁止されています

修正する前に:

[root@ansible /etc/ssh]# ll|grep sshd_config
-rw-------. 1 root root       3907 4月  11 2018 sshd_config
[root@ansible /etc/ssh]# more /etc/ssh/sshd_config|grep PermitRootLogin
#PermitRootLogin yes
# the setting of "PermitRootLogin without-password".

変更前は、ディレクトリ/ etc / sshの下にsshd_configファイルが1つだけあり、PermitRootLoginがコメント状態として設定されています。

変更後:

[root@ansible /etc/ssh]# sed -i.bak 's/#PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
[root@ansible /etc/ssh]# more /etc/ssh/sshd_config|grep PermitRootLogin                               
PermitRootLogin no
# the setting of "PermitRootLogin without-password".
[root@ansible /etc/ssh]# ll|grep sshd_config                                                          
-rw-------  1 root root       3905 1月  22 15:26 sshd_config
-rw-------. 1 root root       3907 4月  11 2018 sshd_config.bak

変更後、ディレクトリ/ etc / sshにはさらに多くのバックアップファイルがあり、PermitRootLoginパラメータはコメント化されており、状態はありません。

画像-20210122155247208

2.sudoerリストを更新します

要件:一部のアカウントにはroot権限が必要です

修正する前に:

[root@ansible /etc]# cd
[root@ansible ~]# cd /etc
[root@ansible /etc]# ll|grep sudoers              
-r--r-----.  1 root root     4328 10月 30 2018 sudoers
drwxr-x---.  2 root root        6 10月 31 2018 sudoers.d
[root@ansible /etc]# more sudoers|grep 'ALL=(ALL)'
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
# %wheel        ALL=(ALL)       NOPASSWD: ALL

変更前は、/ etcの下にsudoersファイルのみがあり、root以外のアカウントにはroot権限がありません。

変更後:

[root@ansible /etc]# sed  -i.bak "/root.*ALL=(ALL).*ALL/a\app    ALL=(ALL)       ALL"  /etc/sudoers
[root@ansible /etc]# ll|grep sudoers                                                               
-r--r-----   1 root root     4355 1月  22 16:05 sudoers
-r--r-----   1 root root     4328 1月  22 15:53 sudoers.bak
drwxr-x---.  2 root root        6 10月 31 2018 sudoers.d
[root@ansible /etc]# more sudoers|grep 'ALL=(ALL)'                                                 
root    ALL=(ALL)       ALL
app    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
# %wheel        ALL=(ALL)       NOPASSWD: ALL

変更後、/ etcに追加のバックアップファイルsudoers.bakがあり、rootの下の行にはアプリアカウントに関する詳細情報が含まれているため、アプリにはroot権限があります。

画像-20210122160830976

3.scpは複数のディレクトリまたはファイルをコピーします

要件:複数のローカルファイルをリモートにコピーするか、複数のファイルをリモートからローカルにコピーします

ローカルでリモートディレクトリにコピーします。

[root@ansible ~]# touch  a.txt b.txt c.txt
[root@ansible ~]# mkdir d
[root@ansible ~]# scp -v -r a.txt b.txt c.txt d [email protected]:/tmp

新しいファイルa.txtb.txt c.txtとディレクトリdをローカルに作成し、それらをリモートホストの/ tmpディレクトリにコピーします

画像-20210122165106801

画像-20210122165121845

画像-20210122165134795

リモートディレクトリをローカルにコピーします。

[root@157 ~]# touch 01.sh 02.sh 03.sh
[root@157 ~]# mkdir 04
[root@ansible ~]# scp -v -r [email protected]:/root/\{01.sh,02.sh,03.sh,04\} /tmp

新しいファイル01.sh02.sh 03.shとディレクトリ04を157に作成し、ローカルの/ tmpディレクトリにコピーします。

画像-20210122165621821

画像-20210126154706589

画像-20210122165720838

4.既存のスケジュールされたタスクを削除します

要件:指定された時間指定タスクを削除します

[root@ansible /var/spool/cron]# crontab -l
0 0 * * * /usr/sbin/ntpdate -u ntpserver  >> /tmp/ntp.log
[root@ansible /var/spool/cron]# sed -i.bak '/\/usr\/sbin\/ntpdate/d' /var/spool/cron/root

/ usr / sbin / ntpdateと一致する場合は、「/」をエスケープする必要があることに注意してください

画像-20210126104339368

5.列と列の間で交換します

要件: / etc / hostsファイルのIPとホスト名を交換します。ansibleのホストリストの形式はhostname + ipです。

修正する前に:

[root@ansible ~]# cd /etc
[root@ansible /etc]# cp hosts hosts-ansible.txt 
[root@ansible /etc]# more hosts-ansible.txt 
10.17.6.137          loong576-file01
10.17.6.129          loong576-kxxl01
10.17.6.130          loong576-kxxl02
10.17.6.131          loong576-capp01
10.17.6.132          loong576-capp02
10.17.6.128          loong576-pbgw01
10.17.6.127          loong576-pbgw02
10.17.6.134          loong576-xucs01
10.17.6.133          loong576-xucs02
10.17.6.136          loong576-webc01
10.17.6.135          loong576-webc02
10.17.6.14           loong576-gwxx-1
10.17.6.15           loong576-gwxx-2
10.17.6.18           loong576-mysql1
10.17.6.17           loong576-mysql2

変更後:

[root@ansible /etc]# awk '{print $2,$1 > "hosts-ansible.txt"}' hosts-ansible.txt 
[root@ansible /etc]# more hosts-ansible.txt 
loong576-file01 10.17.6.137
loong576-kxxl01 10.17.6.129
loong576-kxxl02 10.17.6.130
loong576-capp01 10.17.6.131
loong576-capp02 10.17.6.132
loong576-pbgw01 10.17.6.128
loong576-pbgw02 10.17.6.127
loong576-xucs01 10.17.6.134
loong576-xucs02 10.17.6.133
loong576-webc01 10.17.6.136
loong576-webc02 10.17.6.135
loong576-gwxx-1 10.17.6.14
loong576-gwxx-2 10.17.6.15
loong576-mysql1 10.17.6.18
loong576-mysql2 10.17.6.17

画像-20210126105901043

このスクリプトは、IPとホスト名の位置交換を簡単に実現できます。

6.指定した行を追加します

要件: IPアドレス10.17.6の前に同時にパラメーター「ansible_ssh_host =」を追加します

[root@ansible /etc]# sed -i 's/10.17.6/ansible_ssh_host=&/' hosts-ansible.txt 

画像-202101261602134735および6まで、/ etc / hostsのip + hostnameの形式は、hostnameのansibleの形式要件を満たすために、hostname + ansible_ssh_host = + ipの形式に簡単に変換できます。

5および6まで、/ etc / hostsのip + hostnameの形式は、hostnameのansibleの形式要件を満たすために、hostname + ansible_ssh_host = + ipの形式に簡単に変換できます。

7.find、xargs、rmは見つかったファイルを削除します

要件: findを使用して、条件を満たすファイルを検索し、それらを削除します

[root@ansible /]# find ./ -name *[0-9]\*.bak
./home/a001.bak
./opt/04.txt.bak
./opt/03.bak
./tmp/09.bak
./tmp/10.txt.bak
./usr/05.bak
./usr/06.txt.bak
./var/07.bak
./var/08.txt.bak
./root/02.txt.bak
./root/01.bak
[root@ansible /]# find ./ -name *[0-9]\*.bak|xargs rm -rf
[root@ansible /]# find ./ -name *[0-9]\*.bak

番号で始まり.bakで終わるすべてのファイルを検索し、削除します

画像-20210126111216741

8.sed、find、grepファイル内の指定された文字を削除/置換

要件:すべてのファイルで「loong576」を含む文字列を検索し、置換または削除します

修正する前に:

[root@ansible-awx os-check]# find .|xargs grep -rl 'loong576'                                  
./defaults/main.yaml
./files/check_linux.sh
./tasks/main.yaml
./defaults/main.yaml
./defaults/main.yaml
./files/check_linux.sh
./files/check_linux.sh
./tasks/main.yaml
./tasks/main.yaml
[root@ansible-awx os-check]# find .|xargs grep -ri 'loong576'                                
./defaults/main.yaml:# Created by loong576 2020.05 
./files/check_linux.sh:# Created by loong576 2020.05 
./tasks/main.yaml:# Created by loong576 2020.05 
./defaults/main.yaml:# Created by loong576 2020.05 
./defaults/main.yaml:# Created by loong576 2020.05 
./files/check_linux.sh:# Created by loong576 2020.05 
./files/check_linux.sh:# Created by loong576 2020.05 
./tasks/main.yaml:# Created by loong576 2020.05 
./tasks/main.yaml:# Created by loong576 2020.05 

loong576という単語を含むファイルのリストを見つけて、ファイルに含まれている特定の文字を指摘します

変更後:「Createdbyloong5762020.05」のコメントを「Createdbyloong5762021.01」に変更します。

[root@ansible-awx os-check]# sed -i "s/2020.05/2021.01/g"  `find .|xargs grep -rl 'loong576'` 
[root@ansible-awx os-check]# find .|xargs grep -ri 'loong576'                                 
./defaults/main.yaml:# Created by loong576 2021.01 
./files/check_linux.sh:# Created by loong576 2021.01 
./tasks/main.yaml:# Created by loong576 2021.01 
./defaults/main.yaml:# Created by loong576 2021.01 
./defaults/main.yaml:# Created by loong576 2021.01 
./files/check_linux.sh:# Created by loong576 2021.01 
./files/check_linux.sh:# Created by loong576 2021.01 
./tasks/main.yaml:# Created by loong576 2021.01 
./tasks/main.yaml:# Created by loong576 2021.01 

削除時間:

[root@ansible-awx os-check]# sed -i "s/2021.01//g"  `find .|xargs grep -rl 'loong576'`               
[root@ansible-awx os-check]# find .|xargs grep -ri 'loong576'                          
./defaults/main.yaml:# Created by loong576  
./files/check_linux.sh:# Created by loong576  
./tasks/main.yaml:# Created by loong576  
./defaults/main.yaml:# Created by loong576  
./defaults/main.yaml:# Created by loong576  
./files/check_linux.sh:# Created by loong576  
./files/check_linux.sh:# Created by loong576  
./tasks/main.yaml:# Created by loong576  
./tasks/main.yaml:# Created by loong576

画像-20210126144600270

9.文字を指定して、前の行と前の行に文字を追加し、最後の行に行を追加します

要件: ntpサーバーを構成するときは、構成ファイル/etc/ntp.confの指定された文字に新しい行を追加し、いくつかのデフォルト構成にコメントを付け(指定された文字の前に#を追加)、最後に新しい行を追加する必要があります構成ファイル/ etc / hostsの

指定された文字に改行を追加します。

[root@ansible ~]# sed -i '/driftfile/i server ntpserver iburst' /etc/ntp.conf 

ドリフトファイルの指定された行に「serverntpserveriburst」を追加します

いくつかのデフォルト構成に注意してください(指定された文字の前に#を追加してください):

[root@ansible ~]# sed -i '/centos.pool.ntp.org/s/^/#/' /etc/ntp.conf

コメント「サーバー[0..3] .centos.pool.ntp.orgiburst」

変更前:

画像-20210126150628314

変更後:

画像-20210126150816735

最後の行に追加します。

[root@ansible ~]# sed -i '$a 172.16.7.157    ntpserver' /etc/hosts

画像-20210126151241163

4.この記事の要約

この記事では、主に、毎日の検索、置換、ファイル転送など、一般的に使用されるシェルのユースケースをいくつか紹介します。使用されるコマンドには、主にfind、sed、xargs、scpなどがあります。シェルスクリプトは、使用できない目的に応じてさまざまなコマンドを論理的に組み合わせることであり、これらのコマンドを習得すると、後続のスクリプトに相乗効果があります。

 

 

詳細については注意してください:シェルトピック

おすすめ

転載: blog.51cto.com/3241766/2607150