Python實現ssh批量登入並執行命令

來源:互聯網
上載者:User

區域網路內有一百多台電腦,全部都是linux作業系統,所有電腦配置相同,系統完全相同(包括使用者名稱和密碼),ip地址是自動分配的。現在有個任務是在這些電腦上執行某些命令,者說進行某些操作,比如安裝某些軟體,拷貝某些檔案,批量關機等。如果一台一台得手工去操作,費時又費力,如果要進行多個操 作就更麻煩啦。

先讓我們回憶一下ssh遠程登入的過程:首先執行命令 ssh username@192.168.1.x ,第一次登入的時候系統會提示我們是否要繼續串連,我們要輸入“yes”,然後等一段時間後系統提示我們輸入密碼,正確地輸入密碼之後我們就能登入到遠端電腦,然後我們就能執行命令了。我們注意到這裡面有兩次人機互動,一次是輸入‘yes’,另一次是輸入密碼。就是因為有兩次互動我們不能簡單的用某些命令去完成我們的任務。我們可以考慮把人機互動變成自動互動,python的pexpect模組可以幫我們實現自動互動。下面這段代碼是用pexpect實 現自動互動登入並執行命令的函數:

#!/usr/bin/env python # -*- coding: utf-8 -*-      import pexpect      def ssh_cmd(ip, passwd, cmd):     ret = -1     ssh = pexpect.spawn('ssh root@%s "%s"' % (ip, cmd))     try:        i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5)        if i == 0 :           ssh.sendline(passwd)        elif i == 1:           ssh.sendline('yes\n')           ssh.expect('password: ')           ssh.sendline(passwd)           ssh.sendline(cmd)           r = ssh.read()           print r           ret = 0     except pexpect.EOF:        print "EOF"        ssh.close()        ret = -1     except pexpect.TIMEOUT:        print "TIMEOUT"        ssh.close()        ret = -2     return ret

 

利用pexpect模組我們可以做很多事情,由於他提供了自動互動功能,因此我們可以實現ftp,telnet,ssh,scp等的自動登入,還是比較實用的。根據上面的代碼相信讀者已經知道怎麼實現了(python就是那麼簡單!)。

 

用上面的代碼去完成任務還是比較費時間的,因為程式要等待自動互動出現,另外ubuntu用ssh串連就是比較慢,要進行一系列的驗證,這樣才體現出ssh的安全。我們要提高效率,在最短的時間內完成。後來我發現了python裡面的paramiko模組,用這個實現ssh登入更加簡單。看下面的代碼:

#-*- coding: utf-8 -*-  #!/usr/bin/python   import paramiko  import threading  def ssh2(ip,username,passwd,cmd):      try:          ssh = paramiko.SSHClient()          ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())          ssh.connect(ip,22,username,passwd,timeout=5)          for m in cmd:              stdin, stdout, stderr = ssh.exec_command(m)  #           stdin.write("Y")   #簡單互動,輸入 ‘Y’               out = stdout.readlines()              #螢幕輸出              for o in out:                  print o,          print '%s\tOK\n'%(ip)          ssh.close()      except :          print '%s\tError\n'%(ip)  if __name__=='__main__':      cmd = ['cal','echo hello!']#你要執行的命令列表      username = ""  #使用者名稱      passwd = ""    #密碼      threads = []   #多線程      print "Begin......"     for i in range(1,254):          ip = '192.168.1.'+str(i)          a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd))           a.start() 

 

上面的程式還是有些技巧的:

  1. 利用多線程,同時發出登入請求,同時去串連電腦,這樣速度快很多,我試了一下,如果不用多線程,直接一個一個挨著執行的話,大約5~10秒鐘才 能對一台電腦操作完,具體時間要根據命令的來決定,如果是軟體安裝或者卸載時間要更長一些。這樣下來怎麼也要一二十分鐘,用多線程後就快多了,所有的命令 執行完用了不到2分鐘!
  2. 最好用root使用者登入,因為安裝或者卸載軟體的時候如果用普通使用者又會提示輸入密碼,這樣又多了一次互動,處理起來就比較麻煩!安裝軟體時 apt-get install xxx 最好加上“-y”參數,因為有時安裝或刪除軟體時提示是否繼續安裝或卸載,這又是一次自動互動!加上那個參數後就沒有人機互動了。
  3. 迴圈時迴圈所有ip,因為電腦的ip是路由器自動分配的,保險起見,最好全部都執行,保證沒有遺漏的主機。
  4. 遠端執行命令時如果有互動,可以這樣用 stdin.write("Y")來完成互動,“Y”就是輸入“Y”。
  5. 把所有的命令放到一個列表裡面,遍曆列表可以依次執行列表裡面的命令。
  6. 為了更好的進行控制,最好在電腦上提前把root使用者開啟,裝好ssh伺服器並讓其開機自動執行。

 

原文地址:http://blog.chinaunix.net/uid-26354188-id-3279846.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.