wake-up-neo.net

Führen Sie das lokale Python-Skript auf dem Remote-Server aus

Ich debugge ein Python-Skript, das auf meiner virtuellen Maschine ausgeführt werden muss. Ich ziehe es vor, die Skripts lokal zu bearbeiten (außerhalb von virtuellen Maschinen). Ich finde, es ist langweilig in scp geänderte Skripts für virtuelle Maschinen jedes Mal. Kann jemand einen wirksamen Weg vorschlagen?

Insbesondere frage ich mich, ob es möglich ist, Python-Skripts auf Remote-PVM auszuführen. Sowas in der Art:

python --remote [email protected] hello.py //**FAKED**, served to explain ONLY
24
qweruiop

Es ist möglich, ssh zu verwenden. Python akzeptiert Bindestrich (-) als Argument für die Ausführung der Standardeingabe.

cat hello.py | ssh [email protected] python -

Führen Sie python --help aus, um weitere Informationen zu erhalten.

44
asdfg

Obwohl diese Frage nicht ganz neu ist und eine Antwort bereits ausgewählt wurde, möchte ich einen anderen Ansatz von Nizza mitteilen.

Mit der paramiko library - einer reinen Python-Implementierung von SSH2 - kann Ihr Python-Skript über SSH eine Verbindung zu einem entfernten Host herstellen, sich selbst (!) Auf diesen Host kopieren und diese Kopie dann auf dem entfernten Host ausführen. Stdin, stdout und stderr des Remote-Prozesses sind in Ihrem lokalen ausgeführten Skript verfügbar. Diese Lösung ist also ziemlich unabhängig von einer IDE.

Auf meinem lokalen Computer führe ich das Skript mit dem Cmd-Line-Parameter 'deploy' aus, der die Remote-Ausführung auslöst. Ohne einen solchen Parameter wird der für den Remote-Host bestimmte Code ausgeführt.

import sys
import os

def main():
    print os.name

if __== '__main__':
    try:
        if sys.argv[1] == 'deploy':
            import paramiko

            # Connect to remote Host
            client = paramiko.SSHClient()
            client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
            client.connect('remote_hostname_or_IP', username='john', password='secret')

            # Setup sftp connection and transmit this script
            sftp = client.open_sftp()
            sftp.put(__file__, '/tmp/myscript.py')
            sftp.close()

            # Run the transmitted script remotely without args and show its output.
            # SSHClient.exec_command() returns the Tuple (stdin,stdout,stderr)
            stdout = client.exec_command('python /tmp/myscript.py')[1]
            for line in stdout:
                # Process each line in the remote output
                print line

            client.close()
            sys.exit(0)
    except IndexError:
        pass

    # No cmd-line args provided, run script normally
    main()

Ausnahmebehandlung wird zur Vereinfachung dieses Beispiels weggelassen. In Projekten mit mehreren Skriptdateien müssen Sie wahrscheinlich all diese Dateien (und andere Abhängigkeiten) auf dem Remote-Host ablegen.

33
Andreas N
ssh [email protected] python < script.py - arg1 arg2

Weil cat | normalerweise nicht notwendig ist 

10
neric

Sie können es über ssh tun.

ssh [email protected] "python ./hello.py"

Sie können das Skript in ssh auch mit einem Texteditor oder X11-Weiterleitung bearbeiten.

4
smeso

Ich musste dies vor der Verwendung von Paramiko in einem Fall tun, in dem ich ein dynamisches, lokales PyQt4-Skript auf einem Host ausführen wollte, auf dem ein SSH-Server ausgeführt wird, der meinen OpenVPN-Server angeschlossen hat, und nach deren Routing-Einstellung fragen (Split-Tunneling).

Solange der ssh-Server, zu dem Sie eine Verbindung herstellen, alle erforderlichen Abhängigkeiten Ihres Skripts aufweist (in meinem Fall PyQt4), können Sie die Daten einfach kapseln, indem Sie sie in base64 codieren und die integrierte Funktion exec() für die decodierte Nachricht verwenden. Wenn ich mich richtig erinnere, war mein Einzeiler dafür:

stdout = client.exec_command('python -c "exec(\\"' + open('hello.py','r').read().encode('base64').strip('\n') + '\\".decode(\\"base64\\"))"' )[1]

Es ist schwer zu lesen und Sie müssen den Escape-Sequenzen entkommen, da sie zweimal interpretiert werden (einmal vom Absender und dann vom Empfänger). Es kann auch ein wenig Debugging erforderlich sein, ich habe meinen Server auf PCS gepackt oder ich beziehe mich nur auf mein OpenVPN-Routing-Skript.

Der Unterschied zwischen dem Senden einer Datei und dem Senden einer Datei besteht darin, dass sie niemals die Festplatte des Servers berührt und direkt aus dem Speicher ausgeführt wird (es sei denn, sie protokollieren den Befehl natürlich). Sie werden feststellen, dass das Einkapseln von Informationen auf diese Weise (wenn auch ineffizient) dazu beitragen kann, Daten in eine einzige Datei zu packen.

Mit dieser Methode können Sie beispielsweise Rohdaten aus externen Abhängigkeiten (d. H. Ein Bild) in Ihr Hauptskript einbeziehen.

0
alisenby94