236 votes

Entrer automatiquement le mot de passe SSH avec script.

Je dois créer un script qui saisit automatiquement un mot de passe à OpenSSH. ssh client.

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 puis-je intégrer cette fonctionnalité dans un script ?

321voto

o0110o Points 744

Vous devez d'abord installer sshpass .

  • Ubuntu/Debian : apt-get install sshpass
  • Fedora/CentOS : yum install sshpass
  • Arch : pacman -S sshpass

Ejemplo:

sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM

Exemple de port personnalisé :

sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM:2400

Notes :

  • sshpass peut également lire un mot de passe à partir d'un fichier lorsque l'option -f est passé.
    • Utilisation de -f empêche le mot de passe d'être visible si le ps est exécutée.
    • Le fichier dans lequel le mot de passe est stocké doit avoir des autorisations sécurisées.

13 votes

C'est bien mieux que d'utiliser Expect.

6 votes

Sachez simplement que si sshpass bloque votre mot de passe à partir de commandes telles que ps -aux vous ne devriez normalement pas exécuter de commandes en tapant votre mot de passe, car d'autres utilisateurs sur le même ordinateur peuvent être en mesure de voir le mot de passe en exécutant la commande suivante ps -aux . si c'est possible, vous pouvez également utiliser l'authentification par clé publique à la place, comme mentionné dans l'autre réponse. cela vous permet de séparer les informations d'authentification de votre script afin que vous puissiez partager votre script avec d'autres sans souci, et décider plus tard d'activer le cryptage sur votre dossier ~/.ssh sans crypter également votre script.

2 votes

Malheureusement, cela ne fonctionne pas pour moi sur un serveur avec un port ssh personnalisé... pourquoi ssh ne peut pas simplement nous donner l'option d'insérer le mot de passe dans la ligne de commande ?

84voto

diegows Points 3102

Utilisez l'authentification par clé publique : https://help.ubuntu.com/community/SSH/OpenSSH/Keys

Dans l'hôte source, exécutez cette opération une seule fois :

ssh-keygen -t rsa # ENTER to every field
ssh-copy-id myname@somehost

C'est tout, après cela vous serez en mesure de faire ssh sans mot de passe.

27 votes

Je vois. Mais je suis obligé de faire un ssh avec un mot de passe. C'est parce que, "je" peux avoir le script sur une clé USB et avoir besoin de l'exécuter depuis n'importe quel ordinateur ; tout en ne désactivant pas la nécessité du mot de passe.

1 votes

Vous pouvez également stocker la clé privée sur ladite clé USB.

3 votes

@user1467855, je pense que vous devez mieux expliquer vos besoins. Personne ne suggère que vous avez un réseau non sécurisé. Dans l'approche à clé publique, il serait toujours possible aux utilisateurs de se connecter avec le mot de passe. Mais vous copieriez la clé privée sur votre clé USB, ce qui signifie que la clé USB serait la seule chose qui pourrait se connecter sans mot de passe.

31voto

Lipongo Points 621

Vous pourriez utiliser un expects script. Je n'en ai pas écrit un depuis un certain temps mais cela devrait ressembler à ce qui suit. Vous aurez besoin de mettre en tête du script avec #!/usr/bin/expect

#!/usr/bin/expect -f
spawn ssh HOSTNAME
expect "login:" 
send "username\r"
expect "Password:"
send "password\r"
interact

2 votes

J'ai fait ce que vous avez suggéré mais j'obtiens les erreurs suivantes : /bin/myssh.sh: 2: spawn: not found /bin/myssh.sh: 3: expect: not found /bin/myssh.sh: 4: send: not found /bin/myssh.sh: 5: expect: not found /bin/myssh.sh: 6: send: not found

0 votes

Merci Aaron d'avoir modifié ma réponse pour qu'elle soit correcte. Vous pouvez avoir besoin d'exécuter la commande ci-dessous pour trouver le chemin correct à mettre pour expect. which expect

1 votes

Vous pouvez également utiliser cette ligne de shebang : #!/usr/bin/env expect

1voto

user3466888 Points 1

Je l'ai fait fonctionner comme suit

.ssh/config a été modifié pour éliminer l'invite oui/non - je suis derrière un pare-feu donc je ne m'inquiète pas des clés ssh usurpées.

host *
     StrictHostKeyChecking no

Créez un fichier de réponse pour le fichier expect, c'est-à-dire 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

Créez votre script bash et appelez simplement expect 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

Actualisation de 128 nœuds de données hadoop avec la nouvelle configuration - en supposant que vous utilisez un montage NFS pour les fichiers hadoop/conf.

J'espère que cela pourra aider quelqu'un - je suis un engourdi de Windows et cela m'a pris environ 5 heures à comprendre !

1 votes

"Je suis derrière un pare-feu, donc je ne m'inquiète pas des clés ssh usurpées". Un pare-feu ne fait rien dans ce cas. Le HostKeyCheck vous permet de vérifier que l'hôte à l'autre bout n'est pas un hôte troyen. C'est-à-dire un hôte qui fait semblant d'être celui auquel vous voulez vous connecter. Si vous vous connectez à un hôte inconnu et que vous faites quelque chose de sensible, comme écrire un fichier contenant des informations d'identification ou un jeton, ou encore saisir un mot de passe, cette information est désormais connue de tous. Le fait que vous soyez derrière un pare-feu n'a aucune importance.

-2voto

ernie Points 4413

Pour que l'échange de clés fonctionne à partir d'une clé USB, vous devez copier votre clé privée sur votre disque, et la spécifier dans votre commande ssh (pour éviter d'utiliser la clé privée du compte local), par exemple :

ssh -i id_rsa host

Alternativement, vous pouvez utiliser expect (qui est un script distinct de shell). Voici un question précédente concernant SSH et attendre .

Notez que n'importe qui pourra ouvrir le script attendu et voir les identifiants de connexion en clair.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X