¿Cómo pasar la contraseña a su / sudo / ssh sin anular el TTY?

148

Estoy escribiendo un programa C Shell que estará haciendo suosudo o ssh. Todos quieren sus contraseñas en la entrada de la consola (el TTY) en lugar de stdin o la línea de comando.

¿Alguien sabe una solución?

Configuración sin contraseña sudo no es una opción.

podría ser una opción, pero no está presente en mi sistema simplificado.

n-alexander
fuente
SSH: serverfault.com/questions/241588/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

215

Para sudo hay una opción -S para aceptar la contraseña de la entrada estándar. Aquí está la entrada del hombre:

    -S          The -S (stdin) option causes sudo to read the password from
                the standard input instead of the terminal device.

Esto le permitirá ejecutar un comando como:

echo myPassword | sudo -S ls /tmp

En cuanto a ssh, he hecho muchos intentos de automatizar / script su uso sin éxito. No parece haber ninguna forma integrada de pasar la contraseña al comando sin preguntar. Como otros han mencionado, la utilidad " esperar " parece que está destinada a abordar este dilema, pero en última instancia, configurar la autorización de clave privada correcta es el camino correcto cuando se intenta automatizar esto.

Jesse Webb
fuente
2
Afortunadamente, Ruby tiene un cliente SSH incorporado que le permite especificar la contraseña. Puede probar ruby ​​-e "require 'net / ssh'; Net :: SSH.start ('example.com', 'test_user',: password => 'secret') do | ssh | pone 'Logged in exitosamente'; while cmd = gets; pone ssh.exec! (cmd); end end "
usuario1158559
13
Odio ser un chiflado aquí, pero hacer esto puede hacer que tu contraseña aparezca en una lista de procesos. Estaba tratando de determinar una mejor manera y encontré este artículo y me sorprendió que nadie lo hubiera señalado. Gran solución, pero ten cuidado con los riesgos.
Matt
Sobre ssh, ¿ha intentado pasar la contraseña en la cadena de conexión? como nonroot:[email protected]? Por supuesto, las cosas son mucho más fáciles si usa la autenticación de claves y el administrador de claves.
Killah
12
Evite que la contraseña aparezca en la lista de procesos o en los archivos de registro colocándola en un archivo y usando cat; 'cat pw | sudo -S <command>y luego rm pw.
CAB
Otra forma sería usar netcat y entregar la contraseña a través de un socket - nc -l 12345 | sudo -S <command>. En el lado de envío; echo myPassord | nc <target> 12345. Esto simplemente mueve el problema de manejo de contraseña, pero presumiblemente a una consola maestra donde tiene más opciones.
CAB
36

Escribí un Applescript que solicita una contraseña a través de un cuadro de diálogo y luego crea un comando bash personalizado, como este:

echo <password> | sudo -S <command>

No estoy seguro si esto ayuda.

Sería bueno si sudo aceptara una contraseña pre-encriptada, para poder encriptarla dentro de mi script y no preocuparme por hacer eco de contraseñas de texto claro. Sin embargo, esto funciona para mí y mi situación.

mlambie
fuente
27

Para sshpuede utilizar sshpass: sshpass -p yourpassphrase ssh user@host.

Solo necesita descargar sshpass primero :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
Eduardo
fuente
12

Tengo:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

Funciona para mi.

David Dawson
fuente
No funciono para mi. Todavía ssh solicita la contraseña.
AKS
Excelente, finalmente algo que puedo usar! Gracias. Lo uso dentro de un script bash que inicia una sesión ssh y pasa los comandos sudo al cliente. Mi script tiene líneas que resuelven: ssh -t username @ hostname bash -c "sudo echo fartjuice"
James T Snell
12

Para sudo también puedes hacer esto:

sudo -S <<< "password" command
Jahid
fuente
10

La solución habitual a este problema es configurar una aplicación auxiliar que realiza la tarea que requiere acceso de superusuario: http://en.wikipedia.org/wiki/Setuid

Sudo no está destinado a ser utilizado sin conexión.

Edición posterior: SSH se puede usar con autenticación de clave pública-privada. Si la clave privada no tiene una frase de contraseña, ssh se puede usar sin solicitar una contraseña.

diciu
fuente
10

Esto se puede hacer configurando claves públicas / privadas en los hosts de destino a los que se conectará. El primer paso sería generar una clave ssh para el usuario que ejecuta el script en el host local, ejecutando:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

