【问题标题】:how to replace IP address on remote host using expect如何使用expect替换远程主机上的IP地址
【发布时间】:2013-08-05 03:59:20
【问题描述】:

我写了下面的expect脚本来替换远程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 脚本下获得任何其他解决方案

【问题讨论】:

  • user@12.219.102.43 的默认 shell 是什么?是只有 ksh 还是 bash?
  • 您也已在 bash 下标记了该问题。您是否可以使用基于 bash 的解决方案,或者您严格需要 ksh 解决方案(在这种情况下,您应该取消标记 bash)?
  • 我更喜欢 ksh ,因为我的脚本是在 ksh 中构建的
  • 我没有ksh 的经验...但是我会在这里尝试猜测...由于默认情况下 ssh 会将您登录到您的$HOME,因此您无需指定.kshrc 的绝对路径,或将根目录的 HOME 硬编码为 /root。或者,如果有帮助,请尝试使用ssh -t...

标签: linux perl bash ksh expect


【解决方案1】:

在你使用它的那一行引用“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} 这显然是错误的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 2012-03-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 2016-10-17
    • 2015-01-02
    相关资源
    最近更新 更多