BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

Bashのシステム管理者ガイド

各取引には、その取引をマスターするツールが最も頻繁に使用されます。多くのシステム管理者にとって、そのツールは彼らのシェルです。 Linuxやその他のUnixライクなシステムの大部分では、デフォルトのシェルはBashです。

Bashはかなり古いプログラムであり、1980年代後半に開始されましたが、10年前のCシェル(csh)のように、はるかに古いシェルに基づいて構築されています。シェルの概念は非常に古いため、システム管理者やギャルの生活をはるかに楽にするために消費されるのを待っている膨大な量の不可解な知識があります。

基本のいくつかを見てみましょう。

ある時点で、ルートとして意図せずにコマンドを実行し、ある種の問題を引き起こしたのは誰ですか? 手を上げる

私たちの多くは、ある時点でその男やギャルだったと確信しています。非常に痛いです。もう一度その石にぶつからないようにするための非常に簡単なトリックをいくつか紹介します。

エイリアスを使用する

まず、 mvなどのコマンドのエイリアスを設定します およびrm mv -Iを指します およびrm -I 。これにより、rm -f /bootを実行することが確実になります 少なくとも確認を求めます。 Red Hat Enterprise Linuxでは、rootアカウントを使用すると、これらのエイリアスがデフォルトで設定されます。

通常のユーザーアカウントにもこれらのエイリアスを設定する場合は、これらの2行をホームディレクトリの.bashrcというファイルにドロップするだけです(これらはsudoでも機能します):

alias mv='mv -i'
alias rm='rm -i'
ルートプロンプトを目立たせる

事故を防ぐためにできるもう1つのことは、rootアカウントを使用していることを認識していることを確認することです。私は通常、ルートプロンプトを、通常の日常業務で使用するプロンプトから非常に目立たせることでそれを行います。

ルートのホームディレクトリにある.bashrcファイルに以下をドロップすると、黒地に赤のルートプロンプトが表示され、自分(または他の人)が慎重に踏む必要があることが明確になります。

export PS1="\[$(tput bold)$(tput setab 0)$(tput setaf 1)\]\u@\h:\w # \[$(tput sgr0)\]"

実際、できるだけrootにログインするのを控え、代わりにsudoを介してsysadminコマンドの大部分を実行する必要がありますが、それは別の話です。

ルートアカウントを使用することによる「意図しない副作用」を防ぐためのいくつかのマイナーなトリックを実装したので、Bashが日常業務で役立ついくつかの優れた点を見てみましょう。

履歴を管理する

Bashで上矢印キーを押すと、以前のコマンドのすべて(まあ、多く)を表示して再利用できることをおそらくご存知でしょう。これは、これらのコマンドがホームディレクトリの.bash_historyというファイルに保存されているためです。その履歴ファイルには、非常に便利な一連の設定とコマンドが付属しています。

まず、 historyと入力すると、最近のコマンド履歴全体を表示できます。 、または history 30と入力して、最後の30コマンドに制限することができます 。しかし、それはかなりバニラです。 Bashが何を保存し、どのように保存するかをより細かく制御できます。

たとえば、以下を.bashrcに追加すると、スペースで始まるコマンドは履歴リストに保存されません。

HISTCONTROL=ignorespace

これは、コマンドにプレーンテキストでパスワードを渡す必要がある場合に役立ちます。 (はい、それは恐ろしいことですが、それでも起こります。)

頻繁に実行されるコマンドを履歴に表示したくない場合は、次を使用します。

HISTCONTROL=ignorespace:erasedups

これにより、コマンドを使用するたびに、以前に発生したすべてのイベントが履歴ファイルから削除され、最後の呼び出しのみが履歴リストに保存されます。

私が特に気に入っている履歴設定は、 HISTTIMEFORMATです。 設定。これにより、履歴ファイル内のすべてのエントリの前にタイムスタンプが追加されます。たとえば、私は次を使用します:

HISTTIMEFORMAT="%F %T  "

history 5と入力すると 、次のような完全な情報が得られます:

1009  2018-06-11 22:34:38  cat /etc/hosts
1010  2018-06-11 22:34:40  echo $foo
1011  2018-06-11 22:34:42  echo $bar
1012  2018-06-11 22:34:44  ssh myhost
1013  2018-06-11 22:34:55  vim .bashrc

これにより、コマンド履歴を参照して、2日前にホームラボへのSSHトンネルを設定するために使用したコマンド履歴を見つけるのがはるかに簡単になります(これは何度も何度も忘れてしまいます…)。

ベストバッシュプラクティス

