Могу ли я использовать heredoc для ввода пароля в bash? - PullRequest
3 голосов
/ 26 сентября 2010

Я знаю об аутентификации RSA, но для своих целей я хочу использовать heredoc для указания пароля.Я хочу что-то вроде следующего, но я не могу заставить его работать.Это вообще возможно?

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

Вот что я получу, когда попробую:

$ ./testssh 
Enter Password: 
Pseudo-terminal will not be allocated because stdin is not a terminal.
user@myhost'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

РЕДАКТИРОВАТЬ:

На основании ответа bmargulies я переделалСценарий и придумал следующее:

#!/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 $USER@$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

Ответы [ 2 ]

4 голосов
/ 26 сентября 2010

Программы, которые читают пароли, часто специально открывают / dev / tty для предотвращения перенаправления. В этом случае вам нужен инструмент «ожидаемо», который запустит один за псевдо-tty.

0 голосов
/ 11 января 2011

Если вы смешиваете с w / perl, вы можете сделать что-то «чистое» (из представления без необходимости заключать в кавычки), например:

#!/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"
...