2012-08-13 45 views
1

我有一个执行nagios配置的python脚本。该脚本以具有完整sudo权限的用户身份运行(用户可以使用sudo运行任何命令,而无需密码提示)。在配置的最后一步是这样的:使用sudo权限运行单个命令的绝大多数pythonic方式

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

NAGIOS_COMMAND_FILE的仅是通过根可写的,所以这个命令应该由root运行。我可以想到两种实现方法(两种都不尽如人意):

  1. 以root身份运行整个脚本。我不喜欢这样做,因为脚本中的任何错误都将以完全的根权限执行。
  2. open(NAGIOS_COMMAND_FILE, 'a').write(cmdline)命令放入单独的脚本中,并使用subprocess库通过sudo调用该脚本。我不喜欢创建一个额外的脚本只是运行一个命令。

我想没有改变运行的用户只是单个命令的方式,在我目前的剧本,还是我错了?

回答

1

为什么你不给NAGIOS_COMMAND_FILE的写入权限给具有所有sudo权限的用户?

+0

这是另一种选择,但我不想在系统配置文件中随意更改所有权,因为难以跟踪/复制(我的目标是能够轻松地将我的基础架构复制到其他服务器) 。如果无法将运行用户更改为单个命令,那么我宁愿以root身份运行整个脚本,而不是更改文件所有者。 – dangonfast 2012-08-13 10:37:04

+0

否则,您可以将您的配置写入临时文件,然后使用pexpect将其作为root用户移动到正确的位置。但它可能涉及将密码写入纯文件中...... – 2012-08-13 10:50:48

0

从来没有,有史以来运行一个Web服务器作为根或具有完整的sudo权限的用户。这不是一个pythonic的东西,它是一个“让我的服务器免受流氓”的东西。

os.seteuid,在“最小权限原则”,并man sudoers和运行服务器作为常规“的httpd服务器”,其中包含“httpd服务器”已经写信给NAGIOS_COMMAND_FILE sudoer许可。然后确保您写入命令文件的内容尽可能干净。

0

它实际上可以更改用户的单个命令。 Fabric提供了一种以任何用户身份登录到服务器的方式。它依靠我相信的SSH连接。所以你可以用你的python脚本中的不同用户连接到localhost并执行所需的命令。

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

不管怎么说,正如其他人已经一种高精度,最好是允许运行该脚本的权限来执行此一个命令,并避免依赖于根执行用户。

0

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