2016-07-28 53 views
0

這裏是我的代碼:Python的子須藤返回錯誤:錯誤:「須藤:對不起,你必須有一個tty運行sudo的 n」]

import subprocess 

HOST = 'host_name' 
PORT = '111' 
USER = 'user_name' 
CMD = 'sudo su - ec2-user; ls' 

process = subprocess.Popen(['ssh','{}@{}'.format(USER, HOST), 
         '-p', PORT, CMD], 
         shell=False, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

result = process.stdout.readlines() 

if not result: 
    print "Im an error" 
    err = process.stderr.readlines() 
    print('ERROR: {}'.format(err)) 
else: 
    print "I'm a success" 
    print(result) 

當我運行此我收到以下輸出在我的終端:

dredbounds-computer: documents$ python terminal_test.py 
Im an error 
ERROR: ['sudo: sorry, you must have a tty to run sudo\n'] 

我已經試過許多東西,但我不斷收到這個錯誤「須藤:對不起,你必須有一個tty運行sudo的」。它工作正常,如果我只是通過終端手動執行,但我需要自動執行此操作。我讀過一個解決方法可能是在我的ssh調用中使用'-t'或'-tt',但是我還沒有能夠在子進程中成功實現這個功能(終端只是掛在我身上)。任何人都知道我可以如何修復我的代碼,或者解決這個問題?理想情況下,我想ssh,然後切換到sudo用戶,然後從那裏運行一個文件(我只是把ls用於測試目的)。

+0

爲什麼'須藤蘇 - EC2用戶; ls'而不只是'sudo -u ec2-user ls'? – miken32

回答

1

sudo提示您輸入密碼,但它需要一個終端來做到這一點。通過-t-tt提供遠程命令運行的終端,但現在它正在等待您輸入密碼。

process = subprocess.Popen(['ssh','-tt', '{}@{}'.format(USER, HOST), 
          '-p', PORT, CMD], 
          shell=False, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE, 
          stdin=subprocess.PIPE) 
process.stdin.write("password\r\n") 

請記住,雖然,ls不運行,直到su退出啓動的shell。您應該直接以ec2-user的身份登錄到計算機(如果可能),或者僅使用sudo先運行您想要的任何命令,而無需先通過su

+0

感謝您的回覆。我嘗試使用process.stdin.write(「密碼」),因爲你建議,但我得到︰ 「AttributeError:'NoneType'對象沒有屬性'寫'」 當我運行該。 – dredbound

+0

您是否通過'stdin = subprocess.PIPE'作爲參數? – chepner

+0

錯過了,但現在只是把我從控制檯帶回我的原始輸出。 「錯誤:['sudo:對不起,你必須有一個tty才能運行sudo \ n']」 – dredbound

0

您可以告訴sudo無需密碼即可工作。只需將其添加到遠程服務器host_name上的/etc/sudoers即可。

user ALL = (ec2-user) NOPASSWD: ls 

這允許命名user作爲ec2-user要執行的命令ls無需輸入密碼的用戶。

這是假設你改變你的命令看起來像這樣,這似乎更合理的對我說:

CMD = 'sudo -u ec2-user ls' 
相關問題