Script Shell pour se connecter à un serveur ssh


29

J'ai essayé d'écrire un script shell qui peut se connecter automatiquement à un serveur ssh en utilisant un mot de passe qui est mentionné dans le script. J'ai écrit le code suivant:

set timeout 30
/usr/bin/ssh -p 8484 root@172.31.72.103
expect 
{
   "root@172.31.72.103's password" 
   {
      send "password\r" 
   }
}

Ce code ne fonctionne pas correctement, il demande toujours le mot de passe. Quelqu'un peut-il m'aider à résoudre ce problème



Réponses:


36

J'ai écrit une fois un expectscript pour me connecter à un serveur ssh (comme votre cas) et mon script était quelque chose comme ceci:

#!/usr/bin/expect

spawn ssh MyUserName@192.168.20.20
expect "password"
send "MyPassword\r"
interact

Je pense que peut-être le interactmanque dans votre script.


cela fonctionne parfaitement pour moi et je suis coincé à cet endroit, l'interaction fournit une invite interactive au terminal interactif, mais j'essaie d'automatiser d'autres étapes comme do cdet lset de lire également le contenu du fichier. Est-il possible de le faire après avoir interagi? Veuillez répondre
Hansiemithun

@Hansie, vous pouvez envoyer une lscommande après la connexion. Par exemple, après l'envoi du mot de passe, faites une expectavec le texte de l'invite de commande (pour vous assurer que vous êtes connecté), puis send "ls\r". Tout cela va avant interact.
saeedn

la question était légèrement incorrecte et je suis désolé après avoir fait ls et lu le contenu, je peux imprimer la même chose. Mais comment extraire cela de la session ssh dans une variable à laquelle accéder depuis la machine locale. ref: stackoverflow.com/questions/32341234/expect-script-return-value . Mais la sortie ne fonctionne pas pour moi. Ma question a posté: stackoverflow.com/questions/51628465/… . J'ai besoin file_listaprès la sortie pour accéder à l'invite de commande locale
Hansiemithun

31

Vous vous y trompez. Ce que vous voulez faire, c'est générer une paire de clés ssh sans mot de passe, puis (tant que le serveur prend en charge l'authentification par clé RSA), vous pouvez entrer sans avoir à taper un mot de passe pour tous. Il s'agit d'un risque pour la sécurité si votre clé privée est stockée dans un endroit où elle pourrait être volée.

Suivez ces étapes:

  1. mkdir -p ~/.ssh
  2. cd ~/.ssh
  3. ssh-keygen -type dsa -i mysshkeys
  4. Appuyez sur Returnlorsque vous êtes invité à saisir la phrase secrète
  5. Appuyez Returnune deuxième fois pour confirmer.

Il y aura maintenant deux fichiers dans votre ~/.sshrépertoire, mysshkey.pubet mysshkey. mysshkey.pubest votre clé publique, celle-ci est sûre à mettre sur des serveurs distants. mysshkeyest votre clé privée sans mot de passe, il n'est pas sûr de placer sur des serveurs distants (ou ailleurs, quelqu'un d'autre pourrait obtenir une copie).

Sur le serveur sur lequel vous souhaitez vous connecter:

  1. Connectez-vous au serveur distant
  2. mkdir -p ~/.ssh
  3. Copiez et collez le contenu de mysshkey.pubdans~/.ssh/authorized_keys
  4. Assurez - vous que ~/.ssh/authorized_keysest - chmod« d à600

Maintenant, pour le mettre en action sur votre machine locale, vous exécutez la commande suivante:

ssh -i ~/.ssh/mysshkey <remote_server_ip>

Et vous serez connecté sans être invité à entrer un mot de passe.

Il s'agit d'une méthode bien préférable pour gérer les connexions automatisées car vous ne finissez pas par coder en dur votre mot de passe à plusieurs endroits qui doivent être mis à jour si vous le changez.


2
J'utiliserais des clés RSA plutôt que DSA. Mais à part ça, tout à fait d'accord.
glglgl

12
parfois, vous ne pouvez pas ajouter de clés à l'hôte distant, par exemple des appliances réseau.
DarkHeart

1
J'ai essayé ça. ssh demande toujours un mot de passe. Devez-vous spécifiquement donner une adresse IP? Je l'ai essayé avec <user> @ <domain-name> et juste le nom de domaine.
Jay Bienvenu

Cette commande a dit trop d'arguments? (pour l'étape 3)
Joseph Astrahan

J'ai dû changer pour ssh-keygen -t dsa et entrer manuellement l'emplacement du fichier à la place.
Joseph Astrahan

20

Sur les distributions basées sur Debian, le sshpasspaquet fournit un moyen plus simple de faire ce que vous voulez. Le package est disponible pour de nombreuses autres distributions populaires. Vous devez d'abord le configurer:

echo 'YourPassword' > passwordFile.txt
chmod 600 passwordFile.txt

Ensuite, appelez la commande SSH à partir d'un script comme celui-ci:

sshpass -f /path/to/passwordFile.txt /usr/bin/ssh -p 8484 root@172.31.72.103

Cela offre plus de flexibilité, par exemple si vous utilisez un environnement local différent ou si vous devez changer le mot de passe, que les solutions utilisant expect.


7

Installez d'abord le sshPass sudo apt-get install sshpass

Créez ensuite un alias dans le fichier .bashrc en tant que

alias sshLogin='sshpass -p <your ssh password> ssh username@remote_host'

Rechargez maintenant votre fichier .bashrc modifié en source ~/.bashrc

