visual studio microsoft espaƱol descargar community python ssh command subprocess

python - studio - Subproceso en servidor remoto



visual studio installer (6)

Debe usar pexpect o paramiko para conectarse a la máquina remota, luego engendrar un hijo y luego ejecutar el subprocess para lograr lo que desea.

Estoy usando este código para ejecutar el comando en el servidor remoto.

import subprocess import sys COMMAND="ls" ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) result = ssh.stdout.readlines() if result == []: error = ssh.stderr.readlines() print >>sys.stderr, "ERROR: %s" % error else: print result

Cuando intento ejecutar este script, recibo una solicitud de contraseña. ¿Hay alguna manera de evitarlo? Por ejemplo, ¿puedo ingresar la contraseña en el script de alguna manera? Además, la contraseña debe cifrarse de alguna manera para que las personas que tienen acceso al script no puedan verla.


Una forma es crear una clave pública, colocarla en el servidor, y hacer ssh -i /path/to/pub/key user@host o usar paramiko de esta manera:

import paramiko import getpass ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) p = getpass.getpass() ssh.connect(''hostname'', username=''user'', password=p) stdin, stdout, stderr = ssh.exec_command(''ls'') print stdout.readlines() ssh.close()


Mientras que el subprocess.Popen podría funcionar para envolver el acceso ssh , esta no es la forma preferida de hacerlo.

Recomiendo usar paramiko .

import paramiko ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(server, username=user,password=password) ... ssh_client.close()

Y si quiere simular una terminal, como si un usuario estuviera escribiendo:

chan=ssh_client.invoke_shell() def exec_cmd(cmd): """Gets ssh command(s), execute them, and returns the output""" prompt=''bash $'' # the command line prompt in the ssh terminal buff='''' chan.send(str(cmd)+''/n'') while not chan.recv_ready(): time.sleep(1) while not buff.endswith(prompt): buff+=ssh_client.chan.recv(1024) return buff[:len(prompt)]

Uso de ejemplo: exec_cmd(''pwd'')

Si no conoce el aviso por adelantado, puede configurarlo con:

chan.send(''PS1="python-ssh:"/n'')


Esto es lo que hice cuando me encontré con este problema antes:

  1. Configure sus claves ssh para acceder al servidor.
  2. Configure un alias para el servidor al que está accediendo . A continuación lo llamaré remote_server .
  3. Coloque las siguientes dos líneas al final de ~/.bash_profile .

    eval $(ssh-agent -s) ssh-add

Ahora, cada vez que inicie su caparazón, se le pedirá una frase de contraseña. Al ingresarlo, autenticará sus claves ssh y las pondrá ''en sus manos'' al comienzo de su sesión bash. Durante el resto de su sesión podrá ejecutar comandos como

ssh remote_server ls

sin que se le pida una frase de contraseña. Aquí se ejecutará en el servidor remoto y le devolverá los resultados. Del mismo modo, su secuencia de comandos python debe ejecutarse sin interrupción de solicitud de contraseña si la ejecuta desde el shell.

También podrá enviar ssh al servidor simplemente escribiendo ssh remote_server sin tener que ingresar su nombre de usuario o contraseña cada vez.

Lo mejor de hacerlo de esta manera es que deberías estar haciendo esto de todos modos para evitar molestias por contraseña y recordar nombres de servidores funky :) Además, no tienes que preocuparte de tener contraseñas guardadas en ninguna parte de tu script. El único inconveniente potencial es que si quieres compartir el script de python con otros, también tendrán que configurarlo (lo que deberían hacer de todos modos).


Realmente no necesitas algo como pexpect para manejar esto. Las claves SSH ya proporcionan una solución muy buena y segura para este tipo de problema.

La forma más sencilla de obtener los resultados que desea sería generar una clave ssh y colocarla en la carpeta .ssh de su dispositivo. Creo que Github tiene una muy buena guía para hacer eso, si lo miras. Una vez que configure las claves correctamente en ambos sistemas, no tendrá que agregar una sola línea a su código. Cuando no especifica una contraseña, automáticamente usará la clave para autenticarse.


¿Por qué hacerlo tan complicado? Esto es lo que sugiero:

1) Cree una sección de configuración ssh en su archivo ~ / .ssh / config:

Host myserver HostName 50.50.50.12 (fill in with your server''s ip) Port xxxx (optional) User me (your username for server)

2) Si ha generado su par de claves ssh, hágalo ahora (con ssh-keygen). Luego carga con:

$ ssh-copy-id myserver

3) Ahora puede usar el subproceso con ssh. Por ejemplo, para capturar resultados, llamo a:

result = subprocess.check_output([''ssh'', ''myserver'', ''cat'', ''somefile''])

Simple, robusto, y la única vez que se necesita una contraseña es cuando copias la clave pública al servidor.

Por cierto, tu código también funcionará bien usando estos pasos.