linux - script - ¿Cómo pasar la contraseña a su/sudo/ssh sin anular el TTY?
sudo-i comando (20)
Estoy escribiendo un programa C Shell que hará su
o sudo
o ssh
. Todos quieren sus contraseñas en la entrada de la consola (TTY) en lugar de stdin o la línea de comando.
¿Alguien sabe una solución?
Configurar sudo
sin contraseña no es una opción.
expect podría ser una opción, pero no está presente en mi sistema simplificado.
¿Tal vez puedas usar un comando de expect
?:
expect -c ''spawn ssh [email protected];expect password;send "your-password/n";interact
Ese comando da la contraseña automáticamente.
Configure SSH para Autenticación de clave pública, sin frase en la clave. Un montón de guías en la red. No necesitará una contraseña para iniciar sesión en ese momento. A continuación, puede limitar las conexiones para una clave según el nombre de host del cliente. Proporciona seguridad razonable y es ideal para inicios de sesión automáticos.
Cuando no hay mejor opción (como lo sugirieron otros), entonces el hombre 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 tiempo, necesitará dormir. También vale la pena echar un vistazo a la opción echo = 0, al igual que pasar el comando remoto en la línea de comando de ssh.
Eche un vistazo a la utilidad esperada de Linux.
Le permite enviar salida a stdio en base a la coincidencia de patrones simples en stdin.
Escribí 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, así podría encriptarla dentro de mi script y no preocuparme por repetir las contraseñas de texto claro. Sin embargo, esto funciona para mí y mi situación.
Esto puede hacerse configurando claves públicas / privadas en los hosts objetivo 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ía realizar un ssh remote_user@other_host
desde su host local.
La codificación de una contraseña en un script de espera es lo mismo que tener un sudo sin contraseña, en realidad peor, ya que sudo al menos registra sus comandos.
La solución habitual a este problema es establecer una aplicación de ayuda que realiza la tarea que requiere acceso de superusuario: http://en.wikipedia.org/wiki/Setuid
Sudo no está destinado a ser usado fuera de línea.
Edición posterior: SSH se puede usar con autenticación de clave privada-pública. Si la clave privada no tiene una frase de contraseña, ssh se puede usar sin pedir una contraseña.
Para ssh
puede usar sshpass
: sshpass -p yourpassphrase ssh user@host
.
Solo necesitas descargar sshpass primero :)
$ apt-get install sshpass
$ sshpass -p ''password'' ssh username@server
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, hice muchos intentos para automatizar / guiar su uso sin éxito. No parece haber ninguna forma de incorporar la contraseña en el comando sin preguntar. Como han mencionado otros, la utilidad " expect " parece estar dirigida a abordar este dilema, pero en última instancia, establecer la autorización correcta de clave privada es la forma correcta de proceder cuando se intenta automatizar esto.
Para sudo puedes hacer esto también:
sudo -S <<< "password" command
Puede proporcionar una contraseña como parámetro para esperar el script.
Sobre la base 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
Tengo:
ssh user@host bash -c "echo mypass | sudo -S mycommand"
Funciona para mi.
UTILIZAR:
echo password | sudo command
Ejemplo:
echo password | sudo apt-get update; whoami
Espero eso ayude..
Una forma sería usar la opción de lectura. De esta forma, los caracteres de la contraseña no se repiten en la pantalla. Escribí un pequeño script para algunos casos de uso y puedes verlo en mi blog: http://www.datauniv.com/blogs/2013/02/21/a-quick-little-expect-script/
Yo tuve el mismo problema. secuencia de comandos de diálogo para crear un directorio en la PC remota. el 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
echo <password> | su -c <command> <user>
Esto está funcionando.
ssh -t -t [email protected] << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
su -c "Command" < "Password"
Espero que sea útil.