scpclient from python ssh scp

from - Cómo scp en python?



from scp import scpclient (12)

Eche un vistazo a la fabric . Un ejemplo se puede encontrar here .

¿Cuál es la forma más pitónica de analizar un archivo en Python? La única ruta que conozco es

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

que es un truco, y que no funciona fuera de los sistemas similares a Linux, y que necesita ayuda del módulo Pexpect para evitar solicitudes de contraseña a menos que ya tenga SSH sin contraseña configurado para el host remoto.

Conozco el conch de Twisted, pero preferiría evitar implementar scp por medio de módulos ssh de bajo nivel.

paramiko , un módulo de Python que admite ssh y sftp; pero no es compatible con scp.

Antecedentes: me estoy conectando a un enrutador que no es compatible con sftp pero admite ssh / scp, por lo que sftp no es una opción.

EDITAR : Este es un duplicado de ¿Cómo copiar un archivo a un servidor remoto en Python usando SCP o SSH? . Sin embargo , esa pregunta no da una respuesta específica de scp que trate con claves desde dentro de python. Estoy esperando una forma de ejecutar código tipo de como

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'')


Ha pasado bastante tiempo desde que se hizo esta pregunta, y mientras tanto, ha surgido otra biblioteca que puede manejar esto: puede usar la función de copy incluida en la biblioteca de Plumbum :

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)



Hmmm, tal vez otra opción sería usar algo como sshfs (hay un sshfs para Mac también). Una vez que haya montado su enrutador, simplemente copie los archivos directamente. No estoy seguro de si eso funciona para su aplicación particular, pero es una buena solución para tener a mano.



No se pudo encontrar una respuesta directa, y este módulo "scp.Client" no existe. En cambio, this me conviene:

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'')


Prueba el módulo paramiko_scp . Es muy fácil de usar. Vea el siguiente ejemplo:

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())

Luego llame a scp.get () o scp.put () para hacer operaciones de scp.

( Código de SCPClient )


Puede que le interese probar Pexpect ( proyecto SourceForge ). Esto le permitiría tratar con indicaciones interactivas para su contraseña.

Aquí hay un fragmento de uso de ejemplo (para ftp) del sitio web principal:

# This connects to the openbsd ftp site and # downloads the recursive directory listing. import pexpect child = pexpect.spawn (''ftp ftp.openbsd.org'') child.expect (''Name .*: '') child.sendline (''anonymous'') child.expect (''Password:'') child.sendline (''[email protected]'') child.expect (''ftp> '') child.sendline (''cd pub'') child.expect(''ftp> '') child.sendline (''get ls-lR.gz'') child.expect(''ftp> '') child.sendline (''bye'')


Puede usar el subproceso del paquete y la llamada de comando para usar el comando scp desde el shell.

from subprocess import call cmd = "scp user1@host1:files user2@host2:files" call(cmd.split(" "))


Si usa * nix, puede usar sshpass

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


También puedes paramiko un vistazo a paramiko . No hay módulo scp (todavía), pero es completamente compatible con sftp.

[EDITAR] Perdón, te perdiste la línea donde mencionaste paramiko. El siguiente módulo es simplemente una implementación del protocolo scp para paramiko. Si no quieres usar paramiko o conch (las únicas implementaciones de ssh que conozco para python), puedes volver a trabajar esto para ejecutar una sesión ssh normal usando pipes.

paramiko_scp


si instala putty en win32 obtendrá un pscp (putty scp).

para que pueda usar el hack os.system en win32 también.

(y puede usar el agente de masilla para la gestión de claves)

lo siento, es solo un truco (pero puedes envolverlo en una clase de pitón)