web-dev-qa-db-fra.com

Comment automatiser la connexion SSH avec un mot de passe?

Comment automatiser la connexion SSH avec un mot de passe? Je configure ma machine virtuelle de test, donc une sécurité élevée n'est pas prise en compte. SSH choisi pour une sécurité acceptable avec une configuration minimale.

ex)

echo password | ssh id@server

Ça ne marche pas.

Je me souviens avoir fait ça avec quelques tours que quelqu'un m'a guidés, mais je ne me souviens plus du tour que j'ai utilisé ...

462
Eonil

N'utilisez pas de mot de passe. Générez une clé SSH sans mot de passe et envoyez-la sur votre machine virtuelle.

Si vous avez déjà une clé SSH, vous pouvez ignorer cette étape… Appuyez simplement sur Enter pour la clé et les deux mots de passe:

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.

Copiez vos clés sur le serveur cible:

$ ssh-copy-id id@server
id@server's password: 

Maintenant, essayez de vous connecter à la machine, avec ssh 'id@server', et enregistrez-vous:

.ssh/authorized_keys

pour nous assurer que nous n'avons pas ajouté de clés supplémentaires auxquelles vous ne vous attendiez pas.

Enfin, vérifiez la connexion…

$ ssh id@server

id@server:~$ 

Vous pouvez également envisager d'utiliser ssh-agent si vous voulez essayer de protéger vos clés avec une phrase secrète.

404
Cakemox
$ Sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname
637
weekens

Bien que la bonne réponse à votre question soit sshpass ( voir les autres réponses pour plus de détails ), il existe un moyen plus sûr - SSH clés. Vous n'êtes qu'à trois étapes faciles de la solution:

Entrez la commande suivante pour commencer à générer une paire de clés rsa :

# ssh-keygen

Lorsque le message "Entrez le fichier dans lequel enregistrer la clé" apparaît, laissez simplement le nom de fichier vide en appuyant sur Entrée.

Lorsque le terminal vous demande de saisir un mot de passe, laissez simplement ce champ vide et appuyez sur Entrée.

Copiez ensuite la paire de clés sur le serveur avec une simple commande :

# ssh-copy-id userid@hostname

vous pouvez maintenant vous connecter sans mot de passe :

# ssh userid@hostname
74
lzap

Utilisation attendez:

#!/usr/bin/expect -f
#  ./ssh.exp password 192.168.1.11 id
set pass [lrange $argv 0 0]
set server [lrange $argv 1 1]
set name [lrange $argv 2 2]

spawn ssh $name@$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact

Exemple:

# ./1.ex password localhost ooshro
spawn ssh ooshro@localhost
ooshro@localhost's password: 
Linux ubuntu-1010-server-01 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar  1 12:41:12 2011 from localhost
42
ooshro

Je suis surpris que personne n'ait mentionné plink du PuTTY-tools package dans Ubuntu:

plink user@domain -pw mypass  [cmd]

Il est également disponible sur Windows et la syntaxe est principalement compatible avec le client openssh.

17
eadmaster

Cela peut ne pas vous être utile, mais vous pouvez le faire avec Perl:

\#!/usr/bin/Perl  
use warnings;  
use strict;  

use Net::SSH::Perl;  
my $Host = 'remote.serv.er';  
my $user = 'root';  
my $pass = 'hunter2';  
my $ssh = Net::SSH::Perl->new('$Host');  
$ssh->login('$user', '$pass') or die "Oh noes! $!";
16
James L

La connexion unique SSH est généralement réalisée avec l'authentification par clé publique et un agent d'authentification. Vous pouvez facilement ajouter votre test VM à un agent d'authentification existant (voir l'exemple ci-dessous). D'autres méthodes telles que gssapi/kerberos existent mais sont plus complexes.

sshpass

Dans les situations où password est la seule méthode d'authentification disponible, sshpass peut être utilisé pour saisir automatiquement le mot de passe. Veuillez prêter une attention particulière à la section CONSIDÉRATIONS DE SÉCURITÉ de la page de manuel . Dans les trois options, le mot de passe est visible ou stocké en texte clair à un moment donné :

Pipe anonyme (recommandée par sshpass)

# Create a pipe
PIPE=$(mktemp -u)
mkfifo -m 600 $PIPE
# Attach it to file descriptior 3
exec 3<>$PIPE
# Delete the directory entry
rm $PIPE
# Write your password in the pipe
 echo 'my_secret_password' >&3
# Connect with sshpass -d
sshpass -d3 ssh user@Host

# Close the pipe when done
exec 3>&-

C'est assez lourd en bash, sans doute plus facile avec les langages de programmation. Un autre processus pourrait être attaché à votre pipe/fd avant que le mot de passe ne soit écrit. La fenêtre d'opportunité est assez courte et limitée à vos processus ou root.

Variable d'environnement

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@Host

Vous et root pouvez lire les variables d'environnement de votre processus (c'est-à-dire votre mot de passe) pendant l'exécution de sshpass (cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=). La fenêtre d'opportunité est beaucoup plus longue mais toujours limitée à vos propres processus ou root, pas aux autres utilisateurs.

Argument de ligne de commande (le moins sécurisé)

 sshpass -p my_secret_password ssh user@Host

C'est pratique mais moins sécurisé comme décrit dans la page de manuel. Les arguments de la ligne de commande sont visibles par tous les utilisateurs (par exemple, ps -ef | grep sshpass). sshpass tente de masquer l'argument, mais il y a toujours une fenêtre pendant laquelle tous les utilisateurs peuvent voir votre mot de passe passé par argument.

Note latérale

Définissez votre bash variable HISTCONTROL sur ignorespace ou ignoreboth et préfixez vos commandes sensibles avec un espace. Ils ne seront pas enregistrés dans l'histoire.


Authentification par clé publique SSH

# Generate a key pair
# Do NOT leave the passphrase empty
ssh-keygen
# Copy it to the remote Host (added to .ssh/authorized_keys)
ssh-copy-id user@Host

La phrase secrète est très importante. Quiconque en quelque sorte obtenant le fichier de clé privée ne pourra pas l'utiliser sans la phrase secrète.

Configurer l'agent d'authentification SSH

# Start the agent
eval `ssh-agent`
# Add the identity (private key) to the agent
ssh-add /path/to/private-key
# Enter key passphrase (one time only, while the agent is running)

Connectez-vous comme d'habitude

ssh user@Host

L'avantage est que votre clé privée est cryptée et vous n'avez besoin de saisir sa phrase secrète qu'une seule fois (via une méthode de saisie plus sûre également).

12
nrolans

Bien sûr, vous ne voulez pas utiliser de clés SSH plutôt que des mots de passe? De cette façon, il est à la fois sécurisé et automatique.

8
Coops

Selon vos besoins en automatisation, Ansible pourrait peut-être vous convenir. Il peut très bien gérer des choses comme l'invite de mot de passe, l'invite de mot de passe Sudo, diverses façons de changer l'utilisation, en utilisant en toute sécurité des secrets chiffrés (coffre-fort).

Si cela ne convient pas, je suggérerais Expect, comme suggéré dans une autre réponse.

4
Cameron Kerr

Je préfère passhhttps://github.com/clarkwang/passh

sshpass est cassé par conception.

lorsque le serveur ssh n'est pas déjà ajouté dans mon known_hosts, sshpass ne m'affichera pas le message pour ajouter le serveur à mes hôtes connus, passh n'a pas ce problème.

Connectez-vous à un serveur distant:

$ passh -p password ssh user@Host
1
Badr Elmers