Question

J'utilise ssh pour se connecter à un appareil photo, scp un tarball vers et extraire les fichiers du Tarbal puis exécutez le script. Je rencontre des problèmes avec pexpect, cependant. fois pexpect lorsque le tarball est copié. Il semble de ne pas attendre jusqu'à ce qu'il soit fait. Et puis commencer à fait la même chose avec la commande décompressez, le code que j'ai est ci-dessous:

    ssh_newkey = 'Are you sure you want to continue connecting'          
    copy = pexpect.spawn('ssh service@10.10.10.10')
    i=copy.expect([ssh_newkey,'password:',pexpect.EOF])
    if i==0:
        copy.sendline('yes')
        i=copy.expect([ssh_newkey,'password:',pexpect.EOF])
    if i==1:        
        copy.sendline("service")
        print 'Password Accepted'
        copy.expect('service@user:')
        copy.sendline('su - root')
        i=copy.expect('Password:')
        copy.sendline('root')
        i=copy.expect('#')
        copy.sendline('cd /tmp')
        i=copy.expect("#")
        copy.sendline('scp user@20.20.20.20:/home/user/tarfile.tar.gz .')
        i=copy.expect([ssh_newkey,'password:',pexpect.EOF])
        if i==0:
            copy.sendline('yes')
            i=copy.expect([ssh_newkey,'password:',pexpect.EOF])
        else:
            pass
        copy.sendline('userpwd')
        i=copy.expect('#')
        copy.sendline('tar -zxvf tarfile.tar.gz bin/installer.sh')
        i=copy.expect("#")
        copy.sendline("setsid /tmp/bin/installer.sh /tmp/tarfile.tar.gz > /dev/null 2>&1 &")            
    elif i==2:
        print "I either got key or connection timeout"
    else:
        pass

Quelqu'un peut-il aider à trouver une solution pour cela?

Merci

Était-ce utile?

La solution

Je ne sais pas si cela est correct, mais je vais essayer de définir le délai à None:

copy = pexpect.spawn('ssh service@10.10.10.10', timeout=None)

Selon le code source, pexpect semble ne pas vérifier le délai d'attente quand il est mis à None.

Quoi qu'il en soit, la raison pour laquelle je répondre à cette même si je ne suis pas sûr que cela résout votre problème est que je voulais vous recommandons d'utiliser paramiko à la place. J'ai eu une bonne expérience de l'utiliser pour la communication via SSH dans le passé.

Autres conseils

Y at-il une raison pour laquelle votre utilisation de pexpect ou même paramiko?

si vous configurez un publique / clé privée alors vous pouvez simplement utiliser comme un seul exemple:

command = "scp user@20.20.20.20:/home/user/tarfile.tar.gz"
split_command = shlex.split(command)
subprocess.call(split_command)

Ensuite, selon la suggestion ci-dessus utilisent paramiko pour envoyer des commandes.

vous pouvez utiliser le fichier de clés pour cela aussi:

La méthode de classe suivante vous donnera une session persistante (bien qu'il soit non testé):

#!/usr/bin/python
# -*- coding: utf-8 -*-

from __future__ import print_function
import os
from paramiko import SSHClient, AutoAddPolicy, AuthenticationException, RSAKey
from subprocess import call

class CommsSuite(object):

    def __init__(self):
        self.ssh_client = SSHClient()

        #--------------------------------------

        def _session_send(command):
            """
             Use to send commands over ssh in a 'interactive_session'
             Verifies session is present
             If the interactive_session is not present then print the failed command.

             This may be updated to raise an error, 
             which would probably make more sense.

             @param command:  the command to send across as a string

             ::TODO:: consider raise exception here as failed 
                      session will most likely be fatal.

            """

            if self.session.send_ready():
                self.session.send("%s\n" % command)
            else:
                print("Session cannot send %s" % command)

        #--------------------------------------

        def _get_persistent_session(_timeout = 5):
            """
            connect to the host and establish an interactive session.

            @param _timeout: sets the timout to prevent blocking.

            """
            privatekeyfile = os.path.expanduser('~/.ssh/id_rsa')#this must point to your keyfile

            private_key = RSAKey.from_private_key_file(privatekeyfile)
            self.ssh_client.set_missing_host_key_policy(AutoAddPolicy())

            self.ssh_client.connect(hostname,
                                    username = <username>,
                                    pkey = private_key,
                                    timeout = _timeout)

            self.transport = self.ssh_client.get_transport()
            self.session = self.transport.open_session()
            self.session.exec_command("bash -s")

        _get_persistent_session()


        # build a comma seperated list of commands here as a string "[a,b,c]"
        commands = ["tar -zxvf tarfile.tar.gz bin/installer.sh", "setsid /tmp/bin/installer.sh /tmp/tarfile.tar.gz > /dev/null 2>&1"]
        # then run the list of commands
        if len(commands) > 0:
            for command in commands:
                _session_send(command)

        self.session.close()#close the session when done


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