期待スクリプトでは、任意のコマンドまたは文字を設定してリモート マシンで実行できますが、残念なことに、期待スクリプトで定義したのと同じ文字を期待して送信することはできません。
例えば
IP アドレスを10.10.10.10 から1.1.1.1に変更するために、expect スクリプトからこの行を実行したいと考えています。
expect # {send "perl -i -pe 's/\Q10.10.10.10\E/1.1.1.1/' /etc/hosts\r"}
しかし、期待画面を実際に実行すると、コンソールで次の行が実行されていることがわかります。
[root@localhost ~]# perl -i -pe 's/Q10.10.10.10E/1.1.1.1/' /etc/hosts
Q の前と E の前のバックスラッシュが消えたことに注意してください
では、expect スクリプトからこれらの文字をどのようにエスケープするのだろうか?
そのため、次のようにコンソールで同じ行が実行されると予想されます
[root@localhost ~]# perl -i -pe 's/\Q10.10.10.10\E/1.1.1.1/' /etc/hosts
- REMARK バックスラッシュが役に立たない前にバックスラッシュ "\" を設定してください!!!
私のスクリプト:
#!/bin/ksh
#
expect=`cat << EOF
set timeout -1
spawn ssh 192.9.200.10
expect {
")?" { send "yes\r" ; exp_continue }
word: {send secret1\r}
}
expect # {send "perl -i -pe 's/\\Q10.10.10.10\\E/1.1.1.1/' /etc/hosts\r"}
expect # {send exit\r}
expect eof
EOF`
expect -c "$expect"
結果 (スクリプトを実行した後:)
spawn ssh 192.9.200.10
root@'192.9.200.10 s password:
Last login: Sun Aug 4 22:46:53 2013 from 192.9.200.10
[root@localhost ~]# perl -i -pe 's/Q10.10.10.10E/1.1.1.1/' /etc/hosts
[root@localhost ~]# exit
logout
Connection to 192.9.200.10 closed.