2011-11-06 104 views
5

我正在編寫一個簡單的腳本,用於重新啓動hadoop從站。在腳本中,我必須以root用戶身份進行一些初始更改。之後,我必須更改爲用戶「hadoop」並執行一組命令。我使用os.system來運行命令,但我懷疑它是否工作正常。例如:在python中更改用戶

uid=pwd.getpwnam('hadoop')[2] 
os.setuid(uid) 
os.system('whoami') 
os.chdir('/home/hadoop/hadoop/') 
os.system('bin/hadoop-daemon.sh stop tasktracker') 

我同樣有此之後執行一些命令爲根,再次成爲用戶「的hadoop」,執行:

os.system('bin/hadoop-daemon.sh stop tasktracker') 

我這裏有三個問題,

  1. os.system是我可以用來發布linux命令的最佳命令嗎?

  2. 我可以通過上面的命令從root用戶更改爲用戶hadoop,但我無法更改爲root用戶(我可以理解,如果他們允許這樣會存在安全問題,我想知道是否存在任何可能做到這一點,至少通過傳遞密碼)?

  3. os.setuid()是否工作? whoami打印用戶hadoop但進程「tasktracker」不停止使用這些命令,但如果我手動執行相同的命令,它工作正常(手動嘗試它時,我使用「su hadoop」而不是setuid)。

感謝您的幫助。

  • Sethu

回答

6

你可以使用:

os.system('sudo -u hadoop bin/hadoop-daemon.sh stop tasktracker') 

,或者如果你沒有sudo的,但有蘇

os.system('su hadoop -c "bin/hadoop-daemon.sh stop tasktracker"') 
+0

Mike,我必須以hadoop用戶身份運行這些命令,但還有其他命令需要以root用戶身份運行。但實際上,在使用sudo時,系統會提示我們輸入密碼嗎? – sethu

+0

如果root用戶運行python腳本,所有命令都應該以root身份執行,「sudo -u hadoop ....」運行一個命令,就像您是指定用戶一樣,並且因爲您以root身份運行該命令,應該有沒有密碼提示。 – Mike

+0

有關如何使用** subprocess **執行此操作,請參閱https://stackoverflow.com/questions/1770209/run-child-processes-as-different-user-from-a-long-running-process/6037494# 6037494 –

1

它是一種更好的主意用「ス」比使用os.setuid切換用戶ID ()。

爲什麼?

  • 「蘇」將設置正確的登錄憑據,包括組ID和補充組
  • 「蘇」也將做其他有用的東西,比如設置環境變量(特別是如果你使用su - )。也許它會根據limits.conf設置ulimit限制。