Question

J'ai besoin de me connecter en SSH à un serveur, faire "Su Username" (sans mot de passe) pour exécuter certaines commandes comme cet utilisateur (qui n'ont pas de connexion directe dans SSH).

Du terminal, ce serait quelque chose comme ceci:

root@cs01:~# su foo
foo@cs01:/root$ cd
foo@cs01:~$ ls

J'ai essayé de le faire avec Paramiko (Python):

import paramiko
ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('host', username='root', password='mypassword', key_filename='<filename>')

stdin, stdout, stderr = ssh.exec_command('su foo')
print stdout.readlines()
stdin, stdout, stderr = ssh.exec_command('cd')
print stdout.readlines()
stdin, stdout, stderr = ssh.exec_command('pwd')
print stdout.readlines()
ssh.close()

Mais le script ne se termine pas.

Les journaux sont les suivants:

...
DEB [20111207-16:22:25.538] thr=1   paramiko.transport: userauth is OK
INF [20111207-16:22:25.921] thr=1   paramiko.transport: Authentication (publickey) successful!
DEB [20111207-16:22:25.923] thr=2   paramiko.transport: [chan 1] Max packet in: 34816 bytes
DEB [20111207-16:22:26.088] thr=1   paramiko.transport: [chan 1] Max packet out: 32768 bytes
INF [20111207-16:22:26.088] thr=1   paramiko.transport: Secsh channel 1 opened.
DEB [20111207-16:22:26.151] thr=1   paramiko.transport: [chan 1] Sesch channel 1 request ok

Si j'essaye seulement ceci:

stdin, stdout, stderr = ssh.exec_command('su foo')
#without print
stdin, stdout, stderr = ssh.exec_command('pwd')
print stdout.readlines()

Il exécute le PWD sous forme de racine, pas comme FOO.

Qu'est-ce qui ne va pas?

Était-ce utile?

La solution

Chaque exec_command() L'appel se produit dans un nouveau shell, il n'y a donc pas d'état reporté à partir des commandes précédentes. Si les commandes reposent sur une commande précédente à exécuter, vous devez les envoyer dans une seule instruction ou en tant que script. Si vous voulez un shell interactif, il y a le invoke_shell Commande, mais vous devez ensuite analyser la sortie du shell pour simuler une utilisation interactive (la bibliothèque PEXPECT peut être utilisée ici).

Vous pouvez utiliser le sudo commande, ou su -c Pour exécuter la commande .. cependant, je suggère de configurer une connexion sécurisée pour l'utilisateur nécessaire et de me connecter directement en tant qu'utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top