Ожидайте переменную команды с неработающими символами и каналами

У меня возникли проблемы при попытке отправить команду на удаленный сервер с использованием сценария ожидаемого. Команда OK, если я вставляю ее в команду send вручную в сценарии, но она не работает, если я передаю ее сценарию кроме аргумента ( $command). Команда, которую я хочу выполнить на удаленном сервере:

top -b -n 2 | head -15 && ls -lrt / var / log | голова -10

ПРИМЕР: ./myexpectedcript пароль ip "top -b -n 2 | head -15 &"

ОБНОВЛЕНИЕ: я обнаружил, что каждая команда, которую я посылаю (это больше, чем одна строка) через этот скрипт на удаленном сервере, выполняется в фигурных скобках... ДЛЯ ПРИМЕРА:

./myexpectcript пароль ip "pwd" в порядке

./myexpectcript пароль ip "echo hello" ответ:

# {echo hello}
/bin/sh: {echo: not found

Если я удаляю двойные кавычки, команда работает:

./myexpectcript пароль ip echo hello

# echo hello
hello

Итак, проблема в том, что я хочу выполнить многострочную однострочную команду:

top -b -n 2 | head -15 && ls -lrt /var/log | head -10

на сервере через мой сценарий кроме я получил:

  # {top -b -n 2 | head -15 && ls -lrt /var/log | head -10}
  /bin/sh: {top: not found
  ls: /var/log: No such file or directory
  head: invalid number '10}'

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

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
set ipaddr [lrange $argv 1 1]
set command [lrange $argv 2 end]
set timeout -1
spawn ssh admin@$ipaddr
match_max 100000
expect "*?assword:*"

send -- "$password\r"

expect "*\\\[0-7\\\]:*"
send -- "5\r"

expect "*\\\[0-4\\\]:*"
send -- "3\r"

expect "\\\#*"

#spawn {*}$command
#eval spawn $command
#send --  "$command\r"
send --  "top -b -n 2 | head -15 && ls -lrt /var/tslog | head -10\r"

expect "\\\#*"
send -- "exit\r"

expect "*\\\[0-4\\\]:*"
send -- "0\r"

expect "*\\\[0-7\\\]:*"
send -- "0\r"


expect eof

1 ответ

Решение

Использование lindex вместо lrange:

#!/usr/bin/expect -f
set password [lindex $argv 0]
set ipaddr   [lindex $argv 1]
set command  [lindex $argv 2]
... ...
send -- "$command\r"

И назовите свой сценарий так:

./myexpectscript password ip "echo hello world"
Другие вопросы по тегам