在Sudo上捕获无效密码

时间:2016-05-19 19:51:59

标签: try-catch return-value sudo exit-code

使用sudo时是否有办法捕获/捕获无效密码?基本上,如果sudo密码无效,我想返回特定的退出代码。我不想避免sudo或绕过它,我只是想在我选择的情况下关闭/退出脚本。

1 个答案:

答案 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的修补程序更改了在密码错误的情况下向用户显示的文本,或者用户以不同的方式登录语言,这种编码将无法正确处理。