Нажатие на запрос возврата пароля в ожидаемом скрипте вместо отправки пароля - PullRequest
0 голосов
/ 18 сентября 2019

Я пытаюсь получить сценарий ожидаемого внутри bash для входа в маршрутизатор, выполнения команды и сохранения вывода в текстовом файле.

#!/usr/bin/bash
FQDN=$1
LogFile=/tmp/Router_${FQDN}.txt
> $LogFile
expect -d  <<EOF > $LogFile
set timeout 20
set FQDN [lindex $argv 0]
set Username "user"
set Password "***$$$"
spawn ssh $Username@$FQDN
expect "*assword:"
send "$Password\r"
expect "#"
send "some command\r"
expect "#"
send "exit\r"
sleep 1
exit
expect eof
EOF
cat $LogFile

Я получаю сообщение об ошибке ниже.

system personnel  =\r\r\n= may provide the evidence of such monitoring to law enforcement officials.    =\r\r\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==\r\r\npassword: "
send: sending "\n" to { exp6 }

expect: does "" (spawn_id exp6) match glob pattern "#"? no
password:
Enter old password:

На основании ошибки выясняется, что скрипт нажимает клавишу {return} "\ r", которую нельзя отправлять при запросе пароля.

У меня нет возврата один разя сш.Не уверен, где я иду не так.


Это мой ожидаемый сценарий, который работает нормально.Это только когда я кодирую это внутри bash-скрипта, и это терпит неудачу.

#!/usr/bin/expect -f

set timeout 20
set FQDN [lindex $argv 0]
set Username "user"
set Password "***$$$"
spawn ssh -o "StrictHostKeyChecking no" $Username@$FQDN
expect "*assword: "
send "$Password\r"
expect "#"
send "some command\r"
expect "#"
send "exit\r"
sleep 1
exit

-Abhi

1 Ответ

1 голос
/ 18 сентября 2019

В этом документе переменные типа $Username и $Password расширяются оболочкой, поэтому они не рассматриваются как литералы для расширения Expect.Поскольку эти переменные оболочки нигде не установлены, они расширяются до нулевых строк.В результате он выполняет ssh @$FQDN и отправляет пустой пароль.

Вам необходимо экранировать $, чтобы Expect мог их обработать.

Вам также не нужнострока set FQDN в сценарии Expect, поскольку для этого вы используете переменную оболочки.

#!/usr/bin/bash
FQDN=$1
LogFile=/tmp/Router_${FQDN}.txt
> $LogFile
expect -d  <<EOF > $LogFile
set timeout 20
set Username "user"
set Password "***$$$"
spawn ssh \$Username@$FQDN
expect "*assword:"
send "\$Password\r"
expect "#"
send "some command\r"
expect "#"
send "exit\r"
sleep 1
exit
expect eof
EOF
cat $LogFile

Или вы можете установить их в качестве переменных оболочки, как FQDN.

#!/usr/bin/bash
FQDN=$1
Username=user
Password="***$$$"
LogFile=/tmp/Router_${FQDN}.txt
> $LogFile
expect -d  <<EOF > $LogFile
set timeout 20
spawn ssh $Username@$FQDN
expect "*assword:"
send "$Password\r"
expect "#"
send "some command\r"
expect "#"
send "exit\r"
sleep 1
exit
expect eof
EOF
cat $LogFile
...