在expect脚本中处理多个语句

时间:2013-12-18 12:45:01

标签: expect

我是期待脚本的新手。

我在linux机器上为ssh编写了一个expect脚本,我在不同的linux机器上遇到sshing问题。我已经复制了脚本。

!/usr/local/bin/expect

set LinuxMachine [lindex $argv 0]

spawn ssh root@$LinuxMachine


expect "root@$LinuxMachine's password:"

send "root123\n"

expect "[root@Client_FC12_172_85 ~]#"

send "ls"

interact

当我从命令行提供10.213.172.85期望在第4行时,它显示为“root@10.213.172.85's password:”并且登录成功

但是有些Linux会期待 -

The authenticity of host '10.213.172.108 (10.213.172.108)' can't be established.
RSA key fingerprint is da:d0:a0:e1:d8:7a:23:8b:c7:d8:40:8c:b2:b2:9b:95.
Are you sure you want to continue connecting (yes/no)

在这种情况下,脚本无效。

请告诉我如何在一个expect命令中有两个期望语句。

提前致谢!!!

2 个答案:

答案 0 :(得分:8)

在这种情况下你可以使用exp_continue:

expect {
      "Are you sure you want to continue connecting (yes/no)" {
            send "yes\r"
            exp_continue
      }
      "root@$LinuxMachine's password:" {
            send "root123\r"
            expect "[root@Client_FC12_172_85 ~]#"
            send "ls\r"
            interact
      }
}

在上面,expect块等待是/否问题或密码提示。如果是后者,它会继续提供密码,期待提示,发送ls命令并给予控制权。如果是前者,它将回答“是”并重复预期阻止,准备找到密码的提示(或者甚至是/是否问题再次,就此而言 - 不是你需要它)。

如果某些期望选项与预期不匹配,我还会包含一些带有意义消息的超时,但上述情况应该有效。

作为旁注,您不希望在脚本中设置root密码...我建议使用ssh密钥身份验证。

让我知道它是怎么回事。

答案 1 :(得分:0)

我们称之为“长时间登录”,有ssh选项不检查主机密钥:

send -- "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no username@host\n"
expect {
        "Password" {
                send -- "$passwd\n"
        }

调用expect的bash脚本的一部分设置密码:

echo -n "Enter LDAP password: " 
read -s passwd
echo