Wie schreibe ich in Python eine Zeichenfolge in eine Datei auf einem Remote-Rechner?

8

Auf Machine1 habe ich ein Python2.7-Skript, das eine große (bis zu 10MB) binäre Zeichenfolge im RAM berechnet, die ich in eine Datei auf Machine2 schreiben möchte, die eine Remote-Maschine ist. Was ist der beste Weg, dies zu tun?

Einschränkungen:

  • Beide Maschinen sind Ubuntu 13.04. Die Verbindung zwischen ihnen ist schnell - sie sind im selben Netzwerk.

  • Das Zielverzeichnis ist möglicherweise noch nicht auf Machine2 vorhanden, daher muss es möglicherweise erstellt werden.

  • Wenn es einfach ist, möchte ich es vermeiden, die Zeichenfolge aus dem RAM in eine temporäre Datei auf Machine1 zu schreiben. Werden dadurch Lösungen eliminiert, die möglicherweise einen Systemaufruf an rsync verwenden?

  • Da die Zeichenfolge binär ist, enthält sie möglicherweise Bytes, die als Zeilenumbruch interpretiert werden können. Dies scheint Lösungen auszuschließen, die einen Systemaufruf für den echo-Befehl auf Machine2 verwenden könnten.

  • Ich möchte, dass dies auf Machine2 so leicht wie möglich ist. Daher möchte ich vermeiden, Dienste wie ftp auf Machine2 auszuführen oder dort andere Konfigurationsaktivitäten durchzuführen. Außerdem verstehe ich die Sicherheit nicht so gut und möchte daher vermeiden, dass zusätzliche Ports geöffnet werden, es sei denn, dies ist wirklich notwendig.

  • Ich habe SSH-Schlüssel auf Machine1 und Machine2 eingerichtet und möchte sie für die Authentifizierung verwenden.

  • BEARBEITEN: Machine1 führt mehrere Threads aus, daher ist es möglich, dass mehrere Threads versuchen, in überlappender Zeit in dieselbe Datei auf Machine2 zu schreiben. Es macht mir nichts aus, wenn die Datei in diesem Fall doppelt (oder mehr) geschrieben wird, aber die resultierende Datei auf Machine2 sollte nicht durch simultane Schreibvorgänge beschädigt werden. Vielleicht wird eine OS-Sperre auf Machine2 benötigt?

Ich rooze für eine rsync-Lösung, da es eine in sich geschlossene Entität ist, die ich ziemlich gut verstehe und keine Konfiguration auf Machine2 benötigt.

    
Iron Pillow 05.10.2013, 20:21
quelle

4 Antworten

5

Sie öffnen einen neuen SSH-Prozess für Machine2 mit subprocess.Popen und dann schreiben Sie Ihre Daten in ihre STDIN.

%Vor%

Ich habe gerade verifiziert, dass es wie angekündigt funktioniert und kopiert alle 10485760 Dummy-Bytes.

P.S. Eine potenziell sauberere / elegantere Lösung bestünde darin, das Python-Programm stattdessen seine Ausgabe in sys.stdout schreiben zu lassen und die Verbindung zu ssh external:

herzustellen %Vor%     
Erik Allik 05.10.2013, 20:46
quelle
13

Paramiko unterstützt das Öffnen von Dateien auf Remote-Computern:

%Vor%     
Robᵩ 05.10.2013 21:10
quelle
0

Wenn Sie nur einen Unterprozess aufrufen, können Sie vielleicht sh.py verwenden könnte das Richtige sein.

%Vor%     
LeuX 05.10.2013 22:53
quelle
0

Eine Lösung, bei der Sie Ihre Daten nicht explizit über eine Verbindung senden, wäre sshfs . Sie können damit ein Verzeichnis von Machine2 irgendwo auf Machine1 mounten und das Schreiben in eine Datei in diesem Verzeichnis führt automatisch dazu, dass die Daten auf Machine2 geschrieben werden.

    
brm 06.10.2013 08:08
quelle