使用sudo权限运行单个命令的大多数pythonic方式

时间:2012-08-13 10:27:09

标签: python sudo

我有一个python脚本正在执行一些nagios配置。该脚本作为具有完全sudo权限的用户运行(用户可以使用sudo运行任何命令,无需密码提示)。配置的最后一步是:

open(NAGIOS_COMMAND_FILE, 'a').write(cmdline)

NAGIOS_COMMAND_FILE只能由root写入,因此该命令应该由root运行。我可以想到两种实现这一目标的方法(两者都不令人满意):

  1. 以root身份运行整个脚本。我不喜欢这样做,因为我的脚本中的任何错误都将以完全root权限执行。
  2. open(NAGIOS_COMMAND_FILE, 'a').write(cmdline)命令放在单独的脚本中,并使用subprocess库通过sudo调用该脚本。我不喜欢创建一个额外的脚本只是来运行一个命令。
  3. 我想在我当前的脚本中,没有办法在单个命令中更改正在运行的用户 ,或者我错了?

4 个答案:

答案 0 :(得分:1)

为什么不对拥有所有sudo权限的用户授予NAGIOS_COMMAND_FILE写入权限?

答案 1 :(得分:0)

从不,永远以root身份或具有完全sudo权限的用户身份运行Web服务器。这不是一个pythonic的事情,它是“让我的服务器免于被击中”的事情。

查看os.seteuid,“最小权限原则”和man sudoers,并将您的服务器作为常规“httpd-server”运行,其中“httpd-server”具有写入{{0}的sudoer权限1}}。然后确保你写入命令文件的内容尽可能干净。

答案 2 :(得分:0)

实际上可以为单个命令更改用户。 Fabric提供了一种以任何用户身份登录服务器的方法。我相信它依赖于ssh连接。因此,您可以使用python脚本中的其他用户连接到localhost并执行所需的命令。

http://docs.fabfile.org/en/1.4.3/api/core/decorators.html

无论如何,正如其他人已经预先确定的那样,最好允许运行脚本权限的用户执行这一命令,并避免依赖root执行。

答案 3 :(得分:0)

我同意上面的帖子,要么将您的用户写入NAGIOS_COMMAND_FILE写入权限,要么将该用途添加到具有这些权限的组中,例如nagcmd。