【问题标题】:Expect Script - If SSH fails, use telnet期望脚本 - 如果 SSH 失败,请使用 telnet
【发布时间】:2015-07-30 13:31:19
【问题描述】:

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

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

这是一个代码 sn-p - 这不起作用:

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

【问题讨论】:

  • expect -d 运行你的脚本,看看有什么问题。

标签: expect


【解决方案1】:

按照您的预期让超时处理失败的连接。有些系统甚至可能不会吐出连接被拒绝。以下是在未通知用户它的 spawn 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

这是我对您的 sn-p 的建议更改(未经测试)

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
    }
  }
}

【讨论】:

    【解决方案2】:

    请原谅我迟来的回复;我感谢每个人的贡献。

    我最终成功地使用了这个小块。我相信“等待”命令的作用是从进程列表中删除 SSH 进程。

    期待{

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

    }

    【讨论】:

      【解决方案3】:

      不得不清理 cisco 路由器上的一些用户(混合包 ssh/telnet)。找到这个线程。感谢您为我指明方向。

      #!/usr/bin/expect 设置 arg1 [lindex $argv 0] 设置 arg2 [lindex $argv 1] 设置超时 120 设置用户名“router_username” 设置密码“router_password” 生成远程登录 $arg1 预计 { -re "连接被拒绝" { spawn ssh -o StrictHostKeyChecking=no $arg1 -l $username } "用户名" { 发送 "$用户名\n"; } } 期望“密码”{发送“$密码\n”; } 期望 "#$" { 发送 "conf t\n" ; } 期望 "config)#$" { 发送 "没有用户名 $arg2\n"; } 预计 { -re "此操作将删除所有用户名*" { send "\n"; exp_continue } "config)#$" { 发送 "exit\n"; } } 期望 "#$" { 发送 "wr\n" ; } 期望 "#$" { 发送 "end\n" ; }

      【讨论】:

        【解决方案4】:

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

        不要尝试使用 telnet 作为 ssh 的后备。这样做的脚本很容易被远程利用。

        【讨论】:

        • 这不是问题的答案。这是一条评论。
        • 在我看来,这不适用于与安全相关的主题,因为不是每个人都阅读 cmets。事实上,我应该另外用粗体写这个。
        猜你喜欢
        • 2013-01-19
        • 1970-01-01
        • 2014-11-13
        • 1970-01-01
        • 2015-11-18
        • 2019-08-22
        • 1970-01-01
        • 2011-12-09
        • 2014-10-14
        相关资源
        最近更新 更多