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?

132
demandé sur Martin Prikryl 2012-08-30 21:45:17

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
199
répondu abbotto 2018-04-18 17:57:34

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.

59
répondu Diego Woitasen 2015-02-19 14:49:21

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!

58
répondu damn_c 2015-02-03 06:59:49

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
22
répondu Lipongo 2018-09-26 04:35:41

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
16
répondu RemiZOffAlex 2015-10-06 11:21:24
# 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

référence: https://www.linkedin.com/pulse/youre-doing-wrong-ssh-plain-text-credentials-robert-mccurdy?trk=mp-reader-card

6
répondu RmccurdyDOTcom 2016-08-03 13:57:17

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
5
répondu Ian 2017-11-20 17:07:16

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.

5
répondu Sridhar-Sarnobat 2018-08-26 20:23:00

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!

1
répondu WT29 2014-03-27 02:57:24

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 /

1
répondu Xoroz 2016-05-24 13:25:38

la réponse de @abbotto n'a pas fonctionné pour moi, a dû faire certaines choses différemment:

  1. yum install sshpass changé en - rpm-ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/sshpass-1.05-1.el6.x86_64.rpm
  2. la commande à utiliser sshpass changé à sshpass -p "pass" ssh utilisateur@monsite -p 2122
1
répondu MustSeeMelons 2016-11-15 14:40:38

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.

-2
répondu ernie 2017-05-23 12:02:48

pour connecter une machine distante à travers des scripts shell, utilisez la commande suivante:

sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@IPADDRESS

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".

-2
répondu shyam 2017-08-11 15:47:12