Linux-admin-shell-scripting

提供:Dev Guides
移動先:案内検索

Linux Admin-シェルスクリプト

Bash Shellの概要

GNU Linuxのフレーバーと同様に、シェルには多くの種類があり、互換性も異なります。 CentOSのデフォルトシェルは、BashまたはBourne Againシェルと呼ばれます。 Bashシェルは、Stephen Bourneによって開発されたBourne Shellの現代の修正版です。 Bashは、ケントンプソンとデニスリッチーによってベルラボで開発されたUnixオペレーティングシステム上のオリジナルのトンプソンシェルの直接の代替品でした(スティーブンボーンもベルラボで採用されました)

誰もがお気に入りのシェルを持ち、それぞれに長所と困難があります。 しかし、ほとんどの場合、BashはすべてのLinuxディストリビューションでデフォルトのシェルになり、最も一般的に利用可能になります。 経験があれば、誰もが自分に最適なシェルを探索して使用したいと思うでしょう。 しかし同時に、誰もがBashシェルをマスターしたいと思うでしょう。

その他のLinuxシェルには、Tcsh、Csh、Ksh、Zsh、およびFishが含まれます。

CentOS管理者にとって、エキスパートレベルでLinuxシェルを使用するスキルを開発することは非常に重要です。 前述したように、Windowsとは異なり、Linuxの中心はコマンドラインオペレーティングシステムです。 シェルは、管理者(またはユーザー)がオペレーティングシステムにコマンドを発行できるようにする単なるユーザーインターフェイスです。 Linuxシステム管理者が航空会社のパイロットである場合、シェルを使用することは、自動操縦から飛行機を離陸し、より操縦しやすい飛行のために手動制御をつかむことに似ています。

BashのようなLinuxシェルは、コンピューターサイエンス用語では「コマンドラインインタープリター」として知られています。 Microsoft Windowsには、DOS(元のDOSオペレーティングシステムと混同しないでください)およびPowerShellという2つのコマンドラインインタープリターもあります。

Bashのような最新のシェルは、より複雑な_shellスクリプト_が一般的なタスクと複雑なタスクの両方を自動化できるようにする*構造*を提供します。

コンストラクトには-

  • スクリプトフロー制御(ifthenおよびelse)
  • 論理比較演算(より大きい、より小さい、等しい)
  • ループ
  • 変数
  • 操作を定義するパラメーター(コマンド付きスイッチに似ています)

シェルスクリプトとスクリプト言語の使用

多くの場合、タスクの実行について考えるとき、管理者は次のことを自問します。シェルスクリプトまたはPerl、Ruby、Pythonなどのスクリプト言語を使用する必要がありますか?

ここには決まったルールはありません。 シェルとスクリプト言語の典型的な違いのみがあります。

シェル

シェルを使用すると、sed _、 grep tee cat_などのLinuxコマンド、および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 _host_コマンドのラッパーを使用しました。 シェルの外部と対話するために、もっと多くのことをして、_host_のような独自のアプリケーションを作成したい場合はどうでしょうか これは、スクリプト言語を使用する場所です。

また、高度に維持されたスクリプト言語を使用すると、ほとんどの場合、アクションが異なるシステム間で機能することがわかります。 たとえば、Python 3.5は、同じライブラリがインストールされたPython 3.5を実行している他のシステムで動作します。 そうではありません。LinuxとHP-UXの両方でBASHスクリプトを実行する場合。

スクリプト言語と強力なシェルの間の境界線があいまいになる場合があります。 Python、Perl、またはRubyを使用してCentOS Linux管理タスクを自動化することができます。 そうすることは実際に非常に一般的です。 また、豊かなシェルスクリプト開発者は、Bashでシンプルですが機能するWebサーバーデーモンを作成しました。

スクリプト言語とシェルでのタスクの自動化の経験により、CentOS管理者は問題を解決する必要があるときにどこから開始するかを迅速に決定できます。 シェルスクリプトを使用してプロジェクトを開始することは非常に一般的です。 次に、プロジェクトが複雑になるにつれて、スクリプト(またはコンパイル済み)言語に進みます。

