期望脚本 - 如果SSH失败,请使用telnet

时间:2015-05-18 22:00:26

标签: expect

我正在迭代一个IP地址列表并使用SSH登录它们。但是,其中一些没有SSH,而只有telnet。我如何告诉Expect:如果SSH失败,请再试一次但是使用telnet?

我知道当SSH失败时会输出“拒绝连接”消息,但是当我尝试将其用作条件时,期望无法使用它...在SSH尝试被拒绝后,脚本会中断。

以下是代码段 - 这不起作用:

foreach line $MACHINES {
  spawn ssh -q $USER@$line
  expect {         
    -ex "ssh: connect to host $line port 22: Connection refused" {
      spawn telnet -l $USER@$line; continue
    }
  }
}

非常感谢你, d

4 个答案:

答案 0 :(得分:0)

在您预期之后,有超时处理失败的连接。有些系统可能甚至没有足够的意思吐出拒绝连接。以下是在一个系统上测试的,该系统没有通知用户它的spaw ssh超时。

#!/usr/bin/env expect

# invoke example ./telnet.exp 127.0.0.1 username password
set IP [lindex $argv 0]
set User [lindex $argv 1]
set Password [lindex $argv 2]

# Set timeout from default 10 seconds
set timeout 5
# connect  without asking yes/no for known_hosts
spawn ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $User@$IP
# I'm not being cheeky, I left out the p/P because I avoid regex where possible
expect {
    -nocase "refused" { spawn telnet $IP }
    timeout { spawn telnet $IP }
    "assword:" { send "$Password\r" }
}
interact

以下是我对您的代码段的建议更改(这是未经测试的)

foreach line $MACHINES {
  spawn ssh -q $USER@$line
  expect {         
    -ex "ssh: connect to host $line port 22: Connection refused" {
      spawn telnet -l $USER@$line; continue
    }
    timeout {
      spawn telnet -l $USER@$line; continue
    }
  }
}

答案 1 :(得分:0)

请原谅我迟来的回应;我感谢大家的贡献。

我最终成功使用了这个小块。我相信"等待"命令用于从进程列表中删除SSH进程。

期待{

eof {wait; spawn telnet -l $ USER $ line}

}

答案 2 :(得分:0)

必须清理cisco路由器上的一些用户(混合包ssh / telnet)。找到了这个帖子。谢谢你指点我的方向。


    #!/usr/bin/expect
    set arg1 [lindex $argv 0]
    set arg2 [lindex $argv 1]
    set timeout 120
    set username "router_username"
    set password "router_password"

    spawn telnet $arg1

            expect {
                    -re "Connection refused" { spawn ssh -o StrictHostKeyChecking=no $arg1 -l $username }
                    "Username"       { send "$username\n"; }
                    }
            expect "Password"       { send "$password\n"; }
            expect "#$"             { send "conf t\n" ; }
            expect "config)#$"      { send "no username $arg2\n"; }

            expect {
                    -re "This operation will remove all username*" { send "\n"; exp_continue }
                    "config)#$"      { send "exit\n"; }
                    }

            expect "#$"             { send "wr\n" ; }
            expect "#$"             { send "end\n" ; }

答案 3 :(得分:-1)

不要这样做。如果攻击者能够关闭该盒子上的ssh服务,或者那个盒子中间的人,他可以强制使用未加密的telnet并获取登录该服务器的凭据。

请勿尝试使用telnet作为ssh的后备。这样做的脚本可以很容易地从远程开发。