prueba - servidor local python
Ejecutar el script local de Python en un servidor remoto (5)
Aunque esta pregunta no es del todo nueva y ya se eligió una respuesta, me gustaría compartir otro buen enfoque.
Usando la biblioteca paramiko , una implementación pura de SSH2 en python, su script de python puede conectarse a un host remoto a través de SSH, copiarse a sí mismo (!) Y luego ejecutar esa copia en el host remoto. Stdin, stdout y stderr del proceso remoto estarán disponibles en su script de ejecución local. Así que esta solución es bastante independiente de un IDE.
En mi máquina local, ejecuto el script con un parámetro ''despliegue'' de línea cmd, que activa la ejecución remota. Sin dicho parámetro, se ejecuta el código real destinado al host remoto.
import sys
import os
def main():
print os.name
if __name__ == ''__main__'':
try:
if sys.argv[1] == ''deploy'':
import paramiko
# Connect to remote host
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(''remote_hostname_or_IP'', username=''john'', password=''secret'')
# Setup sftp connection and transmit this script
sftp = client.open_sftp()
sftp.put(__file__, ''/tmp/myscript.py'')
sftp.close()
# Run the transmitted script remotely without args and show its output.
# SSHClient.exec_command() returns the tuple (stdin,stdout,stderr)
stdout = client.exec_command(''python /tmp/myscript.py'')[1]
for line in stdout:
# Process each line in the remote output
print line
client.close()
sys.exit(0)
except IndexError:
pass
# No cmd-line args provided, run script normally
main()
El manejo de excepciones se omite para simplificar este ejemplo. En proyectos con múltiples archivos de script, probablemente tendrá que colocar todos esos archivos (y otras dependencias) en el host remoto.
Estoy depurando algunas secuencias de comandos de Python que deben ejecutarse en mi máquina virtual. Y, prefiero editar los scripts localmente (fuera de las máquinas virtuales). Así que me parece tedioso scp
scripts modificados a máquinas virtuales cada vez. ¿Alguien puede sugerir alguna forma efectiva?
En particular, me pregunto si es posible ejecutar scripts de Python en PVM remoto. Algo como eso:
python --remote [email protected] hello.py //**FAKED**, served to explain ONLY
Es posible usar ssh. Python acepta el guión (-) como argumento para ejecutar la entrada estándar,
cat hello.py | ssh [email protected] python -
Ejecute python --help para obtener más información.
He tenido que hacer esto antes de usar Paramiko en un caso en el que quería ejecutar un script PyQt4 local y dinámico en un host que ejecuta un servidor ssh que ha conectado mi servidor OpenVPN y pregunte por su preferencia de enrutamiento (túnel dividido).
Siempre que el servidor ssh al que se está conectando tenga todas las dependencias requeridas de su script (PyQt4 en mi caso), puede encapsular fácilmente los datos codificándolos en base64 y usar la función incorporada exec()
en el decodificado mensaje. Si recuerdo correctamente mi one-liner para esto fue:
stdout = client.exec_command(''python -c "exec(//"'' + open(''hello.py'',''r'').read().encode(''base64'').strip(''/n'') + ''//".decode(//"base64//"))"'' )[1]
Es difícil de leer y tienes que escapar de las secuencias de escape porque se interpretan dos veces (una vez por el remitente y luego otra vez por el receptor). También es posible que necesite un poco de depuración, he empaquetado mi servidor en PCS o simplemente me referí a mi script de enrutamiento OpenVPN.
La diferencia al hacerlo de esta manera en lugar de enviar un archivo es que nunca toca el disco en el servidor y se ejecuta directamente desde la memoria (a menos que, por supuesto, registren el comando). Encontrará que la información encapsulada de esta manera (aunque ineficiente) puede ayudarlo a empaquetar los datos en un solo archivo.
Por ejemplo, puede usar este método para incluir datos sin procesar de dependencias externas (es decir, una imagen) en su script principal.
Puedes hacerlo vía ssh.
ssh [email protected] "python ./hello.py"
También puede editar el script en ssh usando un editor de texto o reenvío X11.
ssh user@machine python < script.py - arg1 arg2
Porque el cat |
por lo general no es necesario