如何使用expect替换远程主机上的IP地址

时间:2013-08-04 08:58:22

标签: linux perl bash ksh expect

我编写以下expect脚本以替换远程linux机器上的IP地址

我使用perl one linear进行此任务

我得到的错误无法读取“HOME”:没有这样的变量,

请在我的期望脚本中建议我需要更改的内容,以便更改所请求的IP?

 #!/bin/ksh


 expect_transfer=`cat << EOF
 set timeout -1
 spawn  ssh  12.219.102.43
       expect {
                 ")?"   { send "yes\r"  ; exp_continue  }

                 word:  {send pass123\r}
              }
  expect #  {send "export OLD=10.10.10.10 ; export NEW=1.1.1.1 ; perl -i -pe 's/\Q$ENV{OLD}\E/$1$ENV{NEW}$2/' /etc/hosts\r"}
  expect #    {send exit\r}
  expect eof
  EOF`


  expect -c  "$expect_transfer" 

结果:

  spawn ssh 12.219.102.43
  root@12.219.102.43's password: 
  Last login: Sun Aug  4 12:29:25 2013 from 12.219.102.43
  [root@localhost ~]# can't read "HOME": no such variable
  while executing
   "send "export OLD=10.10.10.10 ; export NEW=1.1.1.1 ; perl -i -pe 's/\Q$HOME/.kshrc{OLD}\E/$HOME/.kshrc{NEW}/' /etc/hosts\r""
  invoked from within
  "expect #  {send "export OLD=10.10.10.10 ; export NEW=1.1.1.1 ; perl -i -pe 's/\Q$HOME/.kshrc{OLD}\E/$HOME/.kshrc{NEW}/' /etc/hosts"
  • 我很乐意在ksh脚本下获得任何其他解决方案

1 个答案:

答案 0 :(得分:0)

在您使用它的行中引用“EOF”(此处是文档标记),即更改

expect_transfer=`cat << EOF

expect_transfer=`cat << \EOF

expect_transfer=`cat << 'EOF'

当你不引用here文档标记时,shell会在here文档中插入像$ ENV这样的变量引用。在你的情况下,ENV ='$ HOME / .kshrc'以便Perl看不到$ ENV {OLD}但是$ HOME / .kshrc {OLD}这显然是错误的。