2010-05-26 5 views
20

J'essaie d'utiliser Paramiko pour se connecter à un hôte distant et exécuter un certain nombre de substitutions de fichiers texte.Paramiko et l'allocation de pseudo-tty

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

Certaines de ces commandes doivent être exécutées comme sudo, qui se traduit par:

sudo: désolé, vous devez avoir un téléscripteur pour course sudo

Je peux forcer allocation pseudo-tty avec l'option -t et ssh.

Est-il possible de faire la même chose avec paramiko?

Répondre

14

Je pense que vous voulez que la méthode invoke_shell de l'objet SSHClient (j'aimerais donner une URL, mais les docs paramiko à lag.net sont lourds et cadre tout simplement pas me montrer une URL spécifique pour un point donné dans le docs) - il vous donne un Channel, sur lequel vous pouvez faire exec_command et similaires, mais cela à travers un pseudo-terminal (complet avec le type de terminal et le nombre de lignes et de colonnes! -) qui semble être ce que vous êtes Demander.

+4

Un lien directe sans cadre: http://www.lag.net/paramiko/docs/paramiko.SSHClient-class.html#invoke_shell. – tzot

+0

Tx, beaucoup mieux. –

22

Le code suivant fonctionne pour moi:

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

C'était juste assemblé de regarder quelques exemples en ligne ... ne sais pas si c'est la « bonne ».

+2

Cette réponse a fonctionné pour moi quand la réponse acceptée n'a pas. Je vous remercie! – chown

5

Selon la page de sudo:

L'option -S (stdin) provoque sudo pour lire le mot de passe depuis l'entrée standard à la place du dispositif terminal. Le mot de passe doit être suivi d'un caractère de retour à la ligne.

Vous pouvez écrire à stdin car il est un objet de fichier avec écriture():

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

Cela a très bien fonctionné pour moi et d'autres suggestions n'ont pas. –

32

En fait, il est tout à fait simple. Just:

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

Voilà la bonne réponse. Le drapeau get_pty fait la même chose (voir exec_command du client) – Tom

+0

Merci d'avoir sauvé ma journée :-) – shizhz

+0

a bien fonctionné pour moi :-) – Tomas

Questions connexes