在expect脚本中,我可以设置任何命令或字符以在远程计算机上运行它,但遗憾的是expect无法发送与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) 通过 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
密钥对来方便远程登录,而无需输入密码。