2016-03-06 24 views
1

發送新密碼後,我不斷收到錯誤消息。它會更改密碼,但不會執行腳本的其餘部分。任何想法爲什麼它保持錯誤。我爲一個不同的設備編寫了一個非常類似的腳本,它工作正常,但更改密碼後的內容在該設備上不需要。如果其餘部分未完成,此設備在重新啓動後不會保存密碼。通過ssh手動執行它工作得很好,所以它不是問題的cmd,它與腳本有關。期待腳本上的錯誤

#!/usr/bin/expect 
    set timeout -1 
    #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] 
    close $f 

    foreach line [split $data \n] { 
      if {$line eq {}} continue 
      spawn ssh [email protected]$line 
      expect "assword:" 
      send "$old\r" 
      sleep 10 
      send "passwd $user\r" 
      expect "assword:" 
      send "$new\r" 
      expect "assword:" 
      send "$new\r" 
      sleep 10 
      send "grep -v users.1.password= /tmp/system.cfg > /tmp/system.cfg.new\r" 
      sleep 10 
      send "echo users.1.password=`grep $user /etc/passwd | awk -F: '{print \$2}'` >> /tmp/system.cfg.new\r" 
      sleep 10 
      send "cp /tmp/system.cfg.new /tmp/system.cfg\r" 
      sleep 10 
      send "save && reboot\r" 
      close 
      expect eof 
    } 

完整的劇本是很多大與故障保險,如果設備不響應​​SSH或原始密碼是錯誤的。那一個不會工作,直到我找出這部分有什麼問題。我只是將其縮小以找出問題發生的位置。另外此行似乎是問題,因爲它才創建就行了system.config.new:

  send "echo users.1.password=`grep $user /etc/passwd | awk -F: '{print \$2}'` >> /tmp/system.cfg.new\r" 

這是和SSH工作原理是:

  send "echo users.1.password=`grep $user /etc/passwd | awk -F: '{print $2}'` >> /tmp/system.cfg.new\r" 

但發送由於2美元的錯誤,因此可以期望地看到。我被告知,放置一個\ $ 2將使它只能查看遠程shell。任何幫助都會很棒。

最初它期望「明星」而不是睡眠cmds。我一直在試用這個腳本中的大量東西,一旦我將它運行到我的完整腳本中。我使用睡眠的原因是因爲「明星」似乎不匹配輸出,並在第二次發送$ new/r時失敗。隨着睡眠,它已經變得更遠了。我確實有一個更正。它實際上是正確地發送「save & & reboot \ r」。我將最終從我的另一個問題中用你的$提示建議來代替睡眠,或期待「明星」。隨着這個調試是它引發錯誤:

send: sending "save && reboot\r" to { exp4 } 
    expect: spawn id exp4 not open 
     while executing 
    "expect eof" 
     ("foreach" body line 21) 
     invoked from within 
    "foreach line [split $data \n] { 
      if {$line eq {}} continue 
      spawn ssh [email protected]$line 
      expect "assword:" 
      send "$old\r" 
      sleep 3 
      send "passwd $user\r" 
      e..." 
     (file "./ubnt.sh" line 15) 

「保存& &重啓\ R」將踢出來的ssh連接它保存設置後,但它似乎並沒有那麼遠有愈演愈烈。是否有問題& &,也許我需要/ & &。

+0

在每個'send'命令之後,'期待'提示符。沒有這些,你可以爲不請自來的客人騰出空間,例如這些錯誤。 – Dinesh

+0

如果你可以看一下,在這個上增加了一些更多的信息。 –

+0

我嘗試將保存並重新啓動爲2發送cmd,它將保存設置,但在發送重新引導cmd並且不重新啓動設備後發生錯誤。有什麼想法嗎? –

回答

0

互動,而不是關閉,並期望eof是答案,我會更新完整的腳本,當它完成。這裏是工作UBNT密碼更改腳本:

#!/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] 
    close $f 

    foreach line [split $data \n] { 
      if {$line eq {}} continue 
      spawn ssh [email protected]$line 
      expect { 
        "assword:" { 
          send "$old\r" 
          expect { 
            "assword:" { 
                close 
                continue 
                }} 
          expect { 
            "*" { 
              send "passwd $user\r" 
              expect "*assword:*" 
              send "$new\r" 
              expect "*assword:*" 
              send "$new\r" 
              expect "*" 
              send "grep -v users.1.password= /tmp/system.cfg > /tmp/system.cfg.new\r" 
              expect "*" 
              send "echo users.1.password=`grep $user /etc/passwd | awk -F: '{print \$2}'` >> /tmp/system.cfg.new\r" 
              expect "*" 
              send "cp /tmp/system.cfg.new /tmp/system.cfg\r" 
              expect "*" 
              send "save && reboot\r" 
              interact 
              continue 
              }}}} 
      expect { 
        "*" { 
          close 
          continue 
          }} 
      expect eof 
    } 

這裏是的MikroTik密碼腳本:

#!/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] 
    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 
                continue 
                }} 
          expect { 
            "*" { 
              send "user set $user password=$new\r" 
              expect ">" 
              send "quit\r" 
              close 
              continue 
              }}}} 
      expect { 
        "*" { 
          close 
          continue 
          }} 
      expect eof 
    } 

迪內希提到,我不應該在我的預料命令中使用的「明星」之稱,而不是使用:

set prompt "#|%|>|\\\$ $" 

和:

expect -re $prompt 

我可能會改變。如果無法通過ssh訪問設備,或者舊密碼不能用於設備,則腳本也會移至列表中的下一個IP。我打算在其中做出的唯一其他更改是創建3個日誌文件,其中列出了成功的ips,錯誤的密碼ips以及無法訪問ips的文件。在每次繼續之前,這應該只是一個命令,但尚未研究如何將變量輸出到本地日誌文件。

感謝您對此Dinesh的幫助。