2012-08-13 65 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。