예상되는 스크립트에서 특이하거나 고유한 문자를 이스케이프 처리하는 방법은 무엇입니까?

예상되는 스크립트에서 특이하거나 고유한 문자를 이스케이프 처리하는 방법은 무엇입니까?

Expect 스크립트에서 원격 시스템에서 실행하기 위해 명령이나 문자를 설정할 수 있지만 안타깝게도 Expect 스크립트에 정의된 것과 동일한 문자를 보낼 수는 없습니다.

예를 들어

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
  • 참고 백슬래시 앞에 백슬래시 "\"를 설정하는 것은 도움이 되지 않습니다!

내 스크립트:

 #!/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) 셸을 통해, 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

이 작업을 수행하는 대신 바닐라와 HEREDOC만 사용하여 수행 expect할 수 있습니다 .ssh

#!/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비밀번호를 입력하지 않고도 원격 로그인을 용이하게 하기 위해 키 쌍을 사용하고 있습니다 .

관련 정보