使用sudo
时是否有办法捕获/捕获无效密码?基本上,如果sudo
密码无效,我想返回特定的退出代码。我不想避免sudo
或绕过它,我只是想在我选择的情况下关闭/退出脚本。
答案 0 :(得分:1)
基于sudo(8)的手册页,没有简单的方法来评估失败的确切错误原因:
退出值
成功执行程序后,sudo的退出状态将会出现 只是执行程序的退出状态。
否则,如果存在,则sudo以值1退出 配置/权限问题或者如果sudo无法执行给定的 命令。在后一种情况下,错误字符串被打印到 标准错误。如果sudo不能stat(2)中的一个或多个条目 用户的PATH,在stderr上打印错误。 (如果目录没有 存在或者如果它不是真正的目录,则忽略该条目而不是 打印错误。)这在正常情况下不应该发生。 stat(2)返回''权限被拒绝''的最常见原因是 如果你正在运行一个自动挂载程序和你的一个目录 PATH位于当前无法访问的计算机上。
我想到的唯一“丑陋”方法是解析stderr的结果以确定错误原因:
#!/bin/bash
tmpfile=`mktemp`
sudo echo "dummy" 2>$tmpfile
if [ $? == 1 ]; then
if [ `cat $tmpfile | grep -x "sudo.*incorrect password attempts" | wc -l` == 1 ]; then
# exit due to failed password attempts
echo "too many failed password attempts"
else
# other reason, for instance configuration
echo "other reason"
fi
fi
rm $tmpfile
但是,请注意,此方法不是升级安全的,而且还取决于语言:如果sudo的修补程序更改了在密码错误的情况下向用户显示的文本,或者用户以不同的方式登录语言,这种编码将无法正确处理。