2010-12-01 26 views
0

conseiller à la bibliothèque de travailler avec SSH. L'exigence principale est un fonctionnement normal avec l'utilitaire sudo. J'ai déjà essayé et ce que je souffre:Libs pour travailler avec SSH

  • paramiko - ne peut pas sudo du tout, en essayant après un appel à servir dans le mot de passe STDIN, mais sudo écrit ce type alors: « Pas ttys actuel »
  • pxssh - mmmmmm, très lent, très lent, maladroit
  • tissu - peut seulement dans ce sudo est un monde idéal, car il est de travailler avec différents utilisateurs et où je dois envoyer le mot de passe?

Avez-vous des bibliothèques normales qui fonctionnent avec sudo, ou pas?

+0

Pouvez-vous reformuler votre question? 'sudo' et' ssh' sont deux choses différentes. Que cherchez-vous? –

+0

Tout ce que j'ai juste besoin de se connecter au serveur via SSH et faire n'importe quelle tâche d'un compte privilégié – Denis

Répondre

0

Vous pouvez configurer sudo pour travailler sans un vrai terminal avec réglage « requiretty ». De sudoers manuel:

Si défini, sudo ne fonctionnera que lorsque l'utilisateur est connecté à un vrai tty. Cela va interdire des choses comme "rsh somehost sudo ls" puisque rsh (1) n'attribue pas de tty à un . Parce qu'il est impossible de désactiver l'écho lorsqu'il n'y a pas présent TTY, certains sites peuvent souhaiter mettre ce drapeau pour empêcher un utilisateur d'entrer un mot de passe visible. Ce drapeau est désactivé par défaut.

Cela fonctionne pour moi avec paramiko. En fonction de ce que vous faites, vous pouvez également regarder quelque chose comme pexpect.

+0

Pourquoi ne pas allouer un TTY à la place? Voir le lien dans ma réponse. –

+0

@Andrew Aylett: pour l'automatisation, j'utilise SSH avec authentification par clé publique seulement, sudoers très restrictifs User_Alias ​​avec NOPASSWD (afin d'éviter les mots de passe en clair dans les scripts).Exiger une allocation de tty dans un environnement où je ne saisis jamais de mots de passe est une perte. –

0

J'ai eu le même problème avec pxssh au premier: il était extrêmement lent!
Voici une manière que je trouvais pour le faire fonctionner plus rapidement:

#!/usr/bin/python 

import pxssh 
import getpass 

try: 
    s = pxssh.pxssh() 
    s.PROMPT = "#" 
    hostname = raw_input('hostname: ') 
    username = raw_input('username: ') 
    password = getpass.getpass('password: ') 
    s.login(hostname, username, password, auto_prompt_reset=False) 
    s.sendline('ls') # run a command 
    s.prompt()    # match the prompt 
    print(s.before)  # print everything before the prompt. 
    s.sendline('ls -l /tmp') # run a command 
    s.prompt()    # match the prompt 
    print(s.before)  # print everything before the prompt. 
    s.logout() 
except pxssh.ExceptionPxssh as e: 
    print("pxssh failed on login.") 
    print(e) 

La partie clé est s.PROMPT = "#" et auto_prompt_reset=False dans s.login().
Cette méthode nécessite que vous connaissiez le modèle de l'invite (dans mon cas c'est "#", je pense que l'attribut PROMPT peut être défini sur une expression régulière).

0

J'ai aussi eu quelques problèmes avec la vitesse de connexion sur pxssh. J'ai essayé d'utiliser le code référencé ci-dessus, mais je voyais encore 10 secondes juste pour me connecter. L'utilisation de l'argument original_prompt a résolu le problème pour moi. Vous devez vous assurer de mettre l'original_prompt à ce que vous voyez quand vous avez d'abord ssh dans la machine, ce qui dans mon cas s'est terminé par '>'.

#!/usr/bin/env python 

from pexpect import pxssh 

host = 'hostname.domain' 
user = 'username' 
password = 'password' 

terminal = pxssh.pxssh() 
terminal.login(host, user, original_prompt='[>$]')