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?

21
demandé sur Jon 2010-05-26 04:38:45

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.

14
répondu Alex Martelli 2010-05-26 02:24:46

en Fait c'est assez simple. Juste:

stdin, stdout, stderr = client.exec_command(command,  get_pty=True)
34
répondu Maciej Wawrzyńczuk 2015-02-03 22:58:57

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.

22
répondu David 2011-09-30 15:58:29

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()
5
répondu ksaylor11 2014-08-26 06:49:37