Linux管理者-シェルスクリプト
Bashシェルの概要
GNU Linuxのフレーバーと同様に、シェルにはさまざまな種類があり、互換性も異なります。CentOSのデフォルトのシェルは、BashまたはBourne AgainShellとして知られています。Bashシェルは、StephenBourneによって開発されたBourneShellの現代の修正バージョンです。Bashは、KenThompsonとDennisRitchieによってBellLabsで開発されたUnixオペレーティングシステム上の元のThompsonShellの直接の代替品でした(StephenBourneはBellLabsにも採用されていました)
誰もが好きなシェルを持っており、それぞれに長所と難しさがあります。しかし、ほとんどの場合、BashはすべてのLinuxディストリビューションでデフォルトのシェルになり、最も一般的に利用可能になります。経験を積むと、誰もが自分に最適なシェルを探索して使用したいと思うでしょう。ただし、同時に、誰もがBashシェルをマスターしたいと思うでしょう。
その他のLinuxシェルには、Tcsh、Csh、Ksh、Zsh、およびFishが含まれます。
エキスパートレベルでLinuxシェルを使用するスキルを開発することは、CentOS管理者にとって非常に重要です。前述したように、Windowsとは異なり、Linuxの中心はコマンドラインオペレーティングシステムです。シェルは、管理者(またはユーザー)がオペレーティングシステムにコマンドを発行できるようにする単なるユーザーインターフェイスです。Linuxシステム管理者が航空会社のパイロットである場合、シェルを使用することは、飛行機を自動操縦から外し、より機動性の高い飛行のために手動制御をつかむことに似ています。
BashのようなLinuxシェルは、コンピュータサイエンスの用語では次のように知られています。 Command Line Interpreter。Microsoft Windowsには、DOS(元のDOSオペレーティングシステムと混同しないでください)とPowerShellと呼ばれる2つのコマンドラインインタープリターもあります。
Bashのような最新のシェルは constructsより複雑なシェルスクリプトで、一般的なタスクと複雑なタスクの両方を自動化できます。
構成には次のものが含まれます-
- スクリプトフロー制御(ifthenおよびelse)
- 論理比較演算(より大きい、より小さい、等しい)
- Loops
- Variables
- 操作を定義するパラメーター(コマンド付きスイッチと同様)
シェルスクリプトとスクリプト言語の使用
タスクの実行について考えるとき、管理者はよく自問します。シェルスクリプト、またはPerl、Ruby、Pythonなどのスクリプト言語を使用する必要がありますか?
ここには決まったルールはありません。シェルとスクリプト言語の間には、典型的な違いしかありません。
シェル
Shellを使用すると、Linuxオペレーティングシステムでsed、grep、tee、catなどのLinuxコマンドやその他すべてのコマンドラインベースのユーティリティを使用できます。実際、ほとんどすべてのコマンドラインLinuxユーティリティをシェルでスクリプト化できます。
シェルを使用する良い例は、DNS解決のためにホストのリストをチェックする簡単なスクリプトです。
DNS名をチェックするための簡単なBashスクリプト-
#!/bin/bash
for name in $(cat $1);
do
host $name.$2 | grep "has address"
done
exit
DNS解決をテストするための小さなワードリスト-
dns
www
test
dev
mail
rdp
remote
google.comドメインに対する出力-
[rdc@centos ~]$ ./dns-check.sh dns-names.txt google.com
-doing dns
dns.google.com has address 172.217.6.46
-doing www
www.google.com has address 172.217.6.36
-doing test
-doing dev
-doing mail
googlemail.l.google.com has address 172.217.6.37
-doing rdp
-doing remote
[rdc@centos ~]$
シェルで単純なLinuxコマンドを利用して、単語リストからDNS名を監査する単純な5行のスクリプトを作成することができました。これは、適切に実装されたDNSライブラリを使用している場合でも、Perl、Python、またはRubyではかなりの時間がかかります。
スクリプト言語
スクリプト言語を使用すると、シェルの外部をより細かく制御できます。上記のBashスクリプトは、Linuxホストコマンドのラッパーを使用していました。もっと多くのことをして、ホストのような独自のアプリケーションをシェルの外部で相互作用させたい場合はどうなりますか?ここで、スクリプト言語を使用します。
また、高度に維持されたスクリプト言語を使用すると、ほとんどの場合、アクションがさまざまなシステムで機能することがわかります。たとえば、Python 3.5は、同じライブラリがインストールされたPython3.5を実行している他のシステムで動作します。LinuxとHP-UXの両方でBASHスクリプトを実行する場合は、そうではありません。
スクリプト言語と強力なシェルの間の境界線がぼやけることがあります。Python、Perl、またはRubyを使用してCentOSLinux管理タスクを自動化することができます。そうすることは本当にごく当たり前のことです。また、裕福なシェルスクリプト開発者は、Bashでシンプルでありながら機能的なWebサーバーデーモンを作成しました。
スクリプト言語とシェルでのタスクの自動化の経験があるCentOS管理者は、問題を解決する必要があるときにどこから始めればよいかをすばやく判断できます。シェルスクリプトを使用してプロジェクトを開始することは非常に一般的です。次に、プロジェクトがより複雑になるにつれて、スクリプト(またはコンパイル)言語に進みます。
また、プロジェクトのさまざまな部分にスクリプト言語とシェルスクリプトの両方を使用することもできます。例としては、WebサイトをスクレイプするPerlスクリプトがあります。次に、シェルスクリプトを使用して、sed、awk、およびegrepを使用して解析およびフォーマットします。最後に、PHPスクリプトを使用して、WebGUIを使用してフォーマットされたデータをMySQLデータベースに挿入します。
シェルの背後にあるいくつかの理論を使用して、CentOSのBashシェルからタスクを自動化するための基本的な構成要素から始めましょう。
入出力とリダイレクト
別のコマンドへのstdoutの処理-
[rdc@centos ~]$ cat ~/output.txt | wc -l
6039
[rdc@centos ~]$
上記では、パイプ文字で処理するためにcat'sstoudをwcに渡しました。次に、wcはcatからの出力を処理し、output.txtの行数を端末に出力します。パイプ文字は、次のコマンドで処理される、あるコマンドからの出力を渡す「パイプ」と考えてください。
以下は、コマンドリダイレクトを処理するときに覚えておくべき重要な概念です。
数 | ファイル記述子 | キャラクター |
---|---|---|
0 | 標準入力 | < |
1 | 標準出力 | >> |
2 | 標準誤差 | |
stdoutを追加 | >> | |
リダイレクトを割り当てる | & | |
stdoutをstdinにパイプします | | |
これについては、リダイレクトやリダイレクトの割り当てについてあまり話さずに、第1章で紹介しました。Linuxでターミナルを開くと、シェルが-のデフォルトのターゲットとして表示されます。
- 標準入力<0
- 標準出力> 1
- 標準誤差2
これがどのように機能するか見てみましょう-
[rdc@centos ~]$ lsof -ap $BASHPID -d 0,1,2
COMMAND PID USER **FD** TYPE DEVICE SIZE/OFF NODE NAME
bash 13684 rdc **0u** CHR 136,0 0t0 3 /dev/pts/0
bash 13684 rdc **1u** CHR 136,0 0t0 3 /dev/pts/0
bash 13684 rdc **2u** CHR 136,0 0t0 3 /dev/pts/0
[rdc@centos ~]$
/ dev / pts / 0は疑似端末です。CentOS Linuxはこれを見て、シリアルインターフェイスを介してプラグインされたキーボードとディスプレイを備えた実際の端末のようなオープン端末アプリケーションを考えます。ただし、ハイパーバイザーがハードウェアをオペレーティングシステムに抽象化するように、/ dev / ptsは端末をアプリケーションに抽象化します。
上記のlsofコマンドから、FD3つのファイル記述子すべてが仮想端末(0,1,2)に設定されている列。これで、コマンドを送信できます。コマンドの出力と、コマンドに関連するエラーを確認してください。
以下は、STDINおよびSTDOUTの例です。
STDOUT
[root@centosLocal centos]# echo "I am coming from Standard output or STDOUT." >
output.txt && cat output.txt
I am coming from Standard output or STDOUT.
[root@centosLocal centos]#
stdoutとstderrの両方を別々のファイルに送信することも可能です-
bash-3.2# find / -name passwd 1> good.txt 2> err.txt
bash-3.2# cat good.txt
/etc/pam.d/passwd
/etc/passwd
bash-3.2# cat err.txt
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
bash-3.2#
ファイルシステム全体を検索すると、2つのエラーが発生しました。それぞれが後で閲覧するために別々のファイルに送信され、返された結果は別々のテキストファイルに配置されました。
stderrをテキストファイルに送信すると、アプリケーションのコンパイルなど、端末に大量のデータを出力する場合に役立ちます。これにより、端末のスクロールバック履歴から失われる可能性のあるエラーを精査できます。
STDOUTをテキストファイルに渡すときの1つの注意点は、 >> そして >。二重の「>>」はファイルに追加されますが、単数形はファイルを上書きして新しいコンテンツを書き込みます(したがって、以前のデータはすべて失われます)。
STDIN
[root@centosLocal centos]# cat < stdin.txt
Hello,
I am being read form Standard input, STDIN.
[root@centosLocal centos]#
上記のコマンドでは、テキストファイルstdin.txtがcatコマンドにリダイレクトされ、その内容がSTDOUTにエコーされました。
パイプ文字「|」
パイプ文字は、最初のコマンドからの出力を受け取り、それを入力として次のコマンドに渡し、2番目のコマンドが出力に対して操作を実行できるようにします。
それでは、猫の標準出力を別のコマンドに「パイプ」してみましょう-
[root@centosLocal centos]# cat output.txt | wc -l
2
[root@centosLocal centos]#
上記のwcは、パイプから渡されたcatからの出力に対して計算を実行します。以下からの出力をフィルタリングするときにパイプコマンドが特に有用であるのgrepまたはegrepの-
[root@centosLocal centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l
9000
[root@centosLocal centos]#
上記のコマンドでは、egrepフィルターを通過した65535からのすべての数値を含むテキストファイルから、4桁ごとの数値をwcに渡しました。
&を使用した出力のリダイレクト
出力は、を使用してリダイレクトできます &キャラクター。STDOUTとSTDERRの両方の出力を同じファイルに送信する場合は、次のように実行できます。
[root@centosLocal centos]# find / -name passwd > out.txt 2>&1
[root@centosLocal centos]# cat out.txt
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
/etc/passwd
[root@centosLocal centos]#
を使用したリダイレクト &文字は次のように機能します。最初に、出力はout.txtにリダイレクトされます。次に、STDERRまたはファイル記述子2が、STDOUTと同じ場所(この場合はout.txt)に再割り当てされます。
リダイレクトは非常に便利で、大きなテキストファイルの操作、ソースコードのコンパイル、シェルスクリプトでの出力のリダイレクト、複雑なLinuxコマンドの発行時に発生する問題を解決する際に役立ちます。
強力ですが、新しいCentOS管理者にとってリダイレクトは複雑になる可能性があります。Linuxフォーラム(Stack Overflow Linuxなど)への練習、調査、および時折の質問は、高度なソリューションの解決に役立ちます。
Bashシェルコンストラクト
Bashシェルがどのように機能するかについての良いアイデアが得られたので、スクリプトを書くために一般的に使用されるいくつかの基本的な構造を学びましょう。このセクションでは、以下について説明します。
- Variables
- Loops
- Conditionals
- ループ制御
- ファイルの読み取りと書き込み
- 基本的な数学演算
BASHトラブルシューティングのヒント
BASHは、専用のスクリプト言語と比較して少し注意が必要です。BASHスクリプトの最大のハングアップのいくつかは、シェルに渡されるスクリプト操作を誤ってエスケープするか、エスケープしないことによるものです。スクリプトを数回調べても期待どおりに機能しない場合は、心配しないでください。これは、BASHを使用して複雑なスクリプトを毎日作成する人にもよく見られます。
Googleをすばやく検索するか、専門家のLinuxフォーラムにサインアップして質問をすると、迅速な解決につながります。誰かが正確な問題に遭遇し、それがすでに解決されている可能性が非常に高いです。
BASHスクリプトは、管理タスクの自動化から便利なツールの作成まで、あらゆるものに対応する強力なスクリプトをすばやく作成するための優れた方法です。エキスパートレベルのBASHスクリプト開発者になるには、時間と練習が必要です。したがって、可能な限りBASHスクリプトを使用してください。これは、CentOS管理ツールボックスに含めるのに最適なツールです。