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)
TCLは単純です 。この場合、mosvy
がコメントで示しているように、{...}
を使用して、トリッキーなシェルコードの補間を無効にします。ただし、コマンドを入力するための\r
をエスケープしてはならず、send
プロシージャは単一の文字列を必要とするため、文字列を結合するか、2つの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
これは、\r
ビットがコードを乱雑にしないようにするタスクのsendline
プロシージャで改善される可能性があります。
#!/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
補間が必要な場合はバックワッキングが必要になりますが、その場合はシェルコードを削除し、代わりにリモートシステムで直接プログラムを呼び出して、必要なタスクを実行するか、必要な出力を使いやすい形式で生成する方がよいでしょう。 。