3 votes

Puis-je utiliser un "heredoc" pour entrer un mot de passe dans bash ?

Je connais l'authentification RSA, mais pour mes besoins, je veux utiliser un heredoc pour spécifier le mot de passe. Je veux quelque chose comme ce qui suit, mais je n'arrive pas à le faire fonctionner. Est-ce même possible ?

#!/bin/bash
echo -n "Entrez le mot de passe : "
read -s password
ssh myhost << EOL
$password
echo "Je suis connecté à myhost"
EOL
echo terminé

Voici ce que j'obtiens lorsque j'essaie :

$ ./testssh 
Entrez le mot de passe : 
Un pseudo-terminal ne sera pas alloué car l'entrée standard n'est pas un terminal.
Mot de passe de user@myhost : 
Avertissement : Aucune donnée xauth ; utilisation de données d'authentification factices pour la redirection X11.
Avertissement : aucun accès à un terminal (Mauvais descripteur de fichier).
Aucune commande mypassword trouvée.
Je suis connecté à myhost
terminé

MODIFICATION :

En me basant sur la réponse de bmargulies, j'ai retravaillé mon script et j'ai obtenu ce qui suit :

#!/bin/bash
echo -n "Entrez l'hôte : "
read HOST
echo -n "Entrez le nom d'utilisateur : "
read USER
echo -n "Entrez le mot de passe : "
read -s PASS
VAR=$(expect -c "
spawn ssh $USER@$HOST
expect \"Mot de passe : \"
send \"$PASS\r\"
expect \">\"
send \"ls\r\"
send \"echo 'Je suis sur $HOST'\r\"
expect -re \"stuff\"
send \"logout\"
")
echo -e "\n\n\n========"
echo VAR = "$VAR"
echo terminé

4voto

bmargulies Points 49855

Les programmes qui lisent les mots de passe ouvrent souvent spécifiquement /dev/tty pour éviter la redirection. Dans ce cas, l'outil dont vous avez besoin est 'expect', qui s'exécutera en arrière-plan derrière un pseudo-terminal.

0voto

EJ Campbell Points 201

Si vous mélangez avec perl, vous pouvez faire quelque chose de "propre" (d'un point de vue non nécessitant de citer) comme ceci :

#!/bin/bash
cmd="ssh myhost << EOL"
echo -n "Entrez le mot de passe : "
 read -s password
# réponse à la invite du mot de passe
#   notez que nous utilisons ctl-A comme délimiteur de guillemets autour du mot de passe pour éviter
#   tout risque d'échapper aux guillemets
script='
use Expect;
use ysecure;
my $exp = new Expect;
$exp->raw_pty(1);
$exp->spawn(q||);
$exp->expect(30,">");
$exp->send(q^A^A . "\n");
$exp->soft_close();
$exp->exitstatus() && die;
'

script=${script///$cmd}
script=${script///$password}

perl -e "$script"

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