2010-05-26 17 views
20

Sto provando ad usare Paramiko per connettersi ad un host remoto ed eseguire un numero di sostituzioni di file di testo.Paramiko e Pseudo-tty Allocation

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

Alcuni di questi comandi deve essere eseguito come sudo, che si traduce in:

sudo: mi dispiace, è necessario disporre di un terminale per sudo corsa

posso forzare allocazione pseudo-tty con l'opzione -t e ssh.

È possibile fare la stessa cosa con paramiko?

risposta

14

Penso che si desidera che il metodo dell'oggetto SSHClientinvoke_shell (mi piacerebbe dare un URL, ma la documentazione paramiko a lag.net sono frame-pesanti e proprio non mi mostrerà un URL specifico per un dato posto nella docs) - ti dà un Channel, sul quale puoi fare exec_command e simili, ma lo fa attraverso uno pseudo-terminale (completo di tipo di terminale e numeri di righe e colonne! -) che sembra essere quello che sei chiedere.

+4

Un link diretto frameless: http://www.lag.net/paramiko/docs/paramiko.SSHClient-class.html#invoke_shell. – tzot

+0

Tx, molto meglio. –

22

Il seguente codice funziona per me:

#!/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)) 

Questo è stato appena assemblato da guardare alcuni esempi on-line ... non so se è il modo "giusto".

+2

Questa risposta ha funzionato per me quando la risposta accettata non ha funzionato. Grazie! – chown

5

Secondo il man sudo:

L'opzione -S (stdin) causa sudo per leggere la password dall'input standard invece del dispositivo terminale. La password deve essere seguita da un carattere di nuova riga.

è possibile scrivere al stdin perché è un oggetto file con write():

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

Questo ha funzionato molto bene per me e altri suggerimenti no. –

32

In realtà è abbastanza semplice. Basta:

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

Questa è la risposta giusta. get_pty flag sta facendo lo stesso (vedi exec_command del client) – Tom

+0

Grazie per aver salvato la mia giornata :-) – shizhz

+0

ha funzionato alla grande per me :-) – Tomas

Problemi correlati