ожидать переменную команды с трубами и специальными символами не работает

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

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

ОБРАЗЕЦ. :/ myexpectscript пароль ip » top-b-n 2 / head -15 &»

UPDATE: я узнаю, что каждая команда, которую я отправляю (то есть больше одной строки ) через этот сценарий на удаленном сервере, выполняется в фигурных скобках…
НАПРИМЕР:

./ myexpectscript пароль ip » pwd » в порядке

./ myexpectscript пароль ip «echo hello» ответ:

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

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

./ myexpectscript пароль ip echo привет

# 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 -- "$passwordr"

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

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

expect "\#*"

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

expect "\#*"
send -- "exitr"

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

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


expect eof

1 ответ

  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"