Linux
如何從期望腳本中轉義異常/唯一字元?
在期望腳本中,我可以設置任何命令或字元以在遠端機器上執行它,但可悲的是期望不能發送與期望腳本中定義的相同的字元
例如
我想從期望腳本執行這一行,以便將 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
- 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.
我不完全確定為什麼,但你需要一些額外的轉義。試試這個:
{send "perl -i -pe 's/\\\\\Q127.0.0.1\\\\\E/1.1.1.1/' /etc/hosts\r"}
我不確定細節,但這與正在執行的腳本有關 i) 通過 shell,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