我尝试使用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
答案 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"