如何在没有密码的情况下使用sudo运行文件?

可能重复:
如何在没有密码的情况下使用sudo运行应用程序?

我已经创建了一个脚本来执行我经常运行的各种系统任务,但我必须使用sudo来运行脚本,尽管我拥有它因为它运行root特权命令。 如何添加make sudo让我运行这个文件,而不必每次运行时都输入密码?

我知道有关于在没有密码的情况下运行命令的问题,但是我无法在没有密码的情况下运行文件。

我知道安全风险,但我在家里使用我信任的计算机。

我添加了john ALL = NOPASSWD: /home/john/.script/hibernate.sh到我的/etc/sudoers但是当运行命令sudo sh /home/john/.script/hibernate.sh它仍然提示我输入密码。 ..

使用visudo进行安全编辑环境以编辑sudoers文件。 此脚本是vi的包装器,在保存文件时也会进行语法检查,并且不允许您使用无效的sudoers文件覆盖有效的sudoers文件。

像这样添加一行:

 username ALL= NOPASSWD: /path/to/your/script 

“ALL =”有一些详细说明,它指定当有问题的用户从本地(控制台或终端)或远程(ssh等)从任何位置登录时授予权限。

为了完整起见,您可以通过在文件的权限中设置setuid位来实现类似的效果。

一个稍微棘手的部分是,出于安全原因,内核会忽略脚本上的setuid位,因此您需要在C中编译一个小的包装程序并使用它来调用您的脚本。 将其保存为runscript.c

 #include  #include  #include  #include  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

你需要“NOPASSWD”标签。

使用visudo并在文件末尾设置这样的内容:

username ALL = NOPASSWD:/ bin / echo

将username替换为您的用户名,将/ bin / echo替换为您要运行的命令。

您需要将正在运行的程序的完整路径添加到sudoers文件,而不是脚本。 我假设它是pm-hibernate,所以:

 john ALL=NOPASSWD: /usr/sbin/pm-hibernate