Linux

如何從期望腳本中轉義異常/唯一字元?

  • August 4, 2013

在期望腳本中,我可以設置任何命令或字元以在遠端機器上執行它,但可悲的是期望不能發送與期望腳本中定義的相同的字元

例如

我想從期望腳本執行這一行,以便將 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

引用自:https://unix.stackexchange.com/questions/85494