1. 程式人生 > >Python實現ssh批量登入並執行命令

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

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

或許你會想到網路同傳,網路同傳是什麼?就是在一臺電腦上把電腦裝好,配置好,然後利用某些軟體,如“聯想網路同傳”把系統原樣拷貝過去,在裝系統時很有用,只要在一臺電腦上裝好,同傳以後所有的電腦都裝好作業系統了,很方便。同傳要求所有電腦硬體完全相同,在聯想的電腦上裝的系統傳到方正電腦上肯定會出問題的。傳系統也是很費時間的,根據硬碟大小,如果30G硬碟,100多臺電腦大約要傳2個多小時,反正比一臺一臺地安裝快!但是如果系統都傳完了,發現忘了裝一個軟體,或者還需要做些小修改,再同傳一次可以,但是太慢,傳兩次半天時間就沒了。這時候我們可以利用ssh去控制每臺電腦去執行某些命令。

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

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import pexpect  
  4. def ssh_cmd(ip, passwd, cmd):  
  5.     ret = -1
  6.     ssh = pexpect.spawn('ssh [email protected]%s "%s"' % (ip, cmd))  
  7. try:  
  8.         i = ssh.expect(['password:''continue connecting (yes/no)?'], timeout=5)  
  9. if i == 0 :  
  10.             ssh.sendline(passwd)  
  11. elif i == 
    1:  
  12.             ssh.sendline('yes\n')  
  13.             ssh.expect('password: ')  
  14.             ssh.sendline(passwd)  
  15.         ssh.sendline(cmd)  
  16.         r = ssh.read()  
  17. print r  
  18.         ret = 0
  19. except pexpect.EOF:  
  20. print"EOF"
  21.         ssh.close()  
  22.         ret = -1
  23. except pexpect.TIMEOUT:  
  24. print"TIMEOUT"
  25.         ssh.close()  
  26.         ret = -2
  27. return ret 

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

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

  1. #-*- coding: utf-8 -*-
  2. #!/usr/bin/python 
  3. import paramiko  
  4. import threading  
  5. def ssh2(ip,username,passwd,cmd):  
  6. try:  
  7.         ssh = paramiko.SSHClient()  
  8.         ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  
  9.         ssh.connect(ip,22,username,passwd,timeout=5)  
  10. for m in cmd:  
  11.             stdin, stdout, stderr = ssh.exec_command(m)  
  12. #           stdin.write("Y")   #簡單互動,輸入 ‘Y’ 
  13.             out = stdout.readlines()  
  14. #螢幕輸出
  15. for o in out:  
  16. print o,  
  17. print'%s\tOK\n'%(ip)  
  18.         ssh.close()  
  19. except :  
  20. print'%s\tError\n'%(ip)  
  21. if __name__=='__main__':  
  22.     cmd = ['cal','echo hello!']#你要執行的命令列表
  23.     username = ""  #使用者名稱
  24.     passwd = ""    #密碼
  25.     threads = []   #多執行緒
  26. print"Begin......"
  27. for i in range(1,254):  
  28.         ip = '192.168.1.'+str(i)  
  29.         a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd))   
  30.         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伺服器並讓其開機自動執行。

相關推薦

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

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

python利用paramiko實現ssh連線及遠端執行命令

python3.6, windows下 1,安裝paramiko模組 依賴cryptography:使用命令easy_install安裝該模組時,如果報錯“...microsoft visual c++ 14.0 is required.”, 可以下載.whl檔案,使用命令pip instal

python ssh 連線交換機執行命令輸出結果

# encoding=utf-8 import paramiko import time client = paramiko.SSHClient() client.load_system_host_keys() # connect to client client.conn

JAVA使用JSch進行SSH連線Linux執行命令

package utils; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.

Java實現遠端連線Linux執行命令

需要的jar包 <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</art

CheungSSH比Ansible更優秀的Linux SSH批量管理伺服器 執行命令上傳下載自動化運維工具

安裝部署:   第一步: [ root ~]# yum install -y gcc   第二步:[ root ~]#  yum install -y python-devel   第三步 到官網下載pycrypto模組: wget --no-check-certificate https://pypi.py

