2012-01-31 17 views
15

En mi script de shell estoy ejecutando un comando que me pide su opinión.¿Hay alguna manera de ingresar automáticamente al ejecutar un shell?

¿Cómo puedo darle al comando la entrada que necesita automáticamente?

Por ejemplo:

$cat test.sh 
ssh-copy-id [email protected] 

Cuando se ejecuta test.sh:

  • En primer lugar, se le preguntará:

    Are you sure you want to continue connecting (yes/no)?

  • Entonces, que me va a pedir que ingrese la contraseña:

    [email protected]'s password:

¿Hay una manera de entrada de este de forma automática?

Respuesta

8

Para la automatización general de línea de comandos, Expect es la herramienta clásica. O pruebe pexpect si está más cómodo con Python.

aquí hay una pregunta similar que sugiere el uso Esperar: Use expect in bash script to provide password to SSH command

+0

Realmente deberíamos dejar de promocionar esperar como una forma de automatizar ssh. Ssh intencionalmente hace que estas indicaciones sean difíciles de automatizar para empujarnos a utilizar las soluciones correctas: indicadores de línea de comando para eludir confirmaciones y claves públicas/privadas para eliminar las solicitudes de contraseña. –

+1

Eso es ideal, pero el mundo real a menudo no es ideal. Para la pregunta que se plantea, esa es la forma típica de hacerlo.Si usó claves, probablemente también quiera una contraseña en su clave, y entonces puede estar en la misma situación. Claro, podrías 'ssh-agent',' keychain', etc. pero a veces hay razones que son inconvenientes o poco prácticas. – jjlin

7

Hay sin duda se ... Utilice el desove, esperar, y enviar comandos:

Hay más ejemplos de todo desbordamiento de pila, consulte: Help with Expect within a bash script

Es posible que tenga que instalar estos comandos primero, dependiendo de su sistema.

+0

Realmente deberíamos dejar de promocionar esperar como una forma de automatizar ssh. Ssh intencionalmente hace que estas indicaciones sean difíciles de automatizar para empujarnos a utilizar las soluciones correctas: indicadores de línea de comando para eludir confirmaciones y claves públicas/privadas para eliminar las solicitudes de contraseña. –

14

Para la entrada simple, como dos solicitudes y dos respuestas fijas correspondientes, también se puede utilizar un "aquí el documento", la sintaxis de los cuales se ve así:

test.sh <<! 
y 
pasword 
! 

Los < < prefijos un patrón, en este caso '!'. Todo hasta una línea que comienza con ese patrón se interpreta como entrada estándar. Este enfoque es similar a la sugerencia de canalizar un eco multilínea en ssh, excepto que guarda el fork/exec del comando echo y lo encuentro un poco más legible. La otra ventaja es que usa una función de shell incorporada, por lo que no depende de lo esperado.

+0

Lo llevo de vuelta, ssh pide a través de un dispositivo tty, que pasa por alto stdin. En palabras de Emily Litella, "no importa". :) –

+0

más simple, así que mejor – Abid

0

ssh-clave con la frase de contraseña, con llavero

llavero es una pequeña utilidad que administra ssh-agente en su nombre y permite que el ssh-agente permanezca funcionando al terminar la sesión de inicio de sesión. En inicios de sesión posteriores, keychain se conectará a la instancia existente de ssh-agent. En la práctica, esto significa que la frase de contraseña debe ingresarse solo durante el primer inicio de sesión después de reiniciar. En los inicios de sesión posteriores, se utiliza la clave no encriptada de la instancia existente de ssh-agent. Esto también puede ser útil para permitir la autenticación RSA/DSA sin contraseña en trabajos cron sin claves ssh sin contraseña.

Para habilitar el llavero, instálelo y agregue algo como lo siguiente a ~ /.bash_profile:

eval keychain --agents ssh --eval id_rsa Desde el punto de vista de la seguridad, ssh-ident llavero y son peores que las instancias ssh-agente limitado a la duración de una sesión en particular, sino que ofrecen un alto nivel de comodidad. Para mejorar la seguridad de keychain, algunas personas agregan la opción --clear a su invocación de cadena ~/.bash_profile. Al hacer esto, las contraseñas deben reingresarse al iniciar sesión como se indicó anteriormente, pero las tareas cron seguirán teniendo acceso a las claves no encriptadas después de que el usuario cierre la sesión. La página wiki de keychain tiene más información y ejemplos.

Obtuve esta información de;

https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt

Esperanza esto ayuda

he podido constatar personalmente para introducir automáticamente mi frase de contraseña en el lanzamiento del terminal al hacer esto: (se puede, por supuesto, modificar el guión y ajustarlo a sus necesidades)

  1. edite el archivo bashrc para agregar este script;

    Comprobar si el agente SSH está despierto

    if [-z "$ SSH_AUTH_SOCK"]; entonces exec ssh-agent fiesta -c "ssh-add; $ 0" echo "El agente SSH fue despertado" salida fi

    Por encima de la línea se iniciará la secuencia de comandos esperar al lanzamiento del terminal.

    ./ssh.exp

aquí es el contenido de esta secuencia de comandos esperar

#!/usr/bin/expect 

set timeout 20 

set passphrase "test" 

spawn "./keyadding.sh" 

expect "Enter passphrase for /the/path/of/yourkey_id_rsa:" 

send "$passphrase\r"; 

interact 

Aquí es el contenido de mi guión keyadding.sh (hay que poner las dos secuencias de comandos en la carpeta de inicio, generalmente/home/usuario)

#!/bin/bash 

ssh-add /the/path/of/yourkey_id_rsa 

exit 0 

te sugeriría altamente cifrado de la pa ssword en el script .exp, así como el cambio de nombre de este archivo .exp a algo como term_boot.exp o cualquier otra cosa por motivos de seguridad. No olvide crear los archivos directamente desde la terminal usando nano o vim (por ejemplo, nano ~/.bashrc | nano term_boot.exp) y también chmod +x script.sh para hacerlo ejecutable. Un chmod +r term_boot.exp también sería útil, pero deberá agregar sudo antes de ./ssh.exp en su archivo bashrc. Por lo tanto, deberá ingresar su contraseña de sudo cada vez que lance su terminal. Para mí, es más conveniente que la frase de contraseña porque recuerdo mi contraseña de administrador (sudo) en el hogar.

Además, he aquí otra manera de hacerlo, creo; https://www.cyberciti.biz/faq/noninteractive-shell-script-ssh-password-provider/

Sin duda, cambiaré mi método para este cuando tenga el tiempo.

Cuestiones relacionadas