2017-06-15 45 views
3

一般來說,這是一個很好回答的問題。 Linux不允許非特權用戶降低PID的優點,並以root身份運行它自己的蠕蟲。sudo renice in python

這就是我的具體情況:我有一個用戶帳戶,管理幾個進程,它具有renice的無密碼sudo權限以及它使用的一些其他命令。我也有一個腳本,它是這個系統上所有用戶的常用入口點。該腳本既可以運行常規用戶程序,也可以運行特殊帳戶管理的進程。因此,如果腳本可以運行特定選項,則該腳本應該可以renice,但如果不能,則默默地失敗。

我有這種情況的代碼如下所示:

subprocess.Popen(["sudo", "renice", "-20", str(process.pid)], 
#    shell = True, 
       stdout = subprocess.DEVNULL, 
       stderr = subprocess.STDOUT) 

如果我有shell = True註釋掉進程得到了新的美好的事物,但如果我運行作爲非特權用戶,sudo踢出它的密碼提示並破壞我的終端輸出。擊鍵變得不可見,一切都變得愚蠢。如果我取消註釋shell = True,我沒有終端輸出。但是,即使我以root身份運行該進程,該進程也不會改變其良好性。

受損的終端輸出可能會下降到我正在使用的終端模擬器(還沒有嘗試與另一個),但我想合併這些行爲。無論如何,從sudo沉默,但如果用戶可以sudo成功,一個不錯的變化。

任何指針?

+1

我想(但不完全確定),這是因爲你沒有TTY。可能是這個問題:https://unix.stackexchange.com/questions/122616/why-do-i-need-a-tty-to-run-sudo-if-i-can-sudo-without-a-密碼 - 嘗試創建一個PTY(https://stackoverflow.com/a/43012138/116546),看看這是否有幫助。 – drdaeman

+1

你懂了!我使用的是3.x,所以如果在'Popen'中添加'start_new_session = True',那麼對於非特權用戶就會失敗並以root身份成功,所以我認爲它對於我的無密碼'sudo'用戶來說也可以。歡呼。如果您希望我接受它,請隨時發佈答案。 =) – musasabi

回答

2

我認爲這是因爲sudo requires a TTY,即使密碼不是必需的。

嘗試提供一個:

import os 
import pty 
import subprocess 

master, slave = pty.openpty() 
p = subprocess.Popen(
    ["sudo", "id", "-a"], 
    stdin=slave, stdout=slave, stderr=slave 
) 
os.close(slave) 

output = os.read(master, 1026) 
os.close(master) 
print(output) 

上面的代碼應打印像uid=0(root) gid=0(root) groups=0(root)。如果是這樣,那麼用renice替換id,刪除不必要的os.read,你應該很好。

更新:在OP的情況下,它因爲另一個原因失敗了。如果將start_new_session=True添加到Popen,它會以無提示的用戶身份無提示並以root身份成功運行。

+1

差不多。我使用了'Popen'參數,但是你的初始評論讓我想到了我的答案。非常感謝。 =) – musasabi