我想运行一个不提示输入密码的脚本。我编辑了 /etc/sudoers 文件,并在最后一行后面写了几行。这是我的文件:
#
Defaults env_reset
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
#includedir /etc/sudoers.d
jose ALL= NOPASSWD: /sbin/shutdown -h now
jose ALL= NOPASSWD: /sbin/shutdown -r now
jose ALL= NOPASSWD: /home/jose/sync.sh
脚本代码(使用密码即可正常工作)是:
#!/bin/bash
#Filename: sync.sh
echo "Empezando sincronizar....."
ping -c 1 -t 1 172.18.2.100 > /dev/null 2> /dev/null # ping and discard output
if [ $? -eq 0 ]; then # check the exit code
echo "${ip} is up" # display the output
sudo mount -t smbfs //172.18.2.100/Downloads /home/jose/pc1
rsync -r -u -verbose /home/jose/pc1/movies/ /home/jose/Movies/
rsync -r -u -verbose /home/jose/pc1/series/ /home/jose/TV?Shows/
sudo umount /home/jose/pc1
# you could send this to a log file by using the >>pinglog.txt redirect
else
echo "${ip} is down"
fi
echo "Fin sincronizacion"
我可以不输入密码关机并重启,但当我尝试运行最后一行时,脚本提示输入密码。我将脚本路径替换为“ALL”,我可以不输入密码运行 root 命令,但无法运行 mount / umount 命令和脚本。
用户属于....
jose : jose adm dialout cdrom 软盘音频视频 plugdev 用户 lpadmin sambashare 管理员
有什么帮助吗?提前致谢。
答案1
修复
确保
/etc/sudoers
该行仍然存在:jose ALL= NOPASSWD: /home/jose/sync.sh
不要删除那行!
选修的:在脚本中,删除
sudo
每个命令前面的 s,例如:sed -i 's/^\(\s*\)sudo\s*/\1/g' /home/jose/sync.sh
这不是必需的,但可以证明这一点。如果您希望能够以普通用户身份执行它,则可以保留文件原样,
sudo /home/jose/sync.sh
而无需输入密码。使用以下命令运行脚本:
sudo /home/jose/sync.sh
sudo
将要不提示您输入密码。在调用脚本之前加上 sudo 非常重要。
还适用于安全原因在脚本上运行以下命令:
sudo chown root:root /home/jose/sync.sh
sudo chmod o-rwx /home/jose/sync.sh
这样,没有 root 密码,任何人都无法编辑您的脚本。这很重要,因为其他坐在您计算机上的人都可以免费且无需密码地以 root 身份执行命令。
问题
您这样做的问题在于,您授予使用 root 权限运行脚本的权限,但实际上并没有使用 以 root 身份运行它sudo
。
您以 root 身份运行的唯一命令是两个前面带有“sudo”的命令(当然是umount /home/jose/pc1
和mount -t smbfs //172.18.2.100/Downloads /home/jose/pc1
)。但这两个 mount 命令没有 root 权限(尽管pl1nk描述如何授予他们 root 权限他的回答),因为它们没有列在/etc/sudoers
可供NOPASSWD
用户使用的列表中jose
。
答案2
在 /etc/sudoers 中(请使用visudo
编辑) 添加:
jose ALL= NOPASSWD: /bin/mount
jose ALL= NOPASSWD: /bin/umount