Expectスクリプトでリモートシステムで実行するためのコマンドまたは文字を設定できますが、残念ながらExpectスクリプトで定義されているのと同じ文字を送信することはできません。
例えば
IPアドレスを変更するために、予想されるスクリプトでこの行を実行したいと思います。10.10.10.10 到着1.1.1.1
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の前のバックスラッシュが消えました。
もしそうなら、あなたが期待するスクリプトでこれらの文字をエスケープする方法は疑問に思います。
したがって、以下のようにコンソールで同じ行を実行することが予想されます。
[root@localhost ~]# perl -i -pe 's/\Q10.10.10.10\E/1.1.1.1/' /etc/hosts
- 注バックスラッシュの前にバックスラッシュ「\」を設定することは役に立ちません!
私のスクリプト:
#!/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.
ベストアンサー1
なぜそれはよくわからないが、追加の脱出口が必要です。この試み:
{send "perl -i -pe 's/\\\\\Q127.0.0.1\\\\\E/1.1.1.1/' /etc/hosts\r"}
詳細はわかりませんが、これはi)シェルを介して、ii)Expectを介して、iii)Perlを介して実行されるスクリプトに関連しています。おそらく、これら(または組み合わせ)はすべてエスケープを必要とするため、入れ子に\
なったエスケープが必要すぎます。
とにかく@slmが彼の意見で述べたように、実際にこれを期待する必要はありません。ただ設定パスワードなしssh
その後、単に実行してください。
ssh 192.9.200.10 perl -i -pe 's/\Q127.0.0.1\E/1.1.1.1/' /etc/hosts