2

期待スクリプトでは、任意のコマンドまたは文字を設定してリモート マシンで実行できますが、残念なことに、期待スクリプトで定義したのと同じ文字を期待して送信することはできません。

例えば

IP アドレスを10.10.10.10 から1.1.1.1に変更するために、expect スクリプトからこの行を実行したいと考えています。

    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 の前のバックスラッシュが消えたことに注意してください

では、expect スクリプトからこれらの文字をどのようにエスケープするのだろうか?

そのため、次のようにコンソールで同じ行が実行されると予想されます

   [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

1

でエスケープする\か、全体を囲みます{}

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

(全体を で囲むと、改行記号としてではなく、この 2 文字として{}送信されるため、ここでは適切ではありません。)\r

Tcl 構文に関するマニュアル ページを参照してください。

その他の注意:
SSH 経由でコマンドを送信しない限り、Tcl で同じことを行うことができます。

于 2013-08-04T16:06:28.470 に答える