これを、Bashスクリプトを作成する際のベスト(または少なくとも、全知を主張しない)プラクティスのトップ11リストで締めくくります。

  1. Bashスクリプトは複雑になる可能性があり、コメントは安価です。コメントを追加するかどうか疑問に思う場合は、コメントを追加してください。週末の後に戻ってきて、先週の金曜日に何をしようとしていたかを理解するために時間を費やす必要がある場合は、コメントを追加するのを忘れていました。

  1. すべての変数名を${myvariable}のように中かっこで囲みます 。これを習慣にすると、${variable}_suffixのようなものになります 可能であり、スクリプト全体の一貫性が向上します。
  1. 式を評価するときにバッククォートを使用しないでください。 $()を使用する 代わりに構文。したがって、次を使用します。
    for  file in $(ls); do

    ない

    for  file in `ls`; do

    前者のオプションは、ネスト可能で、読みやすく、一般的なシステム管理者を満足させます。バックティックは使用しないでください。

  1. 一貫性は良好です。物事を行うスタイルを1つ選び、スクリプト全体でそれを守ります。明らかに、私は人々が $()を選んだ方がいいと思います バックティックに構文を適用し、変数を中括弧で囲みます。インデントにタブではなく2つまたは4つのスペースを使用する場合は、この方法をお勧めしますが、間違った方法を選択した場合でも、一貫して間違った方法で行ってください。
  1. Bashスクリプトに適切なシバンを使用します。 Bashでのみ実行することを目的としてBashスクリプトを作成しているため、ほとんどの場合、 #!/usr/bin/bashを使用します。 私のシバンとして。 #!/bin/shは使用しないでください または#!/usr/bin/sh 。スクリプトは実行されますが、互換モードで実行されます。意図しない副作用が多数発生する可能性があります。 (もちろん、互換モードが必要な場合を除きます。)
  1. 文字列を比較するときは、ifステートメントで変数を引用することをお勧めします。変数が空の場合、Bashは次のような行に対してエラーをスローするためです。
    if [ ${myvar} == "foo" ]; then
      echo "bar"
    fi

    そして、次のような行に対してfalseと評価されます:

    if [ "${myvar}" == "foo" ]; then
      echo "bar"
    fi  

    また、変数の内容がわからない場合(たとえば、ユーザー入力を解析している場合)、一部の特殊文字の解釈を防ぐために変数を引用し、空白が含まれている場合でも、変数が単一の単語と見なされるようにします。

  1. これは好みの問題だと思いますが、私は二重等号( ==)を使用することを好みます。 )Bashで文字列を比較する場合でも。これは一貫性の問題であり、文字列の比較の場合のみ、単一の等号が機能しますが、私の心はすぐに「単一の等号は代入演算子です!」と思います。
  1. 適切な終了コードを使用します。スクリプトが何かを実行できない場合は、失敗メッセージを書面でユーザーに提示し(できれば問題を修正する方法を使用して)、ゼロ以外の終了コードを送信してください。
    # we have failed
    echo "Process has failed to complete, you need to manually restart the whatchamacallit"
    exit 1

    これにより、さらに別のスクリプトからプログラムでスクリプトを呼び出して、正常に完了したことを確認するのが簡単になります。

  1. Bashの組み込みメカニズムを使用して、変数に適切なデフォルトを提供するか、定義する予定の変数が定義されていない場合はエラーをスローします。
    # this sets the value of $myvar to redhat, and prints 'redhat'
    echo ${myvar:=redhat}
    # this throws an error reading 'The variable myvar is undefined, dear reader' if $myvar is undefined
    ${myvar:?The variable myvar is undefined, dear reader}
  1. 特に大きなスクリプトを書いている場合、特にその大きなスクリプトを他の人と一緒に作業している場合は、 localの使用を検討してください。 関数内で変数を定義するときのキーワード。 local キーワードはローカル変数を作成します。これは、その関数内でのみ表示される変数です。これにより、変数が衝突する可能性が制限されます。
  1. すべてのシステム管理者は時々それを行う必要があります。データセンター内の実際のコンソールまたは仮想化プラットフォームを介した仮想コンソールのいずれかで、コンソール上で何かをデバッグします。スクリプトをそのようにデバッグする必要がある場合は、次のことを覚えておいてください。スクリプトの行を長くしすぎないでください。



    多くのシステムでは、コンソールのデフォルトの幅は80文字のままです。コンソールでスクリプトをデバッグする必要があり、そのスクリプトの行が非常に長い場合は、悲しいパンダになります。さらに、行が短いスクリプト(デフォルトは80文字のまま)は、通常のエディターでも読みやすく、理解しやすいものです。

私は本当にバッシュが大好きです。私はそれについて書いたり、仲間の愛好家と素敵なトリックを交換したりするのに何時間も費やすことができます。コメントにお気に入りをドロップしてください!


  1. 実際に使用する7つのBash履歴ショートカット

    Bash履歴ショートカットのほとんどのガイドには、利用可能なすべてのショートカットが網羅的にリストされています。それに関する問題は、私が一度ショートカットを使用し、それから私がすべての可能性を試したときに釉薬をかけることでした。それから私は仕事の日に移り、それらを完全に忘れて、有名な !!だけを残しました Bashを最初に使い始めたときに学んだトリック。 そのため、それらのほとんどはメモリにコミットされていませんでした。 この記事では、私が実際に使用するショートカットの概要を説明します。 毎日。これは私の本の内容の一部に基づいています。Bashを難しい方法で学ぶ; (詳細については、プ

  2. Mac での検索/閲覧履歴の消去に関する完全ガイド

    Mac で Safari、Google、または Firefox ブラウザーを使用して Web ページにアクセスし、検索ボックスの履歴、アクセスしたすべてのページの履歴など、すべてのアクティビティの足跡を残します。さらに、ブラウザーはキャッシュも読み込みます。 Cookie、画像など。これにより、次回同じページにアクセスしたときの読み込み時間が短縮されます。 ただし、ブラウザが Mac の検索履歴と閲覧履歴を記録して、他のユーザーがアクセスした Web サイトを知り、機密データにアクセスするのをブロックしたり、Mac のスペースを解放したりしたくない場合があります。それなら、この投稿はあなたに