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