0

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

我使用 perl one linear 来完成这项任务

我收到关于 can't read "HOME": no such variable 的错误,

请告知我需要在我的期望脚本中更改什么,以便我更改请求的 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 脚本下获得任何其他解决方案
4

1 回答 1

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} 这显然是错误的。

于 2013-09-17T08:23:47.333 回答