
目標:Linuxユーザー名、パスワード最後の変更、パスワードの有効期限を人間が読める形式で出力します。
シェルを使用してユーザーからユーザー情報を抽出しました/etc/passwd
。/etc/shadow
/bin/bash
join -1 1 -2 1 -t : /etc/passwd /etc/shadow |grep bin/bash|awk -F\: '{print $1";"$9";$14}'
where
$1 = username
$9 = number of days since last password change, calculated from 1/1_1970
$14 = number of days to password expiry date, calculated from 1/1_1970
現在の日付に対して9ドルまたは14ドルのような数字を得ることができます。
expr $(date +%S) /86400
Q: 現在の行で、$9-$(date +%s)/86400 と $14-$(date +%s)/86400 の値をどのように出力しますか?
答え1
フィールド 8 には/etc/shadow
「パスワードの有効期限」は含まれていませんが、man shadow
Linux の場合は次のようになります。
アカウントの有効期限
1970年1月1日以降の日数で表示されるアカウントの有効期限。アカウントの有効期限はパスワードの有効期限とは異なることに注意してください。 。 。空のフィールドは、アカウントが期限切れにならないことを意味します。
「パスワードの有効期限」が必要ですか、または「アカウントの有効期限」が必要ですか?
あなたの質問に対するjoin
さらなる評価のために、すべての「シャドウ」フィールドが6つずつ移動されました。このgrep
コマンドは必要ありませんawk
。次のセリフのいずれかを適用してみてください。
join -1 1 -2 1 -t : /etc/passwd /etc/shadow | awk -F: -v"TD=$(date +%s)" 'BEGIN {TD = TD / 86400} $7 ~ /bash$/ {print $1, int($9-TD), $14?int($14-TD):"never"}' OFS=";"
user1;-1429;never
user2;-1429;never
答え2
使用方法echo
:
echo "$(($9-$(date +%s)/86400 ))"
$((...))
算術拡張です。
...
in を使用すると、$((...))
算術式として解釈されます。たとえば、16進文字列は数値として解釈され、10進数に変換されます。その後、式全体が式が評価される数値に置き換えられます。
$((...))
シェルの単語分割とファイル名のワイルドカードの影響を受けないように、引用符で囲む必要があります。
または
echo "$9-$(date +%s)/86400" | bc
bc
数学演算を処理できる基本的な計算機を表します。