我正在编写一个脚本,如果以错误的方式运行,可能会有危险。作为一项安全功能,我希望该脚本要求用户首先重新输入密码,就像这样sudo
做一样。
那么我该怎么做呢?换句话说,我该怎么做
a)输入密码但不回显,
b) 验证密码,并
c)(为了获得加分)这样做不会将明文密码留在内存中,以便让一些聪明的家伙从 /proc 或类似的东西中抓取?
这是可行的,bash
但是如果更简单的话,任何其他标准 Linux shell 变体也可以。
答案1
尝试:
su $USER -c true
然后在$?中测试返回值。例如:
echo "Really delete everything? Enter your password to confirm:"
su $USER -c true && rm -rf $HOME
这true
只是无操作。
要抑制 su 的输出,你可以重定向 stderr:
echo -n "Enter password for $USER:"
su $USER -c true 2>/dev/null && echo -e "\nsuccess" || echo -e "\nfailure"
您不能省略 -c [command] 参数,因为这将创建一个新的 bash 交互式实例(无论您是否将其分组到子 shell 中):
$ ((su $USER ) && echo ok) ; echo "exit status:$?"
Password:
$ echo $SHLVL
2
$ exit
ok
exit status:0
$ echo $SHLVL
1
因此下面评论中的例子:
((su $USER >/dev/null 2>&1) && echo ok) || echo no
没有显示任何内容(除非 su 身份验证失败),因为使用正确的密码,您现在正在嵌套 shell 中工作(所有屏幕输出都重定向)。按 CTRL-D(退出 shell),您将看到回显“ok”。
答案2
我认为这里的最佳做法是通过更改文件权限/所有权来要求管理员权限来运行脚本。这样,您可以使用默认实现,而不必通过构建自定义密码检查功能来重新发明轮子(换句话说,您要求用户以 root 身份登录,在 sudoers 列表中并使用sudo
或使用su
成为 root)。
右键单击脚本,单击“属性”,然后单击“权限”选项卡以更改权限/所有权。或者使用chmod
/chown
来执行此操作(有关更多信息,请参阅手册页)。以 root 身份执行所有这些操作。