Luego ingrese una contraseña en blanco. Después de eso, copie su clave ssh en el host de destino al que se conectará.

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

Después de registrar las claves ssh, podrá realizar un silencio ssh remote_user@other_hostdesde su host local.

Byob
fuente
7

¿Quizás puedas usar un expectcomando ?:

expect -c 'spawn ssh [email protected];expect password;send "your-password\n";interact

Ese comando da la contraseña automáticamente.

adhown
fuente
Se ve bien, pero ¿cómo puedo habilitar el comando expect en una máquina sin permisos de root?
Radon8472
1
@ Radon8472 Se puede agregar un ejecutable a ~ / bin si no tiene permisos para instalarlo. Si su sistema no agrega automáticamente ~ / bin a su RUTA, puede hacerlo manualmente con export PATH = "$ PATH: ~ / bin" o agregar ese comando a su perfil para hacerlo automáticamente. Si no desea cambiar su RUTA, puede ejecutar el comando utilizando su ruta absoluta: ~ / bin / expect [argumentos] Asegúrese de recordar establecer su bit ejecutable: chmod + x ~ / bin / expect
StarCrashr
6

Cuando no hay una mejor opción (como lo sugieren otros), entonces man socat puede ayudar:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

Toda la complejidad pty, setsid, ctty es necesaria y, si bien es posible que no necesite dormir tanto, necesitará dormir. La opción echo = 0 también vale la pena, ya que pasa el comando remoto en la línea de comando de ssh.

Martin Dorey
fuente
1
En realidad su, esto también funcionará. suno tiene una opción -S (stdin).
aus
¿Es posible evitar dormir y usar algo más confiable en su lugar?
Michael Pankov
6

Echa un vistazo a la expectutilidad de Linux.

Le permite enviar resultados a stdio en función de la coincidencia de patrones simple en stdin.

Marko
fuente
1

Configure SSH para la autenticación de clave pública, sin frase de contraseña en la clave. Un montón de guías en la red. No necesitará una contraseña para iniciar sesión entonces. Luego puede limitar las conexiones para una clave basada en el nombre de host del cliente. Proporciona seguridad razonable y es ideal para inicios de sesión automatizados.


fuente
1
ssh -t -t [email protected] << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
Ed Bishop
fuente
Si puede iniciar sesión como usuario con la clave ssh, para el acceso sudo está bien: ssh -t usuario @ host "echo mypassword | sudo -S sudocommand"
Jack
0

Yo tuve el mismo problema. script de diálogo para crear un directorio en una PC remota. Diálogo con ssh es fácil. Yo uso sshpass (previamente instalado).

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

saludos desde Alemania

titus

titus
fuente
0

Partiendo de la respuesta de @ Jahid, esto funcionó para mí en macOS 10.13:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers
JS.
fuente
0

Una mejor sshpassalternativa es: passh https://github.com/clarkwang/passh

Inicie sesión en un servidor remoto

 $ passh -p password ssh user@host

Ejecute un comando en el servidor remoto

 $ passh -p password ssh user@host date

otros métodos para pasar la contraseña

-p La contraseña (Predeterminado: `contraseña ')

-p env: lee la contraseña de env var

-p archivo: lee la contraseña del archivo

Aquí expliqué por qué es mejor que sshpass y otras soluciones.

Badr Elmers
fuente
-1
echo <password> | su -c <command> <user> 

Esto esta funcionando.

DevOz
fuente
1
Este es el único que me funciona en Fedora. ¿La gente rechaza las respuestas solo porque no trabajan en su situación?
Hangchen Yu
2
"su: debe ejecutarse desde una terminal" (RPi1B, Raspbian)
notme1560
Desafortunadamente, esto no ocurre en versiones recientes de su, que en su lugar lee la contraseña de stdio .
moutonjr
-1

Codificar una contraseña en un script de esperar es lo mismo que tener un sudo sin contraseña, en realidad peor, ya que sudo al menos registra sus comandos.

Aleksandar Ivanisevic
fuente
-1

UTILIZAR:

echo password | sudo command

Ejemplo:

echo password | sudo apt-get update; whoami

Espero eso ayude..

Sarat Chandra
fuente
-2

Puede proporcionar la contraseña como parámetro para esperar el script.

Marko
fuente
-11
su -c "Command" < "Password"

Espero que sea útil.

Shankar
fuente
1
No es. "su: debe ejecutarse desde un terminal" es la respuesta a esto.
thelogix