Estoy escribiendo un script para automatizar algunos comandos de línea de comandos en Python. Por el momento estoy haciendo llamadas así:
cmd = "some unix command"
retcode = subprocess.call(cmd,shell=True)
Sin embargo, necesito ejecutar algunos comandos en una máquina remota. Manualmente, iniciaría sesión con ssh y luego ejecutaría los comandos. ¿Cómo automatizaría esto en Python? Necesito iniciar sesión con una contraseña (conocida) en la máquina remota, así que no puedo simplemente usar cmd = ssh user@remotehost
, me pregunto si hay un módulo que debería usar.
k = paramiko.RSAKey.from_private_key_file(keyfilename)
O : Yk = paramiko.DSSKey.from_private_key_file(keyfilename)
ENTONCESssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
y finalmentessh..connect(hostname=host, username=user, pkey=k)
.def run_cmd(host, cmd):
que hace lo que quiere al principio, pero sus necesidades evolucionan. Termina cambiando el ayudante para el nuevo caso de uso, que cambia el comportamiento del uso existente anterior. Planificar en consecuencia.O simplemente puede usar command.getstatusoutput :
Lo usé ampliamente y funciona muy bien.
En Python 2.6+, use
subprocess.check_output
.fuente
¿Has echado un vistazo a Fabric ? Le permite hacer todo tipo de cosas remotas a través de SSH usando Python.
fuente
Descubrí que paramiko era un nivel demasiado bajo y Fabric no era especialmente adecuado para ser utilizado como biblioteca, así que armé mi propia biblioteca llamada spur que usa paramiko para implementar una interfaz un poco más agradable:
Si necesita ejecutar dentro de un shell:
fuente
spur
. Genera comandos de shell adicionales y termina con: which 'mkdir'> / dev / null 2> & 1; echo $ ?; exec 'mkdir' '-p' '/ data / rpmupdate / 20130207142923'. Me gustaría tener también acceso a una llanuraexec_command
. También capacidad de ejecutar tareas en segundo plano que falta:nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &
. Por ejemplo, genero un script zsh (rpmbuildpackages) usando la plantilla y luego lo dejo ejecutándose en la máquina. Tal vez la capacidad de monitorear dichos trabajos en segundo plano también sería buena (guardar PID en algunos ~ / .spur).spur
aparentemente solo funciona en sistemas unix porque depende de ellostermios
. ¿Alguien sabe una buena biblioteca para Windows?SshShell
, ahora existe la opción de establecer el tipo de shell. Si se usa un shell mínimo al pasarshell_type=spur.ssh.ShellTypes.minimal
, solo se envía el comando sin formato. Implementar tareas en segundo plano directamente se siente un poco fuera de alcance para Spur, pero debe poder ejecutar el comando que ha descrito invocando un shell, por ejemploshell.run(["sh", "-c", "nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &"]
).Mantenlo simple. No se requieren bibliotecas.
fuente
Todos ya han declarado (recomendado) usar paramiko y solo estoy compartiendo un código de Python (API uno puede decir) que le permitirá ejecutar múltiples comandos de una vez.
para ejecutar comandos en diferentes nodos de uso:
Commands().run_cmd(host_ip, list_of_commands)
¡Gracias!
fuente
He usado paramiko a bunch (nice) y pxssh (también nice). Yo recomendaría cualquiera. Funcionan un poco diferente pero tienen una superposición relativamente grande en el uso.
fuente
Paramiko finalmente funcionó para mí después de agregar una línea adicional, que es realmente importante (línea 3):
Asegúrese de que el paquete paramiko esté instalado. Fuente original de la solución: Fuente
fuente
fuente
Funciona perfectamente...
fuente
La respuesta aceptada no funcionó para mí, esto es lo que usé en su lugar:
Alternativamente, puede usar sshpass :
Referencias:
1. https://github.com/onyxfish/relay/issues/11
2. https://stackoverflow.com/a/61016663/797495
fuente
Eche un vistazo a
spurplus
un contenedor que desarrollamos alrededorspur
que proporciona anotaciones de tipo y algunos trucos menores (reconectando SFTP, md5, etc. ): https://pypi.org/project/spurplus/fuente
Solicitar al usuario que ingrese el comando según el dispositivo en el que
inician sesión. El código siguiente está validado por PEP8online.com.
fuente
Ejemplo a continuación, en caso de que desee entradas de usuario para nombre de host, nombre de usuario, contraseña y número de puerto.
fuente