Как запустить ожидаемый скрипт с удаленного сервера через ssh? - PullRequest
3 голосов
/ 11 июня 2019

Я развернул ожидаемый скрипт на удаленном сервере, который я хочу запустить через ssh.

ssh user@host 'expect -d ./netopeer_expect.sh' (1)

user@host:~$ cat netopeer_expect.sh
#!/usr/bin/expect

set timeout 5
#spawn netopeer2-cli
spawn ./np2_multi_cli
expect ">"
send "listen --timeout 120\r"
expect "ru_id 0"
send "get-config -D=0 --source running --out /home/user/out.xml\r"
expect ">"
send "exit\r"
expect "$"

Этот код запускает модифицированную версию netopeer2-cli, которую мы называем ./np2_multi_cli.Этот netopeer2-cli имеет собственную оболочку и приглашение типа>.Он работает нормально, когда я делаю это в два шага

ssh user@host
expect -d ./netopeer_expect.sh (2)

Однако сообщение

send "get-config -D=0 --source running --out /home/user/out.xml\r"

обрезается и отправляется как

send "-D=0 --source running --out /home/user/out.xml\r"

С запуска(1) с аргументом -d, который я вижу,

ожидает: "\ u001b [6n" (spawn_id exp3) соответствует шаблону глобуса ">"?нет

Когда я пытаюсь сопоставить первое>.Когда я вместо этого пытаюсь запустить (2), он выглядит так, как должен,

Ожидает: ">" (spawn_id exp4) соответствует шаблону глобуса ">"?да

Я запускаю bash, и кажется, что существуют некоторые проблемы с кодировкой, связанные с символом>.Есть идеи как с этим бороться?

BR Patrik

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Провел некоторое расследование и выяснил, почему ssh -t имеет значение в ответе Патрика . Смотрите следующие примеры:

enter image description here

Согласно инструкции Expect :

Внутренне, spawn использует pty, инициализируется так же, как пользователь tty .

При -t ssh выделит pty (того же типа, что и локальный $TERM) для удаленного сеанса, затем expect выделит pty того же типа.

Без -t ssh не будет выделять pty для удаленного сеанса, а expect использует (по умолчанию?) dumb tty, который не полностью поддерживается . В качестве «обходного пути» мы можем явно установить TERM var (например, set env(TERM) vt100) перед spawn.


Вот команда, которую я использовал. Просто для легкого копирования и вставки.

[STEP 101] # cmd=' "spawn -noe bash -c {echo TERM=\$TERM | grep --color TERM}; expect eof" '
[STEP 102] #
[STEP 103] # ssh 127.0.0.1 expect -c "$cmd"
TERM=dumb
[STEP 104] # ssh -t 127.0.0.1 expect -c "$cmd"
TERM=linux
Connection to 127.0.0.1 closed.
[STEP 105] #
[STEP 106] # cmd=' "set env(TERM) vt100; spawn -noe bash -c {echo TERM=\$TERM | grep --color TERM}; expect eof" '
[STEP 107] # ssh 127.0.0.1 expect -c "$cmd"
TERM=vt100
[STEP 108] #
3 голосов
/ 11 июня 2019

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

ssh -t -t erusim@147.214.83.188 'expect -d ./netopeer_expect.sh'
...