我正在尝试允许特定用户运行其中包含的.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
并且这不会要求输入密码。
笔记:
由于您收到此错误,这意味着您没有从某种终端运行命令。如果它不要求输入密码,那么我认为这不会是一个问题。
sudoers 文件中命令的顺序很重要,它们会相互覆盖。这意味着如果你在文件中写入命令,然后会出现类似这样的内容:
%sudo ALL=(ALL:ALL) ALL
这将覆盖所有内容。因此,请将您的行放在 sudoers 文件的最后几行中。
使用此方法,您实际上可以删除文件内的 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