2

在期望脚本中,我可以设置任何命令或字符以在远程机器上运行它,但可悲的是期望不能发送与期望脚本中定义的相同的字符

例如

我想从期望脚本运行这一行,以便将 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.
4

2 回答 2

4

使用不同的 Tcl 引号将起作用

expect #  {
    # send text verbatim here
    send {perl -i -pe 's/\Q10.10.10.10\E/1.1.1.1/' /etc/hosts}
    # interpret backslash sequence as carriage return here
    send "\r"
}
于 2013-08-06T17:29:26.243 回答
1

要么逃脱它,\要么将整个事物封闭在{}

expect #  {send "perl -i -pe 's/\\Q10.10.10.10\\E/1.1.1.1/' /etc/hosts\r"}

(将整个内容括起来{}\r作为这 2 个字符发送,而不是作为行终止符,因此在这里不合适。)

请参阅有关 Tcl 语法的手册页

另一个注意事项:
你可以用 Tcl 做同样的事情,只要你不通过 SSH 发送命令

于 2013-08-04T16:06:28.470 回答