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é ...
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.
$ Sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname
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
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
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.
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! $!";
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.
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é :
# 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.
# 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.
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.
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.
# 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.
# 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).
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.
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.
Je préfère passh
https://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