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

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

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

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

答え2

スクリプトの先頭にユーザー名とパスワードを設定して作業を開始しました。

set Username "END_USER"

私のパスワードはpas\Sw)/ord

16進数がある場所に特殊文字を設定する必要があります。

\はい\x5c

)はい\x29

/はい\x2f

"したがって、最初と最後ではなく、以下の構文を使用して設定する必要があります"

set Password pas\x5cSw\x29\x2ford

16進値は以下にあります。http://defindit.com/ascii.html

また、使用することができます

puts "$Username"

puts $Password

確認のために値をエコーし​​ます。

関連情報