![如何抑制su身份验证失败警告?](https://linux22.com/image/26112/%E5%A6%82%E4%BD%95%E6%8A%91%E5%88%B6su%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E5%A4%B1%E8%B4%A5%E8%AD%A6%E5%91%8A%EF%BC%9F.png)
我创建了一个帐户“ 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)