また、プロジェクトのさまざまな部分にスクリプト言語とシェルスクリプトの両方を使用してもかまいません。 例としては、WebサイトをスクレイピングするPerlスクリプトがあります。 次に、シェルスクリプトを使用して、sed _、 awk_、および_egrep_を解析およびフォーマットします。 最後に、PHPスクリプトを使用して、Web GUIを使用してMySQLデータベースにフォーマット済みデータを挿入します。

シェルの背後にある理論を使って、CentOSのBashシェルからのタスクを自動化する基本的な構成要素から始めましょう。

入力出力とリダイレクト

別のコマンドへの標準出力の処理-

[rdc@centos ~]$ cat ~/output.txt | wc -l
6039
[rdc@centos ~]$

上記では、_cat_sstoud_を_wc_に渡して、_pipe_文字で処理しています。 _wc_は_cat_からの出力を処理し、output.txtの行カウントを端末に出力しました。 _pipe_文字は、次のコマンドで処理される1つのコマンドからの出力を渡す「パイプ」と考えてください。

以下は、コマンドのリダイレクトを扱うときに覚えておくべき重要な概念です-

Number File descriptor Character
0 standard input <
1 standard output >
2 standard error
append stdout >>
assign redirection &
pipe stdout into 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_コマンドから、 FD 列の下に3つのファイル記述子すべてが仮想端末(0,1,2)に設定されていることがわかります。 これで、コマンドを送信したり、コマンドの出力を確認したり、コマンドに関連するエラーを確認したりできます。

以下はSTDINと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_からの出力に対して計算を実行します。 pipeコマンドは、_grep_または_egrep_からの出力をフィルタリングする場合に特に便利です-

[root@centosLocal centos]# egrep "^[0-9]{4}$"/usr/dicts/nums | wc -l
9000
[root@centosLocal centos]#

上記のコマンドでは、_egrep_フィルターを介して渡された65535のすべての数値を含むテキストファイルから、_wc_に4桁ごとの数値を渡しました。

&による出力のリダイレクト

  • &*文字を使用して、出力をリダイレクトできます。 私たちは同じファイルに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 shell_がどのように機能するのかがよくわかったので、スクリプトを作成するために一般的に使用されるいくつかの基本的な構造を学びましょう。 このセクションでは、探索します-

  • リンク:/linux_admin/linux_admin_variables [変数]
  • リンク:/linux_admin/linux_admin_loops [ループ]
  • リンク:/linux_admin/linux_admin_conditionals [条件付き]
  • リンク:/linux_admin/linux_admin_loop_control [ループ制御]
  • リンク:/linux_admin/linux_admin_reading_and_writing_to_files [ファイルの読み取りと書き込み]
  • リンク:/linux_admin/linux_admin_basic_math_operations [基本的な数学演算]

BASHトラブルシューティングのヒント

BASHは、専用のスクリプト言語に比べて少し注意が必要です。 BASHスクリプトの最大のハングアップのいくつかは、シェルに渡されるスクリプト操作が誤ってエスケープされたり、エスケープされなかったりすることです。 スクリプトを数回見て、期待どおりに機能しない場合は、心配しないでください。 これは、BASHを使用して複雑なスクリプトを毎日作成する人でも一般的です。

Googleをすばやく検索するか、専門のLinuxフォーラムにサインアップして質問すると、迅速な解決につながります。 誰かが正確な問題に遭遇した可能性が非常に高く、すでに解決されています。

BASHスクリプティングは、管理タスクの自動化から便利なツールの作成に至るまで、すべての強力なスクリプトをすばやく作成するための優れた方法です。 エキスパートレベルのBASHスクリプト開発者になるには、時間と練習が必要です。 したがって、可能な限りBASHスクリプトを使用してください。これは、CentOS管理ツールボックスに含めるのに最適なツールです。