2015-01-10 87 views
-1

我是Python中的新手。我已經寫了一個腳本,用於在Ubuntu中查找某些文件,這需要訪問sudo,腳本未能顯示所需的輸出。這裏是我的腳本:在Python中插入Sudo密碼

import subprocess 

command_1 = "echo password".split() 
command_2 = "sudo -S find/-iname 'vlc.png'".split() 
file_open = open("find.log", "w") 

comm_1 = subprocess.Popen(command_1, stdout=subprocess.PIPE) 
subprocess.Popen(command_2, stdin=comm_1.stdout, stdout=file_open) 

該腳本,直到倒數第二行,因爲它顯示在標準輸出密碼。我猜測問題可能在最後一行。我已經嘗試了SE的其他解決方案,但沒有一個解決方案適用於我,除非使用shell = True,我不願意使用它。

我知道把密碼設置成純文本是一個非常糟糕的主意,但是當我學習時我只需要知道爲什麼我的代碼不工作。

編輯:

import subprocess 

command_1 = "echo password".split() 
command_2 = "sudo -S find/-iname 'vlc.png'".split() 
file_open = open("find.log", "w") 

print subprocess.Popen(command_1, stdout=subprocess.PIPE).communicate()[0] 

輸出:密碼

+0

無法重現。它不會輸出'password',而是'sudo:1不正確的密碼嘗試'。 –

+0

@Rawing:請檢查我的編輯。倒數第二個命令的標準輸出是密碼。 – heemayl

+0

如果使用'shell = False',你不應該在'vlc.png'附近引用引號。我懷疑這是你真正的問題,而整個'sudo'事業是一個紅鯡魚。 – tripleee

回答

0

它可能只是簡單的配置,從而不需要sudo密碼。我假設您的用戶名是user1,並且您希望user1可能在沒有密碼的情況下運行sudo find/-name vlc.png

(這只是一臺機器上運行,或者你希望其他人能夠輕鬆地在其計算機上運行呢?如果是後者,那麼我想我的回答並不能幫助。對不起!)

要做到這一點來看sudo visudo,這將安全地編輯相關的配置文件,並插入以此爲最後行的文件中:

user1 ALL=(ALL) NOPASSWD: sudo find/-name vlc.png 

這是一個相當典型的問題 - 你可以只搜索互聯網「sudo without passord」,你會發現其他網頁討論這個相同的解決方案。

(請注意,我已經刪除了-S標誌)

+0

的原始版本感謝@Aaron。我知道這個沒有密碼的sudo訪問,是的它是一個更好的解決方案。雖然我很好奇,但有什麼辦法可以按照我提到的方式來完成。 – heemayl

1

我建議使用sh包爲Python

from sh import sudo 

file = sudo.find("/", "-iname", "vlc.png") 
+0

從github鏈接:**如果您使用sudo,執行腳本的用戶必須爲用戶正在運行的任何命令設置NOPASSWD選項,否則sudo將掛起。**它與@Aaron提到的相同,也是不必要的以任何方式導入額外的模塊。 – heemayl

+0

@heemayl的確如此,但至少它會幫助你以更簡單易讀的方式與你的系統進行交互 – Urban48

0

的錯誤是你的最後一行的最後一點:

import subprocess 

command_1 = "echo password".split() 
command_2 = "sudo -S find/-iname 'vlc.png'".split() 
file_open = open("find.log", "w") 

comm_1 = subprocess.Popen(command_1, stdout=subprocess.PIPE) 
subprocess.Popen(command_2, stdin=comm_1.stdout, stdout=comm_1.stdout) 
               ^^^^^^^^^^^^^^^^^^^^^^^ 
               This is the problem 

您不應該在那裏有stdout=comm_1.stdout。我刪除它,它爲我工作,打印find輸出到終端。

也許你打算做stdout = file_open而不是?

+0

確切的說,我打算做的和做這件事並不能解決問題。對不起,錯字。 – heemayl

+0

可否請您刪除此答案,這可能會給問題提供錯誤的解釋。我修復了錯字。 – heemayl