如何抑制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:~$

然后我就可以按照预期使用该帐户了。

我想抑制前三行,即有关过期帐户的警告。我尝试添加2> /dev/null到命令末尾,但这会抑制 bash 的所有输出;我只得到一个空白响应,我可以在其中键入命令并查看它们的结果,但我没有看到 bash 提示符。我尝试添加,> /dev/null但没有任何作用。

所以我推断显然su正在将其所有输出通过管道传输stderr。我怎样才能su只抑制前三行,但在其他方面正常运作,就好像帐户没有过期一样?

答案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)

相关内容