2010-05-26 308 views
20

我試圖使用的paramiko連接到遠程主機並執行了一些文本文件替換。的paramiko和僞tty分配

i, o, e = client.exec_command("perl -p -i -e 's/" + initial + "/" 
           + replaced + "/g'" + conf); 

一些命令需要運行作爲sudo的,這會導致:

須藤:對不起,你必須有一個tty來 執行sudo

我可以強制使用-t開關和ssh進行僞tty分配。

是否有可能使用的paramiko做同樣的事情?

回答

14

我想你想的SSHClient對象的invoke_shell方法(我很樂意給一個網址,但在lag.net的的paramiko文檔是幀重,只是不會給我一個特定的URL在一個給定的點文檔) - 它給你一個Channel,可以在其上做exec_command之類的,但確實是通過一個僞終端(與終端類型和行數和列數完成 - !),這似乎是你在做什麼要求。

+4

直接無框鏈接:http://www.lag.net/paramiko/docs/paramiko.SSHClient-class.html#invoke_shell。 – tzot 2010-05-28 11:07:02

+0

Tx,好多了。 – 2010-05-28 14:39:47

22

下面的代碼對我的作品:

#!/usr/bin/env python 
import paramiko 

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('localhost',username='root',password='secret') 
chan = ssh.get_transport().open_session() 
chan.get_pty() 
chan.exec_command('tty') 
print(chan.recv(1024)) 

這只是從幾個例子看在線...不知道它是否「正確」的方式組裝。

+2

這個答案爲我工作時,接受的答案沒有。謝謝! – chown 2012-09-26 16:26:26

5

根據須藤手冊頁:

的-S(標準輸入)選項導致須藤讀取來自標準輸入,而不是終端裝置的密碼。密碼 後面必須跟一個換行符。

您可以寫信給標準輸入,因爲它是寫一個文件對象():

import paramiko 

client = paramiko.client.SSHClient() 
client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy()) 
client.connect(hostname='localhost', port=22, username='user', password='password') 
stdin, stdout, stderr = client.exec_command('sudo -S aptitude update') 
stdin.write('password\n') 
stdin.flush() 
# print the results 
print stdout.read() 
client.close() 
+0

這對我來說真的很好,其他建議沒有。 – 2017-06-28 15:22:31

32

其實這很簡單。只是:

stdin, stdout, stderr = client.exec_command(command, get_pty=True) 
+0

這是正確的答案。 get_pty標誌是做同樣的(見客戶端的exec_command) – Tom 2015-06-28 06:12:47

+0

謝謝你救了我的一天:-) – shizhz 2016-01-12 02:10:41

+0

爲我工作的偉大:-) – Tomas 2016-03-18 19:21:27