【问题标题】:expect command variable with pipes and special characters not working期望带有管道和特殊字符的命令变量不起作用
【发布时间】:2016-11-09 17:19:32
【问题描述】:

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

顶部 -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 密码 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

【问题讨论】:

  • 准确显示您如何将命令作为参数提供给期望脚本

标签: pipe expect send argv spawn


【解决方案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"

【讨论】:

  • 我更新了主帖,希望现在更清晰。感谢您的回答,我已经尝试在双引号内传递它但没有成功。
  • 就是这样!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 2022-11-04
  • 1970-01-01
相关资源
最近更新 更多