在期望脚本SSH上拒绝连接

时间:2016-03-21 00:22:16

标签: linux ssh scripting expect

    #!/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连接已经被客户端关闭了。我已经尝试在“放入$ nossh”$ line“”而不是关闭之前删除所有关闭。我也尝试过交互并期望eof,即使continue命令应该去期望eof,但此时仍然出错。如果设备具有不同的密码或列表中的设备不可用或已关闭ssh,则它可以正常工作。如果我tarpit连接使其保持打开但不允许通过流量,它也可以正常工作。看来这是SSH连接在到达下一个命令之前关闭的问题。只是无法弄清楚当它到达一个ssh连接失败时如何让它继续使用下一个IP。此外,日志文件在我进行tarpit时工作正常,但是当它因为没有ssh而出错时它不会写入nossh的日志文件,所以问题就在那里,只是不知道如何解决它。

1 个答案:

答案 0 :(得分:0)

    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。如果期望有多个选项,通配符将无法正常工作,无论您编写的顺序如何,它都将始终选择通配符。它现在按预期工作。现在只是为我的其他设备的更复杂的脚本做同样的事情。