2016-11-09 10 views
0

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

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

Пример: ./myexpectscript пароль ф «сверху -b -n 2 | головка -15 &»

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

./myexpectscript пароля ф «PWD» нормально

./myexpectscript пароль ф «эхо привет» ответ :

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

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

./myexpectscript пароль внутрибрюшинен эхо привета

# 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 [email protected]$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 
+0

показать, как именно вы обеспечиваете команду в качестве аргумента к ожидать сценария –

ответ

0

Использование 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" 
+0

I обновленный основной пост, я надеюсь, теперь больше. Теперь, для ответа, я уже пытался передать его в двойных кавычках без успеха. – SimoneM

+0

вот и все! Большое спасибо. – SimoneM