Vous avez maintenant terminé.

Vous pouvez maintenant exécuter le ssh en utilisant l'alias créé ci-dessus sshLogindans le terminal.



2

Tout ce dont vous avez besoin pour créer une clé hachée et l'enregistrer sur votre PC

Tapez simplement

ssh-keygen -t rsa -b 4096 # just press Enter till the end

puis entrez

ssh-copy-id <user>@<server>

puis connectez-vous normalement en utilisant

ssh <user>@<server>

Maintenant, vous n'avez plus besoin d'un mot de passe

Remarque: L'enregistrement de votre mot de passe en texte brut est dangereux

Cette méthode crée une valeur hachée de votre mot de passe à l'aide de RSA avec une clé publique de longueur 4096 qui est très sécurisée.


1
Cela semble être une répétition de cette réponse .
roaima

#roaima Oui, mais il suggère également la ssh-copy-idcommande incroyablement utile , que personne d'autre n'a mentionnée. Je vote pour cela.
Huw Walters

1

Connexion sans mot de passe SSH en utilisant SSH Keygen en 5 étapes faciles :

Configuration de l'environnement: entrez la description de l'image ici

Étape 1: Authentification SSH-Kegen Keys on - (192.168.0.12) Connectez-vous d'
abord au serveur 192.168.0.12 avec un utilisateur et générez une paire de clés publiques à l'aide de la commande suivante.

entrez la description de l'image ici

Étape 2: Créez le répertoire .ssh sur - 192.168.0.11
Utilisez SSH à partir du serveur 192.168.0.12 pour connecter le serveur 192.168.0.11 pour créer le répertoire .ssh sous celui-ci, en utilisant la commande suivante.

entrez la description de l'image ici

Étape 3: télécharger les clés publiques générées vers - 192.168.0.11
Utilisez SSH à partir du serveur 192.168.0.12 et téléchargez la nouvelle clé publique générée (id_rsa.pub) sur le serveur 192.168.0.11 sous le .sshrépertoire de l'utilisateur en tant que nom de fichier authorized_keys.

entrez la description de l'image ici

Étape 4: définir les autorisations sur - 192.168.0.11
En raison des différentes versions SSH sur les serveurs, nous devons définir des autorisations sur le .sshrépertoire et le authorized_keysfichier.

entrez la description de l'image ici

Étape 5: Connectez - vous du serveur 192.168.0.12 au serveur 192.168.0.11 sans mot de passe
À partir de maintenant, nous pouvons nous connecter à 192.168.0.11 en tant qu'utilisateur sheena à partir du serveur 192.168.0.12 en tant qu'utilisateur tecmint sans mot de passe.

entrez la description de l'image ici


Merci ... cela a fonctionné pour moi, sauf qu'à l'étape 4 j'ai reçu un "avertissement" dramatique: "FICHIER DE CLÉ PRIVÉE NON PROTÉGÉ! ... ... /. Ssh / id_rsa 'sont trop ouverts. ... la clé privée sera ignoré ... mauvaises autorisations ". Je l'ai fait chmod 700 id_rsadans le répertoire .ssh du serveur local (client, ie 192.168.0.12 dans votre exemple): problème résolu
mike rodent


1

Comme déjà décrit dans d'autres réponses, j'utilise également sshpassmais je le combine avec la readcommande pour stocker mon mot de passe dans une variable d'environnement temporaire. De cette façon, mon mot de passe n'est jamais écrit en clair. Voici la commande en ligne que j'utilise:

read -s PASS; sshpass -p $PASS ssh <user>@<host adress>

Après cela, vous devez entrer votre mot de passe (rien n'apparaît à l'écran), puis appuyer sur Entrée ouvrira la connexion.


0

Je l'ai fait récemment, cela peut vous aider:

sshpass -p 'password' username@ipaddress

si cela ne fonctionne pas, vous devrez générer des clés sur l'autre machine avec laquelle vous souhaitez vous connecter

ssh-keygen

il générera des clés privées et publiques et vous demandera un emplacement, laissez vide, il enregistrera les clés dans le dossier .ssh par défaut, il vous demandera une phrase secrète, vous pouvez également le laisser vide dans le dossier .ssh et changer le le nom de la clé publique à «authorized_keys»

cd .ssh/
mv id_rsa.pub authorized_keys
useradd -d /home/username username

cela ajoutera l'utilisateur à la liste maintenant, allez dans le répertoire personnel et donnez l'autorisation et redémarrez les services sshd

chmod 700 /home/username/.ssh
chmod 644 /home/username/.ssh/authorized_keys
chown root:root /home/dozee
sudo service sshd restart

vous devez maintenant déplacer la clé privée vers le système à cet emplacement à partir duquel vous allez exécuter la commande ssh, puis vous pouvez vous connecter avec

sshpass -p 'password' ssh -i id_rsa username@ip

si même cela ne fonctionne pas, allez dans / etc / ssh ouvrez sshd_config avec l'éditeur vim vérifiez si le pubkeyAuthenticatoin est réglé sur oui ou non, sinon changez-le en oui, redémarrez les services sshd et essayez-le, cela fonctionnera certainement .


0

Le premier argument est le nom d'hôte et le second est le mot de passe.

     #!/usr/bin/expect
     set pass [lindex $argv 1]
     set host [lindex $argv 0]
     spawn ssh -t root@$host echo Hello
     expect "*assword: "
     send "$pass\n";
     interact

Exécution: ./script.expect

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.