2010-09-26 28 views
2

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 ne peux pas le faire fonctionner. Est-ce seulement possible?Puis-je utiliser un heredoc pour entrer un mot de passe dans bash?

#!/bin/bash 
echo -n "Enter Password: " 
read -s password 
ssh myhost << EOL 
$password 
echo "I'm logged onto myhost" 
EOL 
echo done 

C'est ce que je reçois quand je l'essayer:

$ ./testssh 
Enter Password: 
Pseudo-terminal will not be allocated because stdin is not a terminal. 
[email protected]'s password: 
Warning: No xauth data; using fake authentication data for X11 forwarding. 
Warning: no access to tty (Bad file descriptor). 
Thus no job control in this shell. 
mypassword: Command not found. 
I'm logged onto myhost 
done 

EDIT:

Sur la base de la réponse de bmargulies, j'ai retravaillé mon script et est venu avec les éléments suivants:

#!/bin/bash 
echo -n "Enter the Host: " 
read HOST 
echo -n "Enter Username: " 
read USER 
echo -n "Enter Password: " 
read -s PASS 
VAR=$(expect -c " 
spawn ssh [email protected]$HOST 
expect \"password:\" 
send \"$PASS\r\" 
expect \">\" 
send \"ls\r\" 
send \"echo 'I\'m on $HOST'\r\" 
expect -re \"stuff\" 
send \"logout\" 
") 
echo -e "\n\n\n========" 
echo VAR = "$VAR" 
echo done 
+1

Quote votre variable pour préserver les nouvelles lignes: 'echo VAR = « $ VAR "' –

Répondre

3

Les programmes qui lisent les mots de passe ouvrent souvent/dev/tty pour empêcher la redirection. Dans ce cas, l'outil dont vous avez besoin est 'expect', qui va courir derrière un pseudo-tty.

+0

Pouvez-vous jeter un oeil au code dans mon édition? Merci. –

+0

@B Johnson il a été, littéralement, des années depuis que j'attendais. Je vois que Dennis vous a aidé avec les détails. – bmargulies

+3

Gardez à l'esprit que Expect est un langage à usage général qui peut faire tout ce que bash fait, et sans doute plus facilement. Ceux d'entre nous qui ont choisi d'écrire des scripts Expect, par opposition à Expect-embedded-inconfortably-in-bash, évitent beaucoup de «citer l'enfer» évident dans l'exemple ci-dessus. –

0

Si vous mélangez w/perl, vous pouvez faire quelque chose "propre" (d'un non besoin de citer vue) comme ceci:

#!/bin/bash 
cmd="ssh myhost << EOL" 
echo -n "Enter Password: " 
read -s password 
# answer password prompt 
# note we use ctl-A as our quote delimeter around the password so we run 
# no risk of it escaping quotes 
script=' 
use Expect; 
use ysecure; 
my $exp = new Expect; 
$exp->raw_pty(1); 
$exp->spawn(q|<CMD>|); 
$exp->expect(30,">"); 
$exp->send(q^A<PASSWORD>^A . "\n"); 
$exp->soft_close(); 
$exp->exitstatus() && die; 
' 

script=${script//<CMD>/$cmd} 
script=${script//<PASSWORD>/$password} 

perl -e "$script"