连接拒绝期望脚本 SSH
Connection Refused On Expect Script SSH
#!/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"" 之前删除所有关闭而不是关闭。我也尝试过 interact 和 expect eof,尽管 continue 命令无论如何都应该去 expect eof,但此时仍然出错。如果设备有不同的密码或者列表中没有设备不可用或 ssh 关闭,它工作正常。如果我延迟连接使其保持打开状态但不允许通过流量,它也可以正常工作。这似乎是 SSH 连接在到达下一个命令之前被关闭的问题。只是无法弄清楚如何让它在到达 ssh 连接失败时继续使用下一个 IP。此外,当我 tarpit 时,日志文件也能正常工作,但是当它由于没有 ssh 而出错时,它永远不会写入 nossh 的日志文件,所以问题就在那里,只是不知道如何解决它。
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
我做错了几件事,一个是拆分 expect 命令,另一个是我错误地使用了 eof。此外,如果 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 连接已经被客户端关闭。我已经尝试在 "puts $nossh "$line"" 之前删除所有关闭而不是关闭。我也尝试过 interact 和 expect eof,尽管 continue 命令无论如何都应该去 expect eof,但此时仍然出错。如果设备有不同的密码或者列表中没有设备不可用或 ssh 关闭,它工作正常。如果我延迟连接使其保持打开状态但不允许通过流量,它也可以正常工作。这似乎是 SSH 连接在到达下一个命令之前被关闭的问题。只是无法弄清楚如何让它在到达 ssh 连接失败时继续使用下一个 IP。此外,当我 tarpit 时,日志文件也能正常工作,但是当它由于没有 ssh 而出错时,它永远不会写入 nossh 的日志文件,所以问题就在那里,只是不知道如何解决它。
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
我做错了几件事,一个是拆分 expect 命令,另一个是我错误地使用了 eof。此外,如果 expect 有多个选项,通配符将无法正常工作,无论您写入的顺序如何,它都会始终选择通配符。它现在按预期工作。现在只是为我的其他设备的更复杂的脚本做同样的事情。