1

我知道我的问题不是很清楚,所以让我在这里尝试解释一下。

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

我的脚本:

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

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

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

Python 版本是2.7.3.

4

2 回答 2

3

假设您的 pm-suspend 在/usr/sbin/pm-suspend

让您的 sudoers 进入/etc/sudoers

<username> ALL=(ALL) NOPASSWD: /usr/sbin/pm-suspend
于 2012-06-19T18:05:45.677 回答
2

您可以使用 SetUID 位使脚本以文件所有者的权限运行。您可以通过将其所有者更改为 root 并设置其 SetUID 位来允许特定文件始终以 root 身份运行。设置 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 位,并配置您的系统以在需要时运行它而不是您的脚本。

于 2012-06-19T18:14:54.423 回答