Allocation de Paramiko et Pseudo-tty
J'essaie D'utiliser Paramiko pour me connecter à un hôte distant et exécuter un certain nombre de substitutions de fichiers texte.
i, o, e = client.exec_command("perl -p -i -e 's/" + initial + "/"
+ replaced + "/g'" + conf);
certaines de ces commandes doivent être exécutées en tant que sudo, ce qui donne:
sudo: désolé, vous devez avoir un tty pour lancer la commande sudo
je peux forcer l'affectation pseudo-tty avec le commutateur-t et ssh.
est-il possible de faire la même chose avec paramiko?
4 réponses
je pense que vous voulez l' invoke_shell
méthode de l' SSHClient
object (j'aimerais donner une URL, mais le paramiko docs à lag.net sont des châssis lourd et ne veut pas me montrer une URL spécifique pour une place dans les docs) -- il vous donne un Channel
, sur lequel vous pouvez faire exec_command
et ainsi de suite, mais le fait à travers un pseudo-terminal (complet avec le type de terminal et le nombre de lignes et de colonnes!-) ce qui semble être ce que vous demandez.
en Fait c'est assez simple. Juste:
stdin, stdout, stderr = client.exec_command(command, get_pty=True)
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é en regardant quelques exemples en ligne... vous ne savez pas si sa le "droit" chemin.
selon la page de manuel sudo:
l'option-S (stdin) fait que sudo lit le mot de passe à partir de l'entrée standard au lieu du terminal. Le le mot de passe doit être suivi d'un caractère newline.
Vous pouvez écrire au stdin parce que c'est un objet file avec 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()