Pregunta

Estoy escribiendo un programa C Shell que estará haciendo su o sudo o ssh . Todos quieren sus contraseñas en la entrada de la consola (TTY) en lugar de la entrada estándar o la línea de comandos.

¿Alguien sabe una solución?

La configuración de sudo sin contraseña no es una opción.

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

¿Fue útil?

Solución

Para sudo hay una opción -S para aceptar la contraseña de 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 te 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 han mencionado otros, el " espera " La utilidad parece estar dirigida a resolver este dilema, pero en última instancia, configurar la autorización correcta de la clave privada es la forma correcta de hacerlo al intentar automatizar esto.

Otros consejos

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

echo <password> | sudo -S <command>

No estoy seguro de si esto ayuda.

Sería bueno si sudo aceptara una contraseña precifrada, así podría cifrarla dentro de mi script y no preocuparme por repetir las contraseñas de texto claro. Sin embargo, esto funciona para mí y para mi situación.

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

Tengo:

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

Funciona para mí.

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 teclas ssh, podrá realizar un ssh remote_user @ other_host silencioso desde su host local.

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

Sudo no debe usarse 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, se puede usar ssh sin solicitar una contraseña.

Para sudo, también puedes hacer esto:

sudo -S <<< "password" command

Cuando no hay una opción mejor (como lo sugieren otros), entonces 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 de pty, setsid, ctty es necesaria y, si bien es posible que no necesite dormir tanto tiempo, tendrá que dormir. También vale la pena mirar la opción echo = 0, ya que pasa el comando remoto en la línea de comandos de ssh.

¿Quizás pueda usar el comando expect ?:

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

Ese comando da la contraseña automáticamente.

Eche un vistazo a la utilidad de linux expect .

Le permite enviar salidas a stdio basándose en la simple coincidencia de patrones en stdin.

Configure SSH para la autenticación de clave pública, sin contraseña en la clave. Cargas 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.

ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

Tuve el mismo problema. script de diálogo para crear un directorio en una 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

USO:

echo password | sudo command

Ejemplo:

echo password | sudo apt-get update; whoami

Espero que ayude ..

Sobre la base de la respuesta de @Jahid, esto me funcionó en macOS 10.13:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers

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

echo <password> | su -c <command> <user> 

Esto está funcionando.

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

Una forma sería usar la opción de lectura-s ... de esta manera, los caracteres de la contraseña no volverán a aparecer 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 /

su -c "Command" < "Password"

Espero que sea útil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top