如何从期望脚本中转义异常/唯一字符?

如何从期望脚本中转义异常/唯一字符?

在expect脚本中,我可以设置任何命令或字符以在远程计算机上运行它,但遗憾的是expect无法发送与expect脚本中定义的相同的字符

例如

我想从expect脚本运行这一行,以便更改IP地址10.10.10.101.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) 通过 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

答案2

除了这样做之外,expect您还可以仅使用 vanillassh和 HEREDOC 来完成此操作:

#!/bin/bash

ssh -T ssh [email protected] <<\EOI
perl -i -pe 's/\Q10.10.10.10\E/1.1.1.1/' /etc/hosts
EOI

我不太擅长,ksh但如果需要的话,这应该很容易适应。此外,我还使用ssh密钥对来方便远程登录,而无需输入密码。

相关内容