在不使用sudo的情况下运行特定进程

时间:2012-06-19 18:02:55

标签: python linux sudo

我理解我的问题不是那么清楚,所以让我试着在这里解释一下。

我要做的是在完成某项任务后暂停我的电脑。

我的剧本:

#my logic or task(Downloading a file)#
cmd = shlex.split("sudo pm-suspend")
>>> subprocess.call(cmd)
[sudo] password for noob: 

正如您所看到的那样,它要求我输入密码,但问题是在脚本执行时我不会坐在我的系统上。

所以,我的问题是如何处理这个问题或者有什么其他替代方法来解决这个问题。

Python版本为2.7.3

2 个答案:

答案 0 :(得分:3)

假设您的下午暂停时间为/usr/sbin/pm-suspend

/etc/sudoers中输入你的sudoers:

<username> ALL=(ALL) NOPASSWD: /usr/sbin/pm-suspend

答案 1 :(得分:2)

您可以使用SetUID位使脚本以文件所有者的权限运行。您可以允许特定文件始终以root身份运行,方法是将其所有者更改为root并设置其SetUID位。设置SetUID位:

chmod 4755 <filename>

掩码:4000是SetUID,0700是所有者rwx,0050和0005是组和世界rx。

您必须确保所有者以外的用户无法编辑此文件,因为如果可以,他们将能够以您的用户身份运行任意命令,这会带来安全风险。

为了在您需要时有效,您还必须将文件所有者设置为root:

sudo chown root <filename>

在这种情况下,<filename>应该是您打算运行的任何脚本。它必须是可执行的 - 如果不是,即你试图运行一个未设置为独立执行的python程序,则需要使用启动它的包装器。

更多信息:http://en.wikipedia.org/wiki/Setuid

请注意,使用SetUID位存在许多安全风险。如果您需要澄清,请发表进一步的评论。

一位评论者指出,这很可能对shell脚本不起作用。您将需要使用一个包装器,它将从编译语言(如C或C ++)调用您的进程。

/* setuid_wrapper.cpp */
#include <unistd.h>

int main(int c, char * v[])
{
    // the program to execute
    // replace this with the program you want to call.
    const char * executable = "/bin/false";

    // arguments to pass to program
    // MUST be null terminated, MUST start with executable path
    const char * arguments[] = {executable, "arg1", "arg2", "etc...", NULL};

    execv(executable, arguments);
    perror("execv: ");
    return 1;
}

编译:

g++ -o setuid_wrapper setuid_wrapper.cpp

按照前面的说明将其所有者更改为root并设置SetUID位,并将系统配置为在需要时运行它而不是脚本。