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
確認のために値をエコーします。