予想されるスクリプトエラー - 引用符を閉じた後の追加文字

予想されるスクリプトエラー - 引用符を閉じた後の追加文字

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コメントに示すように、{...}補間を使用してトリッキーなシェルコードを無効にします。ただし、\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

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

補間が必要な場合はバックトレースが必要ですが、この場合はシェルコードを削除し、代わりにリモートシステムから直接プログラムを呼び出して必要な操作を実行するか、使いやすい形式で必要な出力を生成することをお勧めします。形態 。

おすすめ記事