python scp copy




Wie scp in Python? (8)

Es ist eine Weile her, seit diese Frage gestellt wurde, und in der Zwischenzeit ist eine andere Bibliothek aufgetaucht, die damit umgehen kann: Sie können die Plumbum verwenden, die in der Plumbum Bibliothek enthalten ist:

import plumbum
r = plumbum.machines.RemoteMachine("example.net",
 user="username", keyfile=".ssh/some_key")
fro = plumbum.local.path("some_file")
to = r.path("/path/to/destination/")
plumbum.path.utils.copy(fro, to)

Was ist der pythischste Weg, um eine Datei in Python zu scannen? Die einzige Route, die mir bekannt ist, ist

os.system('scp "%s" "%s:%s"' % (localfile, remotehost, remotefile) )

Das ist ein Hack, der außerhalb von Linux-ähnlichen Systemen nicht funktioniert und der Hilfe vom Pexpect-Modul benötigt, um Passwortaufforderungen zu vermeiden, es sei denn, Sie haben bereits ein passwortloses SSH für den Remote-Host eingerichtet.

Ich kenne Twisted's conch , aber ich würde lieber vermeiden, scp selbst über Low-Level-SSH-Module zu implementieren.

Ich kenne paramiko , ein Python-Modul, das ssh und paramiko unterstützt; aber es unterstützt nicht scp.

Hintergrund: Ich verbinde mich mit einem Router, der sftp nicht unterstützt, aber ssh / scp unterstützt, also ist sftp keine Option.

EDIT : Dies ist ein Duplikat von Wie kopiert man eine Datei auf einen Remote-Server in Python mit SCP oder SSH? . Diese Frage gibt jedoch keine scp-spezifische Antwort, die sich mit Schlüsseln aus Python beschäftigt. Ich hoffe auf einen Weg, Code wie etwas zu laufen

import scp

client = scp.Client(host=host, user=user, keyfile=keyfile)
# or
client = scp.Client(host=host, user=user)
client.use_system_keys()
# or
client = scp.Client(host=host, user=user, password=password)

# and then
client.transfer('/etc/local/filename', '/etc/remote/filename')

Hmmm, vielleicht wäre eine andere Option, etwas wie sshfs (dort auch ein sshfs für Mac). Sobald Ihr Router gemountet ist, können Sie die Dateien einfach kopieren. Ich bin nicht sicher, ob das für Ihre spezielle Anwendung funktioniert, aber es ist eine nette Lösung, um handlich zu bleiben.



Konnte keine direkte Antwort finden, und dieses Modul "scp.Client" existiert nicht. Stattdessen passt das zu mir:

from paramiko import SSHClient
from scp import SCPClient

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect('example.com')

with SCPClient(ssh.get_transport()) as scp:
   scp.put('test.txt', 'test2.txt')
   scp.get('test2.txt')

Sie können paramiko auch überprüfen. Es gibt (noch) kein scp-Modul, aber es unterstützt vollständig sftp.

[Bearbeiten] Sorry, verpasste die Zeile, wo Sie Paramiko erwähnt. Das folgende Modul ist einfach eine Implementierung des scp-Protokolls für paramiko. Wenn Sie paramiko oder conch (die einzigen ssh-Implementierungen, die ich für python kenne) nicht verwenden möchten, könnten Sie dies so anpassen, dass es über eine reguläre SSH-Sitzung mit Pipes läuft.

paramiko_scp


Sie können den Paketunterprozess und den Befehlsaufruf verwenden, um den Befehl scp aus der Shell zu verwenden.

from subprocess import call

cmd = "scp [email protected]:files [email protected]:files"
call(cmd.split(" "))

Versuchen Sie das Modul paramiko_scp . Es ist sehr einfach zu bedienen. Siehe das folgende Beispiel:

def createSSHClient(server, port, user, password):
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(server, port, user, password)
    return client

ssh = createSSHClient(server, port, user, password)
scp = SCPClient(ssh.get_transport())

Rufen Sie dann scp.get () oder scp.put () auf, um scp-Vorgänge auszuführen.

( SCPClient-Code )


Wenn Sie * nix verwenden, können Sie sshpass

sshpass -p password scp -o User=username -o StrictHostKeyChecking=no src dst:/path




scp