lines=$(grep '^[^:]\+::' /etc /shadow)
完全なコマンドはどういう意味ですか?
どういう意味ですか'^[^:]\+::'
?
私がif else
このように宣言した場合:
if [ "$lines" == "" ]; then
パスワードが空いているユーザー(私が望むもの)が表示されますか?
答え1
grep
/(したがって名前)でコマンドを実装するコマンドですg/<RE>/p
。つまり、与えられた正規表現(regexまたは減らしてregexp)に一致する行を印刷します。ed
ex
p
r
e
ここでは'^[^:]\+::'
正規表現です(シェルが一部の文字を特別に扱わないように引用符を使用)。より正確には(正規表現の実装が複数あり、ほとんどが正規表現grep
のさまざまなバリエーションを処理できるため)、これはGNU基本正規表現です。
正規表現は、文字列を一致させるために使用されるパターンです。grep
各行の内容をパターンと比較し、一致する項目を印刷します。
^
一致する文字列の先頭に一致するデフォルトの正規表現演算子。文字列の先頭に検索を固定すると言います。それ以外の場合、検索は行内のどこでも行われます。[^:]
すべての文字と一致しますが、:
\+
GNU固有の非標準正規表現演算子です(ただし、現在これをサポートする他の実装を見つけましたが)。これは、1つ以上の先行原子を意味する。これは標準の基本正規表現演算子の略語です\{1,\}
。:
特別ではなく、よく似合います。
だからここで正規表現は行と一致しますスタート:
後に2つの文字が続かない限り、1つ以上の文字を含むシーケンス:
。
の文脈では、/etc/shadow
これはエントリが3つ以上のフィールドと一致し、ユーザー名フィールドは空ではなくパスワードフィールドが空であることを意味します(通常、ユーザーはパスワードなしでログインできることを意味します)。root::
では一致しますx::whatever
が、root:x:
またはでは一致しませ::whatever
んroot:
。
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
分析してみましょう。
^[^:]\+
:
行の先頭から次の行までの部分、つまりユーザー名を探します。ユーザー名の後に
:
正規表現トークンで表される単一の文字.
(!
または*
)が続き、その後に:
。