【问题标题】:Connection Refused On Expect Script SSHExpect 脚本 SSH 连接被拒绝
【发布时间】:2016-03-22 08:35:25
【问题描述】:
    #!/usr/bin/expect
    set timeout 30
    #Edit for User
    set user user
    #Edit for Old Password
    set old oldpassword
    #Edit for New Password
    set new newpassword
    #get IP List from iplist.txt
    set f [open "/iplist.txt"]
    set data [read $f]
    set wpass [open "/wrongpassword.log" w]
    set nossh [open "/nossh.log" w]
    set success [open "/successful.log" w]
    close $f

    foreach line [split $data \n] {
        if {$line eq {}} continue
        spawn -noecho ssh -q -o "StrictHostKeyChecking=no" $user@$line
        expect {
            "assword:" {
                send "$old\r"
                expect {
                    "assword:" {
                            close
                            puts $wpass "$line"
                            continue
                            }}
                 expect {
                        "*" {
                            send "user set $user password=$new\r"
                            expect ">"
                            send "\r"
                            expect ">"
                            send "quit\r"
                            close
                            puts $success "$line"
                            continue
                            }}}}
        expect {
                "*" {
                close
                puts $nossh "$line"
                continue
                }}
        expect eof
    }

    close $wpass
    close $nossh
    close $success

这在我测试它时工作得很好,但是我正在缓送 ssh 而不是阻止它,所以当我收到连接被拒绝或没有路由来托管它时会出错,因为 ssh 连接已经被客户端关闭。我已经尝试在“puts $nossh "$line"" 之前一起删除 close 而不是 close。我也尝试过交互并期待 eof,即使 continue 命令无论如何都应该期待 eof,但此时仍然出错。如果设备有不同的密码,或者列表中没有设备不可用或 ssh 关闭,则它可以正常工作。如果我将连接保持打开但不允许通过流量,它也可以正常工作。这似乎是 SSH 连接在到达下一个命令之前关闭的问题。只是无法弄清楚当它到达一个 ssh 连接失败时如何让它继续使用下一个 IP。此外,当我 tarpit 时,日志文件也可以正常工作,但是由于没有 ssh 而出错时,它永远不会写入 nossh 的日志文件,所以问题就在那里,只是不知道如何解决它。

【问题讨论】:

    标签: linux ssh scripting expect


    【解决方案1】:
        foreach line [split $data \n] {
            if {$line eq {}} continue
            spawn -noecho ssh -q -o "StrictHostKeyChecking=no" $user@$line
            expect {
                "assword:" {
                    send "$old\r"
                    expect {
                        "assword:" {
                                close
                                puts $wpass "$line"
                                continue
                                }
                        ">" {
                            send "user set $user password=$new\r"
                            expect ">"
                            send "\r"
                            expect ">"
                            send "quit\r"
                            close
                            puts $success "$line"
                            continue
                            }
                        }
                    }
                eof {
                    puts $nossh "$line"
                    continue
                    }
                }
        }
    
        close $wpass
        close $nossh
        close $success
    

    我做错了几件事,其中一个是拆分了期望命令,而我使用了错误的 eof。如果期望有多个选项,通配符也将无法正常工作,无论您以何种顺序写入通配符,它​​都会始终选择通配符。它现在按预期工作。现在只是为其他设备的更复杂的脚本做同样的事情。

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 2022-01-07
      • 2013-01-25
      • 2015-02-02
      • 1970-01-01
      • 2017-08-08
      相关资源
      最近更新 更多