执行 send if 命令时出错,不确定是否缺少某些 tcl 语法。
#!/usr/bin/expect -f
# Get the list of hosts, one per line #####
set f [open "/tmp/host.txt"]
set hosts [read $f]
close $f
# Iterate over the hosts
foreach host $hosts {
spawn ssh $host
expect "password: "
send "abcd@123\r"
expect "$ "
send "if [ `df -Ph / | grep -vE '^Filesystem' | awk '{ print $5 " " $1 }' |cut -d'%' -f1` -ge 60 ] ;then echo "Hi Team- Please check root file system space on `hostname` " | mailx -s "Alert: Almost out of disk space on `hostname`" [email protected] ;fi\r"
expect "$ "
send "exit\r"
expect eof }
===错误===
[root@hzavks01~]# extra characters after close-quote
while executing
"send "if [ `df -Ph / | grep -vE '^Filesystem' | awk '{ print $5 " " $1 }' |cut -d'%' -f1` -ge 60 ] ;then echo "Hi Team- Please check root file system..."
("foreach" body line 6)
invoked from within
"foreach host $hosts {
spawn ssh $host
expect "password: "
send "abcd@123\r"
expect "$ "
send "if [ `df -Ph / | grep -vE '^Filesystem' | awk '{ print $5..."
(file "./test.sh" line 10)
答案1
TCL很简单。在这种情况下,如mosvy
注释中所示,用于{...}
禁用棘手的 shell 代码的插值。但是,\r
输入命令的命令不能被转义,并且该send
过程需要单个字符串,因此要么将字符串连接在一起,要么使用两个send
调用:
#!/usr/bin/env expect
catch {exec rm foo}
log_file expect.log
spawn -noecho sh
expect -ex {$ }
send {df | awk '/\//{print $NF}' > foo}
send "\r"
expect -ex {$ }
send -- {exit}
send "\r"
expect eof
sendline
这可以通过任务过程来改进,以防止\r
代码混乱:
#!/usr/bin/env expect
proc sendline {line} { send -- "$line\r" }
spawn -noecho sh
expect -ex {$ }
sendline {df | awk '/\//{print $NF}' > foo}
expect -ex {$ }
sendline "exit"
expect eof
如果您确实需要插值,那么回溯将是必要的,尽管在这种情况下,最好消除 shell 代码,而是直接在远程系统上调用程序来执行必要的任务或以易于使用的形式生成必要的输出。
答案2
我通过在脚本开头设置用户名和密码来使我的工作正常进行。
set Username "END_USER"
假设我的密码是pas\Sw)/ord
我必须以十六进制设置特殊字符,其中十六进制为
\
是\x5c
)
是\x29
/
是\x2f
所以我必须使用下面的语法来设置它,而不是"
在开头和"
结尾。
set Password pas\x5cSw\x29\x2ford
十六进制值可以在以下位置找到http://defindit.com/ascii.html
您还可以使用
puts "$Username"
puts $Password
回显值以进行验证。