Conéctese a través de SSH y escriba la contraseña automáticamente, sin usar una clave pública

20

Un servidor permite conexiones SSH, pero no utiliza la autenticación de clave pública. No está en mi poder cambiar esto en este momento (debido a dificultades técnicas, no organizativas), ¡pero lo abordaré lo antes posible!

Lo que necesito ahora es ejecutar comandos en el servidor utilizando la autenticación de contraseña + cuenta antigua simple desde un script . Es decir, necesito hacerlo de una manera no interactiva. ¿Es posible? ¿Y cómo lo hago?

El cliente que ejecutará el script ejecuta Ubuntu Server 8.04. El servidor ejecuta Cygwin y OpenSSH.

Eliminado
fuente
2
¿Cuáles son las dificultades técnicas para habilitar la autenticación basada en claves? Quizás deberías hacer esa pregunta en su lugar, o además de esta.
Zoredache
1
Lo estoy preguntando :-) serverfault.com/questions/125842/… Simplemente necesito una ruta de escape por ahora, ya que he estado golpeándome la cabeza durante un tiempo. Pero, por supuesto, mi objetivo es lograr que funcione a largo plazo.
Borrado el

Respuestas:

22

Hay una utilidad de Linux llamada sshpass. Le permite hacer exactamente lo que desea y tomará una contraseña del servidor como argumento de línea de comando o de un archivo (lo prefiero de esta manera, por lo que no tengo la contraseña de mi servidor en el historial de shell) y la usa al igual que:

sshpass -f file_with_password ssh user@server ls -la

Esto se enviará a un servidor y se ejecutará ls -la. Sin embargo, una cosa es que primero debe ingresar manualmente en un servidor (si aún no lo ha hecho), para que el servidor se agregue a su servidor ~/.ssh/known_hosts. Si no haces eso, sshpassno funcionará.

solefald
fuente
2
Esto no es una parte estándar de OpenSSH, y literalmente ninguna de mis máquinas (Mac OS X 10.7, Ubuntu 12.04, FreeBSD 8, Debian 3.1) lo tiene ...
voretaq7
@ voretaq7: sshpass es un proyecto de SourceForge: sourceforge.net/projects/sshpass
kevinarpe
1
@KCArpe Creo que te perdiste mi punto ("El mundo entero no es tu máquina Linux, trata de elegir soluciones que funcionen en otros lugares"). El uso de la SSH_ASKPASSvariable es una solución más genérica que funciona en cualquier sistema con OpenSSH y no requiere la instalación de software adicional. Para algunos de nosotros (en industrias reguladas) la instalación de un nuevo software desencadena mucho trabajo administrativo.
voretaq7
@ voretaq7 El uso SSH_ASKPASSno funciona en todos los sistemas. Incluso si el cliente lo admite, no funcionará si el servidor lo utiliza keyboard-interactive. De hecho, me he enfrentado a ese problema al escribir un script para distribuir un authorized_keysarchivo a varias máquinas integradas.
Kasperd
8

Puedes usar Expect para hacer esto. Obviamente, esto no es preferible desde el punto de vista de la seguridad, ya que requerirá que use un script que contenga su contraseña en texto sin formato. (¡Pero no voy a expresar ese punto ya que usted dijo en su pregunta que planea usar la autenticación de clave pública lo antes posible!)

Mox
fuente
¡Esto parece que resolverá mi problema! Lo revisaré mañana. No es la solución final, pero ofrece cierta seguridad. Cuando lo pienso, si el usuario del script es el único al que se le permite leer el script. Entonces será tan seguro como mi clave privada que también está "solo" protegida por los permisos del sistema de archivos. ¿O me perdí algo?
Borrado el
Volveré con los resultados mañana. :-) ¡Gracias por responder!
Borrado el
Parece funcionar. Pero sshpass fue más fácil para este caso específico en mi humilde opinión.
Borrado el
7

Depende un poco del lenguaje de script que use. Escribo casi todo en Python ahora, donde esto no es un problema. Tanto pyssh como Paramiko le permiten simplemente escribir la contraseña sin problemas.

Si tiene la intención de hacerlo con scripts (ba) sh y usa OpenSSH, se vuelve más difícil. OpenSSH le impide explícitamente poner contraseñas en la línea de comando (ya que todos los usuarios pueden ver la línea de comando usando algo como ps -fe, que es un mal mojo). En este caso, deberá interactuar directamente con el programa ssh y tener dos opciones:

  • Puede escribir una cantidad considerable de código de soporte, usando algo como Expect.
  • Haces un hackeo usando la variable SSH_ASKPASS, diciéndole que llame a una aplicación que devuelve tu contraseña y la ejecute todo como un trabajo por lotes para evitar que se lea desde el terminal.
pehrs
fuente