Entrer automatiquement le mot de passe SSH avec le script
je dois créer un script qui entre automatiquement un mot de passe pour le client OpenSSH ssh
.
disons que j'ai besoin de SSH dans myname@somehost
avec le mot de passe a1234b
.
j'ai déjà essayé...
#~/bin/myssh.sh
ssh myname@somehost
a1234b
...mais cela ne fonctionne pas.
comment intégrer cette fonctionnalité dans un script?
13 réponses
vous devez d'abord installer sshpass .
- Ubuntu / Debian:
apt-get install sshpass
- Fedora / CentOS:
yum install sshpass
- Arch:
pacman -S sshpass
exemple:
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM
port Personnalisé exemple:
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM:2400
utiliser authentification par clé publique: https://help.ubuntu.com/community/SSH/OpenSSH/Keys
dans l'hôte source exécutez ceci une seule fois:
ssh-keygen -t rsa # ENTER to every field
ssh-copy-id myname@somehost
C'est tout, après ça vous pourrez faire ssh sans mot de passe.
après avoir cherché une réponse à la question pendant des mois, je trouve enfin la meilleure solution: écrire un script 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
mettez-le sur /usr/bin/exp
, alors vous pouvez utiliser:
-
exp <password> ssh <anything>
-
exp <password> scp <anysrc> <anydst>
fait!
vous pouvez utiliser un script expects. Je n'en ai pas écrit un depuis longtemps mais il devrait ressembler à ci-dessous. Vous devrez diriger le script avec #!/usr/bin/expect
#!/usr/bin/expect -f
spawn ssh HOSTNAME
expect "login:"
send "username\r"
expect "Password:"
send "password\r"
interact
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 root@owned.com -p 22
sshpass
avec une meilleure sécurité
j'ai trébuché sur ce fil tout en cherchant un moyen de ssh dans un serveur bogué -- il a fallu plus d'une minute pour traiter la tentative de connexion SSH, et chronométré avant de pouvoir entrer un mot de passe. Dans ce cas, je voulais être en mesure de fournir mon mot de passe immédiatement lorsque l'invite était disponible.
(et si ce n'est pas douloureusement clair: avec un serveur dans cet état, c'est beaucoup trop la fin de configurer une clé publique de connexion.)
sshpass
à la rescousse. Cependant, il y a de meilleures façons d'y arriver que sshpass -p
.
mon implémentation passe directement à l'invite de mots de passe interactifs (pas de temps perdu à voir si l'échange de clés publiques peut se produire), et ne révèle jamais le mot de passe en texte clair.
#!/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
sshpass + autossh
un joli bonus du déjà mentionné sshpass
est que vous pouvez l'utiliser avec autossh
, éliminant encore plus de l'inefficacité interactive.
sshpass -p mypassword autossh -M0 -t myusername@myserver.mydomain.com
cela permettra autoreconnect si, par exemple votre wifi est interrompu par la fermeture de votre ordinateur portable.
j'ai obtenu ce travail comme suit:
.SSH / config a été modifié pour éliminer l'invite Oui/Non - Je suis derrière un pare-feu donc je ne suis pas inquiet de clés SSH usurpées
host *
StrictHostKeyChecking no
créer un fichier de réponse pour expect I. answer.s'attendre à
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
créez votre script bash et appelez expectate dans le fichier
#!/bin/bash
i=1
while [$i -lt 129] # a few nodes here
expect answer.expect hadoopslave$i
i=[$i + 1]
sleep 5
done
obtient 128 hadoop datanodes rafraîchi avec la nouvelle config-en supposant que vous utilisent un montage NFS pour les fichiers hadoop/conf
Espérons que cela aide quelqu'un, je suis un Windows numpty et cela m'a pris environ 5 heures pour comprendre!
j'ai une meilleure solution qui inclut la connexion avec votre compte que le changement à l'utilisateur root. C'est un script bash
http://felipeferreira.net/index.php/2011/09/ssh-automatic-login /
la réponse de @abbotto n'a pas fonctionné pour moi, a dû faire certaines choses différemment:
- yum install sshpass changé en - rpm-ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/sshpass-1.05-1.el6.x86_64.rpm
- la commande à utiliser sshpass changé à sshpass -p "pass" ssh utilisateur@monsite -p 2122
pour que l'échange de clés fonctionne à partir d'une clé USB, vous devez copier votre clé privée sur votre lecteur, et la spécifier dans votre commande ssh (pour éviter d'utiliser la clé privée des comptes locaux), par exemple:
ssh -i id_rsa host
alternativement, vous pouvez utiliser expect (qui est un script séparé de shell). Voici une question précédente concernant SSH et attendez-vous à .
notez que n'importe qui pourra ouvrir le script expect et voir le identifiants de connexion en texte clair.
pour connecter une machine distante à travers des scripts shell, utilisez la commande suivante:
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@IPADDRESS
où IPADDRESS
, USERNAME
et PASSWORD
sont des valeurs d'entrée qui doivent être fournies en script, ou si nous voulons fournir en exécution, utilisez la commande "lire".