''アカウントを作成diag
し、有効期限()になるように設定しましたusermod --expiredate 1
。その後、ログインするために実行したいスクリプトがあるので、スクリプトは次のものを使用します。
su -s /bin/bash - diag
出力は次のとおりです。
Your account has expired; please contact your system administrator
su: Authentication failure
(Ignored)
diag@computer:~$
これにより、期待どおりにアカウントを使用できるようになります。
期限切れのアカウントに関する警告である最初の3行を表示しないようにします。2> /dev/null
コマンドの最後に追加しようとしましたが、これはbashのすべての出力を抑制しました。コマンドを入力して結果を表示できる空の応答のみを受け取りましたが、bashプロンプトは表示されません。追加しようとしましたが、> /dev/null
何も機能しませんでした。
だから私は明らかにsu
そのすべての出力をパイピングしていると推論しましたstderr
。su
最初の3行だけを表示せず、アカウントが期限切れになっていないかのように正常に機能するにはどうすればよいですか?
答え1
私が知る限り、ユーザーアカウントの有効期限とロックは機能的に同じです。ログイン試行は失敗し、SSH試行は失敗します。少なくとも私が知っている限り、彼らは同じです。
したがって、私のスクリプトでは、ユーザーが期限切れかどうかを検出し、その場合はユーザーをロックし、有効期限を「無効」に設定します。
次のようになります。
# Takes 1 parameter, the username to check
# Returns 0 if the user is expired, or 1 if it is not expired.
function userExpired()
{
# These day values are just numbers, the number of days since the epoch.
local expireDay=`grep $1 /etc/shadow | cut -d: -f8`
# If diag has no expiration date, it will be empty.
if [[ "$expireDay" -eq "" ]] ; then
return 1
fi
local today=`perl -e 'print int(time/(60*60*24))'`
local daysUntilExpire=`echo $expireDay - $today | bc`
[[ $daysUntilExpire -lt 0 ]]
}
# Check if the diag user is expired and if so, lock and unexpire it.
userExpired diag && {
usermod --lock --expiredate -1 diag
}
次のコードに基づいてuserExpired関数を作成しました。このフォーラムの投稿(私のコーディングスタイルとより良い変数の命名に合わせて修正されました。)
答え2
stderrをstdoutにリダイレクトする
su -s /bin/bash - diag 2>&1 >/dev/null
まだ試していませんが、効果があると予想されます(自宅に到着するとすぐに更新される予定です)。
discard=$(su -s /bin/bash - diag)