from - Cómo scp en python?
¿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)
Hace un tiempo, armé un script de copia SCP de python que depende de paramiko. Incluye código para manejar conexiones con una clave privada o un agente de clave SSH con una alternativa a la autenticación con contraseña.
http://code.activestate.com/recipes/576810-copy-files-over-ssh-using-paramiko/
No creo que haya ningún módulo que pueda descargar fácilmente para implementar scp, sin embargo, puede que le sea útil: http://www.ibm.com/developerworks/linux/library/l-twist4.html
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.
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.
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)