Tengo un archivo de texto en mi máquina local que es generado por un script de Python que se ejecuta diariamente en cron.
Me gustaría agregar un poco de código para que ese archivo se envíe de forma segura a mi servidor a través de SSH.
python
ssh
automation
scp
Alok
fuente
fuente
Respuestas:
Puede llamar al
scp
comando bash (copia archivos a través de SSH ) consubprocess.run
:Si está creando el archivo que desea enviar en el mismo programa de Python, querrá llamar al
subprocess.run
comando fuera delwith
bloque que está usando para abrir el archivo (o llamar.close()
al archivo primero si no está usando unwith
block), 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) una clave ssh de antemano para que el scp se autentique automáticamente con su clave ssh pública (en otras palabras, para que su script no solicite una contraseña) .
fuente
subprocess.check_call(['scp', srcfile, dest])
podría usarse desde Python 2.5 en lugar derc = Popen(..).wait(); if rc != 0: raise ..
Para hacer esto en Python (es decir, sin ajustar scp a través de subprocess.Popen o similar) con la biblioteca Paramiko , debería hacer algo como esto:
(Probablemente quiera lidiar con hosts desconocidos, errores, crear los directorios necesarios, etc.).
fuente
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
después de crear una instanciassh
.Probablemente usaría el módulo de subproceso . Algo como esto:
Donde
destination
es probablemente de la formauser@remotehost:remotepath
. Gracias a @Charles Duffy por señalar la debilidad en mi respuesta original, que usaba un argumento de cadena única para especificar la operación scpshell=True
, que no manejaría los espacios en blanco en las rutas.La documentación del módulo tiene ejemplos de comprobación de errores que es posible que desee realizar junto con esta operación.
Asegúrese de haber configurado las credenciales adecuadas para poder realizar un scp desatendido y sin contraseña entre las máquinas . Ya hay una pregunta de stackoverflow para esto .
fuente
subprocess.check_call(['scp', myfile, destination])
podría usarse en su lugar desde Python 2.5 (2006)Hay un par de formas diferentes de abordar el problema:
Cada enfoque tiene sus propias peculiaridades. Deberá configurar las claves SSH para habilitar inicios de sesión sin contraseña si está ajustando comandos del sistema como "ssh", "scp" o "rsync". Puede incrustar una contraseña en un script usando Paramiko o alguna otra biblioteca, pero la falta de documentación puede resultar frustrante, especialmente si no está familiarizado con los conceptos básicos de la conexión SSH (por ejemplo, intercambios de claves, agentes, etc.). Probablemente no hace falta decir que las claves SSH son casi siempre una mejor idea que las contraseñas para este tipo de cosas.
NOTA: es difícil superar a rsync si planea transferir archivos a través de SSH, especialmente si la alternativa es scp.
He usado Paramiko con miras a reemplazar las llamadas al sistema, pero me sentí atraído por los comandos envueltos debido a su facilidad de uso y familiaridad inmediata. Puede que seas diferente. Le di a Conch un vistazo hace algún tiempo pero no me atrajo.
Si opta por la ruta de llamada al sistema, Python ofrece una serie de opciones como os.system o los módulos de comandos / subprocesos. Iría con el módulo de subproceso si uso la versión 2.4+.
fuente
Llegó al mismo problema, pero en lugar de "piratear" o emular la línea de comando:
Encontré esta respuesta aquí .
fuente
Puede hacer algo como esto, para manejar la verificación de la clave del host también
fuente
fabric
podría usarse para cargar archivos vis ssh:fuente
Puede usar el paquete vasallo, que está diseñado exactamente para esto.
Todo lo que necesitas es instalar vasallo y hacer
Además, le ahorrará autenticar la credencial y no es necesario que la escriba una y otra vez.
fuente
Solía sshfs para montar el directorio remoto a través de SSH, y shutil para copiar los archivos:
Luego en Python:
Este método tiene la ventaja de que puede transmitir datos si está generando datos en lugar de almacenarlos en caché localmente y enviar un solo archivo grande.
fuente
Pruebe esto si no desea utilizar certificados SSL:
fuente
Utilizando el recurso externo paramiko;
fuente
Llamar al
scp
comando a través de un subproceso no permite recibir el informe de progreso dentro del script.pexpect
podría usarse para extraer esa información:Ver archivo de copia de python en la red local (linux -> linux)
fuente
Un enfoque muy simple es el siguiente:
No se requiere una biblioteca de Python (solo sistema operativo), y funciona, sin embargo, el uso de este método depende de la instalación de otro cliente ssh. Esto podría resultar en un comportamiento no deseado si se ejecuta en otro sistema.
fuente
Un poco hacky, pero lo siguiente debería funcionar :)
fuente