¿Cuál es la forma más pitónica de scp 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 una SSH sin contraseña configurada en el host remoto.
Soy consciente de Twisted conch
, pero preferiría evitar implementar SCP a través de módulos ssh de bajo nivel.
Soy consciente de 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 admite SFTP pero sí 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 se ocupe de claves desde Python. Espero una forma de ejecutar código 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')
scp
termina llamando a lascp
línea de comando que solo funciona en * nix.scp -t
oscp -f
( 'a' y 'de' modos, que existen para este fin en el servidor). Así es esencialmente cómo funciona scp: se basa en otra copia de scp existente en el servidor. Este artículo lo explica muy bien: blogs.oracle.com/janp/entry/how_the_scp_protocol_worksimport paramiko
from scp import SCPClient
2. Aquí hay un ejemplo del comando scp.get ():scp.get(r'/nfs_home/appers/xxxx/test2.txt', r'C:\Users\xxxx\Desktop\MR_Test')
pip install scp
en la versión 0.10.2 a partir de este escrito.Quizás le interese probar Pexpect ( código fuente ). Esto le permitiría lidiar con solicitudes interactivas para su contraseña.
Aquí hay un fragmento de ejemplo de uso (para ftp) del sitio web principal:
fuente
También puedes ver paramiko . No hay un módulo scp (todavía), pero es totalmente compatible con sftp.
[EDITAR] Lo siento, perdí la línea donde mencionaste a paramiko. El siguiente módulo es simplemente una implementación del protocolo scp para paramiko. Si no desea utilizar paramiko o conch (las únicas implementaciones de ssh que conozco para python), puede volver a trabajar esto para ejecutarlo en una sesión de ssh normal utilizando tuberías.
scp.py para paramiko
fuente
No se pudo encontrar una respuesta directa, y este módulo "scp.Client" no existe. En cambio, esto me conviene:
fuente
si instala putty en win32 obtendrá un pscp (putty scp).
así que también puedes usar el hack de os.system en win32.
(y puede usar el agente de masilla para la administración de claves)
lo siento, es solo un hack (pero puedes envolverlo en una clase de python)
fuente
Puede usar el subproceso del paquete y la llamada de comando para usar el comando scp desde el shell.
fuente
A partir de hoy, la mejor solución es probablemente
AsyncSSH
https://asyncssh.readthedocs.io/en/latest/#scp-client
fuente
Echa un vistazo a fabric.transfer .
fuente
Ha pasado bastante tiempo desde que se hizo esta pregunta, y mientras tanto, otra biblioteca que puede manejar esto ha surgido: puede usar la función de copia incluida en la biblioteca Plumbum :
fuente
SshMachine
tiene accesossh-agent
, así que si solo quieres evitar escribirlo todo el tiempo, esa es una forma de hacerlo. También puede presentar una solicitud de función en la página de github de plumbum.fuente
Si está en * nix, puede usar sshpass
fuente
Hmmm, quizás otra opción sería usar algo como sshfs (también hay un sshfs para Mac). Una vez que su enrutador está montado, puede copiar los archivos directamente. No estoy seguro de si eso funciona para su aplicación en particular, pero es una buena solución para tener a mano.
fuente
Hace un tiempo, armé un script de copia de Python SCP que depende de paramiko. Incluye código para manejar conexiones con una clave privada o un agente de clave SSH con un respaldo a la autenticación de contraseña.
http://code.activestate.com/recipes/576810-copy-files-over-ssh-using-paramiko/
fuente
No creo que haya un módulo que pueda descargar fácilmente para implementar scp, sin embargo, puede encontrar esto útil: http://www.ibm.com/developerworks/linux/library/l-twist4.html
fuente