修改基于期望的SSH脚本以在不需要密码的计算机上工作

时间:2012-02-27 12:17:55

标签: linux tcl ksh expect

当Linux机器在登录后要求输入密码时,以下期望脚本可以正常工作。但是我们的一些Linux机器不需要SSH密码(我们可以在没有密码的情况下登录),所以我需要更改expect脚本以便支持没有密码的机器。我怎么能这样做?

$ expect_test=`cat << EOF
set timeout -1
spawn  ssh $IP  hostname
    expect {
              ")?"   { send "yes\r"  ; exp_continue  }
              word:  {send "pass123\r"     }
    }
expect eof
EOF`

$ expect -c "$expect_test"

在需要密码的计算机上运行时:

 $ IP=10.17.18.6
 $ expect -c "$expect_test"
 spawn ssh 10.17.18.6 hostname
 sh: /usr/local/bin/stty: not found
 This computer system, including all related equipment, networks and network devices     (specifically including Internet access),is pros
 yes
 Password: 
 Linux1_machine

在不需要密码的计算机上运行时:

$ IP=10.10.92.26
$ expect -c "$expect_test"
spawn ssh 10.10.92.26 hostname
sh: /usr/local/bin/stty: not found
Linux15_machine
expect: spawn id exp5 not open
while executing
"expect eof"

2 个答案:

答案 0 :(得分:1)

使用此expect命令:

expect {
    ")?"   {send "yes\r";     exp_continue}
    word:  {send "pass123\r"; exp_continue}
    eof
}

这样,如果在“password:”之前遇到EOF,脚本将正常运行。

答案 1 :(得分:0)

将超时从-1更改为其他内容,如果期望的字符串未在给定的超时内显示,这将导致期望继续到下一行。

如果没有提示输入密码,则当前值-1会使其永久阻止。

<强>更新

 set timeout 5
 spawn  ssh $IP  hostname
       expect {
                 ")?"   { send "yes\r"  ; exp_continue  }
                 word:  {send "pass123\r"     }
                 eof    {exit}
      }