期望带有管道和特殊字符的命令变量不起作用
expect command variable with pipes and special characters not working
我在尝试使用 expect 脚本向远程服务器发送命令时遇到问题。
如果我在脚本中手动将它插入到发送命令中,该命令就可以了,但是如果我通过参数 ($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
在服务器上通过我的 except 脚本得到:
# {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
使用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"
我在尝试使用 expect 脚本向远程服务器发送命令时遇到问题。 如果我在脚本中手动将它插入到发送命令中,该命令就可以了,但是如果我通过参数 ($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
在服务器上通过我的 except 脚本得到:
# {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
使用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"