期望命令变量管道和特殊字符不起作用

时间:2016-11-09 17:19:33

标签: pipe expect send argv spawn

我尝试使用expect脚本向远程服务器发送命令时遇到问题。 如果我在脚本中手动将它插入send命令,则该命令为OK,但如果我通过参数($ command)将其传递给except脚本,则该命令不起作用。 我想在远程服务器上运行的命令是:

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

示例:./ myexpectscript密码ip“top -b -n 2 | head -15&”

更新:我发现通过远程服务器中的此脚本发送的每个命令(多于一个字符串)都是在大括号内执行的... 例如:

./ myexpectscript密码ip“pwd”没关系

./ myexpectscript password ip“echo hello”答案是:

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

如果删除双引号,则命令有效:

./ myexpectscript password 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 个答案:

答案 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"