我编写了一个脚本,用于执行各种系统任务,我会定期运行这些任务,但是我必须使用 sudo 来运行该脚本,尽管我拥有该脚本,因为它运行 root 特权命令。我如何添加 make sudo 来让我运行这个文件,而不必每次运行它时都输入密码?
我知道存在有关无需密码即可运行命令的问题,但我无法找到有关无需密码即可运行文件的问题。
我知道存在安全风险,但我在家里使用的是我信任的计算机。
我添加john ALL = NOPASSWD: /home/john/.script/hibernate.sh
到我的/etc/sudoers
但是在运行命令时sudo sh /home/john/.script/hibernate.sh
它仍然提示我输入密码......
答案1
用于visudo
安全的编辑环境来编辑 sudoers 文件。此脚本是一个包装器,vi
它还会在您保存文件时进行语法检查,并且不会让您用无效的 sudoers 文件覆盖有效的 sudoers 文件。
添加如下一行:
username ALL= NOPASSWD: /path/to/your/script
“ALL=” 需要做一些详细说明,它指定当相关用户从任何位置(本地(控制台或终端)或远程(ssh 等))登录时授予权限。
答案2
为了完整起见,您可以通过设置来实现类似的效果设置用户标识文件权限中的位。
稍微有点棘手的部分是,出于安全原因,setuid
内核会忽略脚本上的位,因此您需要用 C 语言编译一个小包装程序并使用它来调用您的脚本。将其保存为runscript.c
:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid( 0 );
system( "/path/to/script.sh" );
return 0;
}
然后使用以下方法编译
gcc runscript.c -o runscript
并setuid
在可执行文件上设置位:
sudo chown root:root runscript
sudo chmod 4755 runscript
确保您的脚本只能由 root 写入也很重要,因为可以修改脚本的任何人都可以执行任意程序:
sudo chown root:root /path/to/script.sh
sudo chmod 0711 /path/to/script.sh
这是我从中获取包装器程序代码的一篇文章:shell 脚本上的 setuid。
从安全角度来看,这两种方法(一种sudo
带有setuid
)都很糟糕,但在家用机器上可能还行。区别在于每一个系统中的用户将能够运行setuid
命令,即使不在sudoers
文件中。另外,显然,您不需要在命令前加上sudo
。
答案3
您需要“NOPASSWD”标签。
使用 visudo 并在文件末尾设置如下内容:
用户名 ALL=NOPASSWD: /bin/echo
将 username 替换为您的用户名,将 /bin/echo 替换为您要运行的命令。
答案4
您需要将正在运行的程序的完整路径添加到 sudoers 文件,而不是脚本。我假设它是 pm-hibernate,因此:
john ALL=NOPASSWD: /usr/sbin/pm-hibernate