以 root 身份运行脚本,无需密码

以 root 身份运行脚本,无需密码

我想运行一个不提示输入密码的脚本。我编辑了 /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

修复

  1. 确保/etc/sudoers该行仍然存在:

    jose ALL= NOPASSWD: /home/jose/sync.sh
    

    不要删除那行!

  2. 选修的:在脚本中,删除sudo每个命令前面的 s,例如:

    sed -i 's/^\(\s*\)sudo\s*/\1/g' /home/jose/sync.sh
    

    这不是必需的,但可以证明这一点。如果您希望能够以普通用户身份执行它,则可以保留文件原样,sudo /home/jose/sync.sh而无需输入密码。

  3. 使用以下命令运行脚本:

    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/pc1mount -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

相关内容