Ich habe eine Textdatei auf meinem lokalen Computer, die von einem täglichen Python-Skript generiert wird, das in cron ausgeführt wird.
Ich möchte ein bisschen Code hinzufügen, damit diese Datei sicher über SSH an meinen Server gesendet wird.
python
ssh
automation
scp
Alok
quelle
quelle
Antworten:
Sie können den
scp
Befehl bash (er kopiert Dateien über SSH ) aufrufen mitsubprocess.run
:Wenn Sie die Datei erstellen, die Sie im selben Python-Programm senden möchten, möchten Sie den
subprocess.run
Befehl außerhalb deswith
Blocks aufrufen, den Sie zum Öffnen der Datei verwenden (oder.close()
die Datei zuerst aufrufen, wenn Sie keine verwendenwith
block), damit Sie wissen, dass es von Python auf die Festplatte geschrieben wurde.Sie müssen zuvor (auf dem Quellcomputer) einen SSH-Schlüssel generieren und (auf dem Zielcomputer) installieren, damit der SCP automatisch mit Ihrem öffentlichen SSH-Schlüssel authentifiziert wird (mit anderen Worten, Ihr Skript fragt nicht nach einem Kennwort). .
quelle
subprocess.check_call(['scp', srcfile, dest])
könnte seit Python 2.5 anstelle vonrc = Popen(..).wait(); if rc != 0: raise ..
Um dies in Python (dh scp nicht durch subprocess.Popen oder ähnliches zu verpacken ) mit der Paramiko- Bibliothek zu tun, würden Sie Folgendes tun:
(Sie möchten wahrscheinlich unbekannte Hosts, Fehler, das Erstellen von erforderlichen Verzeichnissen usw. behandeln.)
quelle
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
sofort funktioniert, fügen Sie nach dem Instanziieren hinzussh
.Sie würden wahrscheinlich das Unterprozessmodul verwenden . Etwas wie das:
Wo
destination
ist wohl von der Formuser@remotehost:remotepath
. Vielen Dank an @Charles Duffy für den Hinweis auf die Schwachstelle in meiner ursprünglichen Antwort, die ein einziges Zeichenfolgenargument zur Angabe der scp-Operation verwendeteshell=True
- das würde Leerzeichen in Pfaden nicht behandeln.Die Moduldokumentation enthält Beispiele für die Fehlerprüfung, die Sie möglicherweise in Verbindung mit diesem Vorgang ausführen möchten.
Stellen Sie sicher, dass Sie die richtigen Anmeldeinformationen eingerichtet haben, damit Sie eine unbeaufsichtigte, kennwortlose Überprüfung zwischen den Computern durchführen können . Hierfür gibt es bereits eine Stackoverflow-Frage .
quelle
subprocess.check_call(['scp', myfile, destination])
könnte stattdessen seit Python 2.5 (2006)Es gibt verschiedene Möglichkeiten, um das Problem anzugehen:
Jeder Ansatz hat seine eigenen Macken. Sie müssen SSH-Schlüssel einrichten, um kennwortlose Anmeldungen zu aktivieren, wenn Sie Systembefehle wie "ssh", "scp" oder "rsync" umschließen. Sie können ein Kennwort mithilfe von Paramiko oder einer anderen Bibliothek in ein Skript einbetten. Der Mangel an Dokumentation ist jedoch möglicherweise frustrierend, insbesondere wenn Sie mit den Grundlagen der SSH-Verbindung nicht vertraut sind (z. B. Schlüsselaustausch, Agenten usw.). Es versteht sich wahrscheinlich von selbst, dass SSH-Schlüssel für solche Dinge fast immer eine bessere Idee sind als Passwörter.
HINWEIS: Es ist schwer, rsync zu schlagen, wenn Sie Dateien über SSH übertragen möchten, insbesondere wenn die Alternative einfach altes scp ist.
Ich habe Paramiko verwendet, um Systemaufrufe zu ersetzen, fand mich jedoch aufgrund ihrer Benutzerfreundlichkeit und sofortigen Vertrautheit zu den umschlossenen Befehlen zurückgezogen. Du könntest anders sein. Ich habe Conch vor einiger Zeit noch einmal gegeben, aber es hat mich nicht angesprochen.
Wenn Sie sich für den Systemaufrufpfad entscheiden, bietet Python eine Reihe von Optionen wie os.system oder die Befehle / Unterprozessmodule. Ich würde mit dem Subprozessmodul gehen, wenn ich Version 2.4+ verwenden würde.
quelle
Das gleiche Problem erreicht, aber anstatt die Befehlszeile zu "hacken" oder zu emulieren:
Fand diese Antwort hier .
quelle
Sie können so etwas tun, um auch die Überprüfung des Hostschlüssels durchzuführen
quelle
fabric
könnte verwendet werden, um Dateien vis ssh hochzuladen:quelle
Sie können das Vasallenpaket verwenden, das genau dafür ausgelegt ist.
Alles was Sie brauchen, ist Vasall zu installieren und zu tun
Außerdem werden Sie authentifizierte Anmeldeinformationen speichern und müssen diese nicht immer wieder eingeben.
quelle
Ich habe sshfs verwendet , um das Remote-Verzeichnis über ssh bereitzustellen , und shutil, um die Dateien zu kopieren:
Dann in Python:
Diese Methode hat den Vorteil, dass Sie Daten streamen können, wenn Sie Daten generieren, anstatt sie lokal zwischenzuspeichern und eine einzelne große Datei zu senden.
quelle
Versuchen Sie dies, wenn Sie keine SSL-Zertifikate verwenden möchten:
quelle
Verwenden der externen Ressource paramiko;
quelle
Durch Aufrufen des
scp
Befehls über einen Unterprozess kann der Fortschrittsbericht nicht im Skript empfangen werden.pexpect
könnte verwendet werden, um diese Informationen zu extrahieren:Siehe Python-Kopierdatei im lokalen Netzwerk (Linux -> Linux)
quelle
Ein sehr einfacher Ansatz ist der folgende:
Es ist keine Python-Bibliothek erforderlich (nur Betriebssystem), und es funktioniert. Die Verwendung dieser Methode setzt jedoch voraus, dass ein anderer SSH-Client installiert wird. Dies kann zu unerwünschtem Verhalten führen, wenn es auf einem anderen System ausgeführt wird.
quelle
Ein bisschen hacky, aber das Folgende sollte funktionieren :)
quelle