2016-03-21 12 views
0
#!/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" [email protected]$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 

Das funktionierte gut, wenn ich es teste, aber ich war tarpiting ssh anstatt es so zu blockieren, wenn ich eine Verbindung bekommen verweigert oder eine keine Route für Fehler, weil die SSH-Verbindung zum Host ist bereits vom Kunden geschlossen. Ich habe versucht, alle zusammen zu entfernen, bevor "puts $ nossh" $ line "" statt close. Ich habe auch versucht interagieren und eof erwarten, obwohl der continue-Befehl sowieso eof erwarten sollte, aber immer noch Fehler an dieser Stelle. Es funktioniert einwandfrei, wenn das Gerät ein anderes Passwort hat oder wenn kein Gerät auf der Liste verfügbar ist oder ssh ausgeschaltet ist. Es funktioniert auch gut, wenn ich die Verbindung tarpitte, die es offen lässt, aber nicht erlaubt, Verkehr zu übergeben. Es scheint, dass dies ein Problem ist, bei dem die SSH-Verbindung geschlossen wird, bevor sie den nächsten Befehl erreicht. Kann einfach nicht herausfinden, wie man es mit der nächsten IP weitermachen kann, wenn es eine ssh-Verbindung erreicht. Auch die Protokolldateien funktionieren gut, auch wenn ich tarpit, aber wenn es ausfällt, weil kein ssh es nie in die Protokolldatei für nossh schreibt, so ist das Problem genau dort, weiß nur nicht, wie es zu beheben ist.Verbindung verweigerte Auf Erwarten Script SSH

Antwort

0
foreach line [split $data \n] { 
     if {$line eq {}} continue 
     spawn -noecho ssh -q -o "StrictHostKeyChecking=no" [email protected]$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 

Ich habe ein paar Dinge falsch gemacht, war eine Aufspaltung der Expect-Befehle und ich benutzte eof falsch. Auch Platzhalter funktionieren nicht richtig, wenn der expect mehrere Optionen hat, wird immer der Platzhalter gewählt, egal in welcher Reihenfolge Sie ihn schreiben. Er funktioniert jetzt wie erwartet. Jetzt mache ich das gleiche für mein komplexes Skript für andere Geräte.