Frage

Ich bin mit ssh in eine Kamera anmelden, scp einen Tarball über ihn und Extrahieren von Dateien aus dem tarbal und dann das Skript ausführen. Ich habe Probleme mit Pexpect, though. Pexpect mal aus, wenn der Tarball kopiert wird. Es scheint das nicht zu warten, bis es fertig ist. Und dann beginnen die die gleiche Sache mit dem untar Befehl tun, Der Code, den ich habe, ist unten:

    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

Kann mir jemand helfen, eine Lösung für diese finden?

Danke

War es hilfreich?

Lösung

Ich bin nicht sicher, ob dies richtig ist, aber ich würde versuchen, das Timeout auf None Einstellung:

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

Nach dem Quellcode, pexpect scheint nicht das Timeout zu überprüfen, wenn es den Satz zu None.

Wie auch immer, der Grund Ich beantworte das, obwohl ich bin mir nicht sicher, ob es das Problem löst, ist, dass ich wollte rel a href empfehlen die Verwendung von <= „http://www.lag.net/paramiko/“ = "nofollow noreferrer"> paramiko statt. Ich hatte eine gute Erfahrung, die es für die Kommunikation über SSH in der Vergangenheit verwendet wird.

Andere Tipps

Gibt es einen Grund, Ihre Verwendung pexpect oder sogar paramiko?

Wenn Sie ein Setup public / private Schlüssel dann können Sie nur als ein einziges Beispiel verwenden:

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

Dann gemäß dem Vorschlag über die Verwendung paramiko Befehle zu senden.

Sie die Schlüsseldatei für diese Verwendung können auch:

Die folgende Klassenmethode werden Sie eine persistente Sitzung (obwohl es nicht getestet ist):

#!/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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top