Python實現ssh登入執行shell命令將結果寫入mysql資料庫

#coding=utf-8 import MySQLdb import paramiko import datetime import time #timestamptimestamp = time.mktime(datetime.datetime.now().timetu

專案總結(三)----------Python實現SSH遠端登陸,執行命令

在自動化測試過程中,比較常用的操作就是對遠端主機進行操作,如何操作呢?使用SSH遠端登陸到主機,然後執行相應的command即可。 使用Python來實現這些操作就相當簡單了。下面是測試code。

expect實現自動scp和ssh登錄後執行命令向bash提供返回值

ip地址 用戶名 expect 密碼 #!/bin/bash # 全局變量:用戶名,普通用戶密碼,root密碼 loginname="xxxx" userpwd="xxxx" rootpwd="xxxx" # 讀取iplist(逐行存儲IP地址) cat /root/iplist | whi

python ssh2遠端登入節點執行命令

#!/usr/bin/python """ SSH connect to remote machines and then execute what you need command """ import paramiko # import paramiko &

ssh登陸執行命令不退出

div bin rouge user 執行 登陸 data code nbsp 如果希望SSH登陸後先執行shell命令,可以這樣: ssh user@ip -t "cd /data ; /bin/bash" ssh登陸並執行命令不退出

命令遠程連接ssh執行命令

遠程連接ssh eof echo 寫法 nbsp ech expec passwd 命令 環境: redhat 6.5 網上測試了很多寫法都不成功,測試了很久才有了一下腳本。 命令遠程連接ssh並執行命令,scp/ftp等遠程連接操作同理 #!/usr/bin/expect

python腳本實現本地或遠程執行命令

simple aliyun ted notice user paramiko ref username repos 功能:1、執行本地shell命令,執行完成後獲取結果2、執行本地shell命令,執行中實時獲取輸出結果3、執行遠程shell命令,執行完成後獲取結果4、執行遠

[轉]python3之paramiko模組(基於ssh連線進行遠端登入伺服器執行命令和上傳下載檔案的功能)

轉自:https://www.cnblogs.com/zhangxinqi/p/8372774.html 閱讀目錄 1、paramiko模組介紹 2、paramiko的使用方法 回到頂部 1、pa

Java使用SSH遠端訪問Windows執行命令

轉載至:http://blog.csdn.net/carolzhang8406/article/details/6760430 windows由於沒有預設的ssh server,因此在允許ssh之前需要先安裝ssh server。 下載freeSSHd http://ww

python ssh批量登入 自動互動

用python來ssh遠端登入,如果用os.system('commod'),結果就是人機互動,跟不用也沒啥區別。 百度發現,可以用pexpect模組來實現自動互動。 # python3 import pexpect def ssh_cmd(ip, passwd):

JAVA利用SSH2登入LINUX執行命令

import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; import ch.ethz.ssh2.StreamGobbler; import cn.com.bsfit.frms.portal.util.Remo

實現ssh簡便登入和利用Polysh實現多臺伺服器批量管理

在叢集管理中我們經常需要遠端跳轉到其他伺服器ssh [email protected]_host -p port 這裡我們編寫一個簡單的python指令碼實現遠端需求 config.py #!/usr/bin/env python # -*-

運維~ssh-copy-id三步實現SSH無密碼登入ssh常用命令

ssh-keygen  產生公鑰與私鑰對. ssh-copy-id 將本機的公鑰複製到遠端機器的authorized_keys檔案中,ssh-copy-id也能讓你有到遠端機器的home, ~./ssh , 和 ~/.ssh/authorized_keys的權利

ssh-copy-id三步實現SSH無密碼登入ssh常用命令

ssh-keygen  產生公鑰與私鑰對. ssh-copy-id 將本機的公鑰複製到遠端機器的authorized_keys檔案中,ssh-copy-id也能讓你有到遠端機器的home, ~./ssh , 和 ~/.ssh/authorized_keys的權利 第一步: