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

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

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

我编写了一个脚本,用于执行各种系统任务,我会定期运行这些任务,但是我必须使用 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

相关内容