如何在需要sudo的bash脚本中只输入一次密码
数据
- 我希望这台机器上的操作员用户安装自己的cifs共享
-
sudoers
文件已包含所有运算符的/bin/mount -t cifs //*/* /media/* -o username=*
命令 - 我希望用户通过脚本只安装一次密码来安装
cifs
共享,而不是两次。 - sudo密码和cifs密码是相同的。
我已经拥有的东西
这个脚本有效:
#!/bin/bash sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
… 但它要求用户输入两次相同的密码!
- 一次为
sudo
- 一旦为山本身
这也有效:
#!/bin/bash echo -n Password: read -s szPassword echo $szPassword | sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
… 但这需要我允许所有操作员用户能够sudo sh
(主要安全问题)
题
*如何在bash¹ 中挂载cifs共享而不将sh
放入sudoers
文件中, 也不创建永久/临时文件??? *
注1:没有python,perl,C,Go,…请?
注意2:我知道我可以通过sudoers
文件删除密码,但我试图在不放弃便利的情况下加强安全性……
您应该让用户执行使用sudo作为sudo script
的调用。 只检查脚本是否以root身份运行,如果没有请求它
if [[ $EUID -ne 0 ]]; then echo "This script must be run as root, use sudo "$0" instead" 1>&2 exit 1 fi
不要尝试捕获用户的密码。
我笨蛋!
以下脚本:
#!/bin/bash read -p "Password: " -s szPassword printf "%s\n" "$szPassword" | sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"
只是工作和:
- 不创建任何包含密码的文件
- 允许用户只为多个共享键入一个密码(包括Windows共享)
- 无需额外的特权即可获得。 🙂
执行此命令时不需要sudo
密码; mount
的密码提示仍然存在。
在sudoers
,包括类似的东西
ALL ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
包含此内容后, sudo
将不再要求输入此特定命令的密码; 用户仍需要为mount
命令提供密码。
注意 :我从问题中包含的内容逐字记录命令; 我没有检查它的通配符是否允许用户做一些令人讨厌的事情。 阅读sudoers
联机帮助页以获取肮脏的例子。 特别要注意, sudoers
中的这一行允许用户添加任意数量的-o
开关或其他参数来mount
。 您可能想要重新考虑您的方法,例如通过添加诸如@Braiam建议的脚本并允许通过sudo
运行该脚本而无需额外的身份validation。 然后,该脚本确保用户只能运行您希望它们运行的特定mount
forms。
此外,不是允许所有用户使用此function,您也可以将此限制为某个组的成员,例如,您可以创建组cifsmount
然后
%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
这些问题的一般解决方案是将以下序言放在需要脚本的sudo顶部:
#!/bin/bash case $EUID in 0) : cool we are already root - fall through ;; *) # not root, become root for the rest of this session # (and ask for the sudo password only once) sudo $0 "$@" ;; esac # now the present process is effective-UID (root) # so there's no need to put sudo in front of commands any more commands here will run as superuser ...
显然,这有一个缺点,如果脚本中的某些命令不需要运行sudo
,那么这里有一个不必要的特权提升。
无论如何,我想我会分享这个小小的提示。 关于它的最好的事情是,如果你已经有效-uid root(例如,如果你已经在sudo下调用它)它优雅地做正确的事情。 同时给出错误并强制您重新键入/重新运行(使用sudo)不太友好。
您可能还想查看man 5 sudoers
的timestamp_timeout
变量,该变量告诉sudo
在有限的几分钟内记住用户凭证(并且可以是小数)。