su認証失敗警告を抑制する方法は?

su認証失敗警告を抑制する方法は?

''アカウントを作成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そのすべての出力をパイピングしていると推論しましたstderrsu最初の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関数を作成しました。このフォーラムの投稿(私のコーディングスタイルとより良い変数の命名に合わせて修正されました。)

おすすめ記事