问题描述
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"
正常运行并且:
-
不创建任何包含密码的文件
-
允许用户为多个共享(包括 Windows 共享)仅输入一个密码
-
无需授予额外权限。:-)
第三种办法
执行此命令不需要 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=*