このコマンドはどういう意味ですか?

このコマンドはどういう意味ですか?
lines=$(grep '^[^:]\+::' /etc /shadow) 

完全なコマンドはどういう意味ですか?

どういう意味ですか'^[^:]\+::'

私がif elseこのように宣言した場合:

if [ "$lines" == "" ]; then 

パスワードが空いているユーザー(私が望むもの)が表示されますか?

答え1

grep/(したがって名前)でコマンドを実装するコマンドですg/<RE>/p。つまり、与えられた正規表現(regexまたは減らしてregexp)に一致する行を印刷します。edexpre

ここでは'^[^:]\+::'正規表現です(シェルが一部の文字を特別に扱わないように引用符を使用)。より正確には(正規表現の実装が複数あり、ほとんどが正規表現grepのさまざまなバリエーションを処理できるため)、これはGNU基本正規表現です。

正規表現は、文字列を一致させるために使用されるパターンです。grep各行の内容をパターンと比較し、一致する項目を印刷します。

  • ^一致する文字列の先頭に一致するデフォルトの正規表現演算子。文字列の先頭に検索を固定すると言います。それ以外の場合、検索は行内のどこでも行われます。

  • [^:]すべての文字と一致しますが、:

  • \+GNU固有の非標準正規表現演算子です(ただし、現在これをサポートする他の実装を見つけましたが)。これは、1つ以上の先行原子を意味する。これは標準の基本正規表現演算子の略語です\{1,\}

  • :特別ではなく、よく似合います。

だからここで正規表現は行と一致しますスタート:後に2つの文字が続かない限り、1つ以上の文字を含むシーケンス:

の文脈では、/etc/shadowこれはエントリが3つ以上のフィールドと一致し、ユーザー名フィールドは空ではなくパスワードフィールドが空であることを意味します(通常、ユーザーはパスワードなしでログインできることを意味します)。root::では一致しますx::whateverが、root:x:またはでは一致しませ::whateverroot:

grepまた、終了ステータスを介してどの行に一致するかを報告します。

  • 一致する項目が 1 つ以上ある場合、成功
  • それ以外の場合、失敗またはエラーが発生します。

シェルによって割り当てられた終了状態は、コマンド置換で実行された最後のコマンドの終了状態です。

たとえば、終了ステータス

var=$(exit 2)$(exit 4)

4になります。

ここでは、次のようにすることができます。

if lines=$(grep '^[^:]\+::' /etc/shadow); then
  printf 'There are users with an empty password:\n%s\n' "$lines"
else
  printf 'OK, no user with empty passwords'
fi

答え2

grep '^[^:]\+::' /etc/shadow正規表現パターンが正しくないため、何も表示されません。

システムアカウントに関連付けられたパスワードを持たないユーザーを見つけることができるようです。この場合は、次のようにします。

grep '^[^:]\+:.:' /etc/shadow

分析してみましょう。

  • ^[^:]\+:行の先頭から次の行までの部分、つまりユーザー名を探します。

  • ユーザー名の後に:正規表現トークンで表される単一の文字.!または*)が続き、その後に:

関連情報