如何在需要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" 

只是工作和:

  1. 不创建任何包含密码的文件
  2. 允许用户只为多个共享键入一个密码(包括Windows共享)
  3. 无需额外的特权即可获得。 🙂

执行此命令时不需要sudo密码; mount的密码提示仍然存在。

sudoers ,包括类似的东西

 ALL ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=* 

包含此内容后, sudo将不再要求输入此特定命令的密码; 用户仍需要为mount命令提供密码。

注意 :我从问题中包含的内容逐字记录命令; 我没有检查它的通配符是否允许用户做一些令人讨厌的事情。 阅读sudoers联机帮助页以获取肮脏的例子。 特别要注意, sudoers中的这一行允许用户添加任意​​数量的-o开关或其他参数来mount 您可能想要重新考虑您的方法,例如通过添加诸如@Braiam建议的脚本并允许通过sudo运行该脚本而无需额外的身份validation。 然后,该脚本确保用户只能运行您希望它们运行的​​特定mountforms。

此外,不是允许所有用户使用此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 sudoerstimestamp_timeout变量,该变量告诉sudo在有限的几分钟内记住用户凭证(并且可以是小数)。