允许包含 sudo 的 shell 脚本运行

允许包含 sudo 的 shell 脚本运行

我正在尝试允许特定用户运行其中包含的.sh特定文件。sudo chmod

我已遵循以下指南:如何使用 sudoers 文件允许特定用户无需密码执行命令?

我的 sudoers 文件现在如下所示:

the_user ALL=(ALL:ALL) NOPASSWD: /var/www/html/storage/fix_cache_permissions.sh

但是,当我运行命令时:

sh /var/www/html/storage/fix_cache_permissions.sh

它因这个错误而死机:

sudo: no tty present and no askpass program specified

更新

我尝试在.sh文件内部和外部运行命令时都使用 sudo。两者都导致相同的错误消息。

答案1

您在这里遗漏了一些东西。 sudoers 文件引用了该sudo命令。 通过运行,您sh yourprogram.sh不是在使用该sudo命令,sh而是在使用随后将使用命令的命令sudo

因此,正确的方法是将脚本标记为可执行文件,以便用户可以编写

sudo /var/www/html/storage/fix_cache_permissions.sh

并且这不会要求输入密码。

笔记:

  1. 由于您收到此错误,这意味着您没有从某种终端运行命令。如果它不要求输入密码,那么我认为这不会是一个问题。

  2. sudoers 文件中命令的顺序很重要,它们会相互覆盖。这意味着如果你在文件中写入命令,然后会出现类似这样的内容:

    %sudo   ALL=(ALL:ALL) ALL
    

    这将覆盖所有内容。因此,请将您的行放在 sudoers 文件的最后几行中。

  3. 使用此方法,您实际上可以删除文件内的 sudo,因为所有脚本都将以 root 身份运行。

答案2

接受的答案指出您必须使用sudo系统的绝对文件路径。如果您有能力更改相关脚本,则可以添加以下内容:

if [[ "$(whoami)" != root ]]; then 
        sudo $(realpath $0)
        exit 
fi 

如果当前用户不是 root,这将使用 sudo 和绝对路径重新启动脚本。

实际上,这允许您调用脚本,sh /var/www/html/storage/fix_cache_permissions.sh甚至./fix_cache_permissions.sh

相关内容