Posterior a de esta extensa selección de información dimos con la respuesta este atascamiento que tienen muchos usuarios. Te ofrecemos la solución y deseamos que resulte de mucha apoyo.
Solución:
Para hacer esto en Python (es decir, no envolver scp a través de subprocess.Popen o similar) con la biblioteca Paramiko, haría algo como esto:
import os
import paramiko
ssh = paramiko.SSHClient()
ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
ssh.connect(server, username=username, password=password)
sftp = ssh.open_sftp()
sftp.put(localpath, remotepath)
sftp.close()
ssh.close()
(Probablemente querrá lidiar con hosts desconocidos, errores, crear los directorios necesarios, etc.).
Puedes llamar al scp
comando bash (copia archivos a través de SSH) con subprocess.run
:
import subprocess
subprocess.run(["scp", FILE, "[email protected]:PATH"])
#e.g. subprocess.run(["scp", "foo.bar", "[email protected]:/path/to/foo.bar"])
Si está creando el archivo que desea enviar en el mismo programa de Python, querrá llamar subprocess.run
mando fuera del with
bloque que está utilizando para abrir el archivo (o llamar .close()
en el archivo primero si no está utilizando un with
bloque), para que sepa que se descarga en el disco desde Python.
Debe generar (en la máquina de origen) e instalar (en la máquina de destino) un ssh key de antemano para que el scp se autentique automáticamente con su ssh público key (en otras palabras, para que su script no solicite una contraseña).
Probablemente usaría el módulo de subproceso. Algo como esto:
import subprocess
p = subprocess.Popen(["scp", myfile, destination])
sts = os.waitpid(p.pid, 0)
Dónde destination
es probablemente de la forma [email protected]:remotepath
. Gracias a @Charles Duffy por señalar la debilidad en mi respuesta original, que usaba un solo string argumento para especificar la operación scp shell=True
– eso no manejaría espacios en blanco en las rutas.
La documentación del módulo tiene ejemplos de comprobación de errores que quizás desee realizar junto con esta operación.
Asegúrese de haber configurado las credenciales adecuadas para poder realizar un scp sin contraseña y sin supervisión entre las máquinas. Ya hay una pregunta de stackoverflow para esto.
Acuérdate de que te permitimos glosar tu experiencia si topaste tu cuestión justo a tiempo.