当前位置: 首页>>技术教程>>正文


如何在需要 sudo 的 bash 脚本中仅输入一次密码

, ,

问题描述

Data

  • 我希望这台机器上的操作员用户安装他们自己的 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(重大安全问题)

Question

如何在 bash\xb9 中挂载 cifs 共享,而不将 sh 放入 sudoers 文件中,也不创建永久/临时文件???

注 1:请不要使用 python、perl、C、Go 等?\n注 2:我知道我可以通过 sudoers 文件删除密码,但我试图加强安全性,而不是放松安全性,同时又不放弃便利性……

最佳办法

您应该让用户使用 sudo as 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 中的这一行允许用户向 mount 添加任意数量的 -o 开关或其他参数。您可能需要重新考虑您的方法,例如通过添加 @Braiam 建议的脚本并允许通过 sudo 运行该脚本而无需额外的身份验证。然后,该脚本确保用户只能运行您希望他们运行的特定形式的 mount

此外,除了允许所有用户使用此功能外,您还可以将其限制为特定组的成员,例如,您可以创建一个组 cifsmount,然后

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14541.html,未经允许,请勿转载。