linux - servidor - Ingrese automáticamente la contraseña de SSH con la secuencia de comandos
ssh comando en linux (13)
sshpass combinado con autossh
Una buena ventaja del ya mencionado sshpass
es que puedes usarlo con autossh
, eliminando aún más la ineficiencia interactiva.
sshpass -p mypassword autossh -M0 -t [email protected]
Esto permitirá la reconexión automática si, por ejemplo, su wifi se interrumpe al cerrar su computadora portátil.
Necesito crear una secuencia de comandos que ingrese automáticamente una contraseña para el cliente OpenSSH ssh
.
Digamos que necesito SSH en myname@somehost
con la contraseña a1234b
.
Ya lo intenté ...
#~/bin/myssh.sh
ssh myname@somehost
a1234b
...Pero esto no funciona.
¿Cómo puedo obtener esta funcionalidad en un script?
sshpass
con mejor seguridad
Me tropecé con este hilo mientras buscaba una manera de entrar en un servidor empantanado: me tomó más de un minuto procesar el intento de conexión SSH, y agotó el tiempo de espera antes de poder ingresar una contraseña. En este caso, quería poder proporcionar mi contraseña de inmediato cuando el mensaje estaba disponible.
(Y si no es dolorosamente claro: con un servidor en este estado, es demasiado tarde para configurar un inicio de sesión con clave pública).
sshpass
al rescate. Sin embargo, hay mejores formas de sshpass -p
que con sshpass -p
.
Mi implementación salta directamente a la solicitud de contraseña interactiva (no se pierde tiempo viendo si puede ocurrir el intercambio de claves públicas), y nunca revela la contraseña como texto sin formato.
#!/bin/sh
# preempt-ssh.sh
# usage: same arguments that you''d pass to ssh normally
echo "You''re going to run (with our additions) ssh $@"
# Read password interactively and save it to the environment
read -s -p "Password to use: " SSHPASS
export SSHPASS
# have sshpass load the password from the environment, and skip public key auth
# all other args come directly from the input
sshpass -e ssh -o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no "$@"
# clear the exported variable containing the password
unset SSHPASS
Después de buscar una respuesta para la pregunta durante meses, finalmente encuentro la mejor solución: escribir un guión simple.
#!/usr/bin/expect
set timeout 20
set cmd [lrange $argv 1 end]
set password [lindex $argv 0]
eval spawn $cmd
expect "assword:"
send "$password/r";
interact
Ponlo en /usr/bin/exp
, luego puedes usar:
-
exp <password> ssh <anything>
-
exp <password> scp <anysrc> <anydst>
¡Hecho!
La respuesta de @abbotto no funcionó para mí, tenía que hacer algunas cosas de manera diferente:
- yum install sshpass cambiado a - rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/sshpass-1.05-1.el6.x86_64.rpm
- el comando para usar sshpass ha cambiado a - sshpass -p "pass" ssh user @ mysite -p 2122
Lo hice funcionar de la siguiente manera
.ssh / config se modificó para eliminar el mensaje sí / no - Estoy detrás de un firewall así que no me preocupan las claves ssh falsificadas
host *
StrictHostKeyChecking no
Crea un archivo de respuesta para esperar, es decir, answer.expect
set timeout 20
set node [lindex $argv 0]
spawn ssh root@node service hadoop-hdfs-datanode restart
expect "*?assword {
send "password/r" <- your password here.
interact
Crea tu script bash y solo espera en el archivo
#!/bin/bash
i=1
while [$i -lt 129] # a few nodes here
expect answer.expect hadoopslave$i
i=[$i + 1]
sleep 5
done
Obtiene 128 nodos de datos de hadoop actualizados con nueva configuración, suponiendo que esté utilizando un montaje NFS para los archivos hadoop / conf
Espero que esto ayude a alguien. ¡Soy un idiota de Windows y me tomó alrededor de 5 horas descubrirlo!
Para conectar una máquina remota a través de scripts de shell, use el siguiente comando:
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@IPADDRESS
donde IPADDRESS
, USERNAME
y PASSWORD
son valores de entrada que deben proporcionarse en script, o si queremos proporcionar en tiempo de ejecución use el comando "leer".
Para que el intercambio de claves funcione desde una unidad de almacenamiento, debe copiar su clave privada en la unidad y especificarla en su comando ssh (para evitar el uso de la clave privada de cuentas locales), por ejemplo:
ssh -i id_rsa host
Alternativamente, puede usar expect (que es un script separado del shell). Aquí hay una pregunta previa sobre SSH y esperar .
Tenga en cuenta que cualquier persona podrá abrir el script de espera y ver las credenciales de inicio de sesión en texto sin formato.
Podría usar un script de espera. No he escrito uno en bastante tiempo, pero debería verse a continuación. Tendrá que encabezar el script con #! / Usr / bin / expect
#!/usr/bin/expect -f
spawn ssh HOSTNAME
expect "login:"
send "username/r"
expect "Password:"
send "password/r"
interact
Primero necesita instalar sshpass .
- Ubuntu / Debian:
apt-get install sshpass
- Fedora / CentOS:
yum install sshpass
- Arco:
pacman -S sshpass
Ejemplo:
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM
Ejemplo de puerto personalizado:
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM:2400
Notas:
-
sshpass
también puede leer una contraseña de un archivo cuando se pasa elsshpass
-f
.- El uso de
-f
evita que la contraseña sea visible si se ejecuta el comandops
. - El archivo en el que se almacena la contraseña debe tener permisos seguros.
- El uso de
Tengo una mejor solución que incluye el inicio de sesión con su cuenta que cambiar a usuario root. Es un script bash
http://felipeferreira.net/index.php/2011/09/ssh-automatic-login/
Use la autenticación de clave pública: https://help.ubuntu.com/community/SSH/OpenSSH/Keys
En el host de origen, ejecute esto solo una vez:
ssh-keygen -t rsa # ENTER to every field
ssh-copy-id myname@somehost
Eso es todo, después de eso podrás hacer ssh sin contraseña.
Variante I
sshpass -p PASSWORD ssh USER@SERVER
Variante II
#!/usr/bin/expect -f
spawn ssh USERNAME@SERVER "touch /home/user/ssh_example"
expect "assword:"
send "PASSWORD/r"
interact
# create a file that echo''s out your password .. you may need to get crazy with escape chars or for extra credit put ASCII in your password...
echo "echo YerPasswordhere" > /tmp/1
chmod 777 /tmp/1
# sets some vars for ssh to play nice with something to do with GUI but here we are using it to pass creds.
export SSH_ASKPASS="/tmp/1"
export DISPLAY=YOURDOINGITWRONG
setsid ssh [email protected] -p 22