如何让我的脚本要求输入密码,比如 sudo?

spr*_*aff 6 linux unix bash passwords password-protection

我正在编写一个脚本,如果以错误的方式运行,它可能会很危险。作为一项安全功能,我希望脚本要求用户首先重新输入他们的密码,就像这样sudo做一样。

那么我该怎么做呢?换句话说,我如何

a) 输入密码而不回显,

b) 验证密码,以及

c)(为了奖励积分)这样做时不会将明文密码留在内存中,以便一些聪明的人从 /proc 或类似的东西中刮出来?

这是在,bash但如果这更容易的话,任何其他标准的 Linux shell 变体都可以。

win*_*ner 6

尝试:

su $USER -c true
Run Code Online (Sandbox Code Playgroud)

然后测试 $? 中的返回值。例如:

echo "Really delete everything? Enter your password to confirm:"
su $USER -c true && rm -rf $HOME
Run Code Online (Sandbox Code Playgroud)

true是有单独作为无操作。

要抑制 su 的输出,您可以重定向 stderr:

echo -n "Enter password for $USER:"
su $USER -c true 2>/dev/null  && echo -e "\nsuccess" || echo -e "\nfailure"
Run Code Online (Sandbox Code Playgroud)

您不能省略 -c [command] 参数,因为这将创建一个新的 bash 交互式实例(无论您是否将其分组到子外壳中):

$ ((su $USER ) && echo ok) ; echo "exit status:$?"
Password: 
$ echo $SHLVL 
2
$ exit
ok
exit status:0
$ echo $SHLVL 
1
Run Code Online (Sandbox Code Playgroud)

所以下面评论中的例子:

((su $USER >/dev/null 2>&1) && echo ok) || echo no
Run Code Online (Sandbox Code Playgroud)

没有显示任何内容(除非 su 身份验证失败),因为使用正确的密码,您现在正在嵌套的 shell 中工作(重定向所有屏幕输出)。按CTRL-D(退出shell),你会看到“ok”回显。

  • 很棒的解决方案!您可能希望将 su 的输出重定向到 `/dev/null` 以防止在密码错误的情况下输出“su: Authentication failure”。 (2认同)