ssh批量登錄并執(zhí)行命令的python實(shí)現(xiàn)代碼
更新時(shí)間:2012年05月25日 22:53:22 作者:
有個(gè)任務(wù)是在這些電腦上執(zhí)行某些命令,者說進(jìn)行某些操作,比如安裝某些軟件,拷貝某些文件,批量關(guān)機(jī)等。如果一臺(tái)一臺(tái)得手工去操作,費(fèi)時(shí)又費(fèi)力,如果要進(jìn)行多個(gè)操作就更麻煩啦
局域網(wǎng)內(nèi)有一百多臺(tái)電腦,全部都是linux操作系統(tǒng),所有電腦配置相同,系統(tǒng)完全相同(包括用戶名和密碼),ip地址是自動(dòng)分配的?,F(xiàn)在有個(gè)任務(wù)是在這些電腦上執(zhí)行某些命令,者說進(jìn)行某些操作,比如安裝某些軟件,拷貝某些文件,批量關(guān)機(jī)等。如果一臺(tái)一臺(tái)得手工去操作,費(fèi)時(shí)又費(fèi)力,如果要進(jìn)行多個(gè)操作就更麻煩啦。
或許你會(huì)想到網(wǎng)絡(luò)同傳, 網(wǎng)絡(luò)同傳是什么?就是在一臺(tái)電腦上把電腦裝好,配置好,然后利用某些軟件,如“聯(lián)想網(wǎng)絡(luò)同傳”把系統(tǒng)原樣拷貝過去,在裝系統(tǒng)時(shí)很有用,只要在一臺(tái)電腦上裝好,同傳以后所有的電腦都裝好操作系統(tǒng)了,很方便。同傳要求所有電腦硬件完全相同,在聯(lián)想的電腦上裝的系統(tǒng)傳到方正電腦上肯定會(huì)出問題的。傳系統(tǒng)也是很費(fèi)時(shí)間的,根據(jù)硬盤大小,如果30G硬盤,100多臺(tái)電腦大約要傳2個(gè)多小時(shí),反正比一臺(tái)一臺(tái)地安裝快!但是如果系統(tǒng)都傳完了,發(fā)現(xiàn)忘了裝一個(gè)軟件,或者還需要做些小修改,再同傳一次可以,但是太慢,傳兩次半天時(shí)間就沒了。這時(shí)候我們可以利用ssh去控制每臺(tái)電腦去執(zhí)行某些命令。
先讓我們回憶一下ssh遠(yuǎn)程登錄的過程:首先執(zhí)行命令 ssh username@192.168.1.x ,第一次登錄的時(shí)候系統(tǒng)會(huì)提示我們是否要繼續(xù)連接,我們要輸入“yes”,然后等一段時(shí)間后系統(tǒng)提示我們輸入密碼,正確地輸入密碼之后我們就能登錄到遠(yuǎn)程計(jì)算機(jī),然后我們就能執(zhí)行命令了。我們注意到這里面有兩次人機(jī)交互,一次是輸入‘yes',另一次是輸入密碼。就是因?yàn)橛袃纱谓换ノ覀儾荒芎?jiǎn)單的用某些命令去完成我們的任務(wù)。我們可以考慮把人機(jī)交互變成自動(dòng)交互,python的pexpect模塊可以幫我們實(shí)現(xiàn)自動(dòng)交互。下面這段代碼是用pexpect實(shí)現(xiàn)自動(dòng)交互登錄并執(zhí)行命令的函數(shù):
#!/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模塊我們可以做很多事情,由于他提供了自動(dòng)交互功能,因此我們可以實(shí)現(xiàn)ftp,telnet,ssh,scp等的自動(dòng)登錄,還是比較實(shí)用的。根據(jù)上面的代碼相信讀者已經(jīng)知道怎么實(shí)現(xiàn)了(python就是那么簡(jiǎn)單?。?
用上面的代碼去完成任務(wù)還是比較費(fèi)時(shí)間的,因?yàn)槌绦蛞却詣?dòng)交互出現(xiàn),另外ubuntu用ssh連接就是比較慢,要進(jìn)行一系列的驗(yàn)證,這樣才體現(xiàn)出ssh的安全。我們要提高效率,在最短的時(shí)間內(nèi)完成。后來我發(fā)現(xiàn)了python里面的paramiko模塊,用這個(gè)實(shí)現(xiàn)ssh登錄更加簡(jiǎn)單??聪旅娴拇a:
#-*- 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") #簡(jiǎn)單交互,輸入 ‘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!']#你要執(zhí)行的命令列表
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.利用多線程,同時(shí)發(fā)出登錄請(qǐng)求,同時(shí)去連接電腦,這樣速度快很多,我試了一下,如果不用多線程,直接一個(gè)一個(gè)挨著執(zhí)行的話,大約5~10秒鐘才能對(duì)一臺(tái)電腦操作完,具體時(shí)間要根據(jù)命令的來決定,如果是軟件安裝或者卸載時(shí)間要更長(zhǎng)一些。這樣下來怎么也要一二十分鐘,用多線程后就快多了,所有的命令執(zhí)行完用了不到2分鐘!
2.最好用root用戶登錄,因?yàn)榘惭b或者卸載軟件的時(shí)候如果用普通用戶又會(huì)提示輸入密碼,這樣又多了一次交互,處理起來就比較麻煩!安裝軟件時(shí)apt-get install xxx 最好加上“-y”參數(shù),因?yàn)橛袝r(shí)安裝或刪除軟件時(shí)提示是否繼續(xù)安裝或卸載,這又是一次自動(dòng)交互!加上那個(gè)參數(shù)后就沒有人機(jī)交互了。
3. 循環(huán)時(shí)循環(huán)所有ip,因?yàn)橛?jì)算機(jī)的ip是路由器自動(dòng)分配的,保險(xiǎn)起見,最好全部都執(zhí)行,保證沒有遺漏的主機(jī)
4.遠(yuǎn)端執(zhí)行命令時(shí)如果有交互,可以這樣用 stdin.write("Y")來完成交互,“Y”就是輸入“Y”。
5.把所有的命令放到一個(gè)列表里面,遍歷列表可以依次執(zhí)行列表里面的命令
6.為了更好的進(jìn)行控制,最好在電腦上提前把root用戶打開,裝好ssh服務(wù)器并讓其開機(jī)自動(dòng)執(zhí)行。
作者:cnblogs ma6174
或許你會(huì)想到網(wǎng)絡(luò)同傳, 網(wǎng)絡(luò)同傳是什么?就是在一臺(tái)電腦上把電腦裝好,配置好,然后利用某些軟件,如“聯(lián)想網(wǎng)絡(luò)同傳”把系統(tǒng)原樣拷貝過去,在裝系統(tǒng)時(shí)很有用,只要在一臺(tái)電腦上裝好,同傳以后所有的電腦都裝好操作系統(tǒng)了,很方便。同傳要求所有電腦硬件完全相同,在聯(lián)想的電腦上裝的系統(tǒng)傳到方正電腦上肯定會(huì)出問題的。傳系統(tǒng)也是很費(fèi)時(shí)間的,根據(jù)硬盤大小,如果30G硬盤,100多臺(tái)電腦大約要傳2個(gè)多小時(shí),反正比一臺(tái)一臺(tái)地安裝快!但是如果系統(tǒng)都傳完了,發(fā)現(xiàn)忘了裝一個(gè)軟件,或者還需要做些小修改,再同傳一次可以,但是太慢,傳兩次半天時(shí)間就沒了。這時(shí)候我們可以利用ssh去控制每臺(tái)電腦去執(zhí)行某些命令。
先讓我們回憶一下ssh遠(yuǎn)程登錄的過程:首先執(zhí)行命令 ssh username@192.168.1.x ,第一次登錄的時(shí)候系統(tǒng)會(huì)提示我們是否要繼續(xù)連接,我們要輸入“yes”,然后等一段時(shí)間后系統(tǒng)提示我們輸入密碼,正確地輸入密碼之后我們就能登錄到遠(yuǎn)程計(jì)算機(jī),然后我們就能執(zhí)行命令了。我們注意到這里面有兩次人機(jī)交互,一次是輸入‘yes',另一次是輸入密碼。就是因?yàn)橛袃纱谓换ノ覀儾荒芎?jiǎn)單的用某些命令去完成我們的任務(wù)。我們可以考慮把人機(jī)交互變成自動(dòng)交互,python的pexpect模塊可以幫我們實(shí)現(xiàn)自動(dòng)交互。下面這段代碼是用pexpect實(shí)現(xiàn)自動(dòng)交互登錄并執(zhí)行命令的函數(shù):
復(fù)制代碼 代碼如下:
#!/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模塊我們可以做很多事情,由于他提供了自動(dòng)交互功能,因此我們可以實(shí)現(xiàn)ftp,telnet,ssh,scp等的自動(dòng)登錄,還是比較實(shí)用的。根據(jù)上面的代碼相信讀者已經(jīng)知道怎么實(shí)現(xiàn)了(python就是那么簡(jiǎn)單?。?
用上面的代碼去完成任務(wù)還是比較費(fèi)時(shí)間的,因?yàn)槌绦蛞却詣?dòng)交互出現(xiàn),另外ubuntu用ssh連接就是比較慢,要進(jìn)行一系列的驗(yàn)證,這樣才體現(xiàn)出ssh的安全。我們要提高效率,在最短的時(shí)間內(nèi)完成。后來我發(fā)現(xiàn)了python里面的paramiko模塊,用這個(gè)實(shí)現(xiàn)ssh登錄更加簡(jiǎn)單??聪旅娴拇a:
復(fù)制代碼 代碼如下:
#-*- 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") #簡(jiǎn)單交互,輸入 ‘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!']#你要執(zhí)行的命令列表
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.利用多線程,同時(shí)發(fā)出登錄請(qǐng)求,同時(shí)去連接電腦,這樣速度快很多,我試了一下,如果不用多線程,直接一個(gè)一個(gè)挨著執(zhí)行的話,大約5~10秒鐘才能對(duì)一臺(tái)電腦操作完,具體時(shí)間要根據(jù)命令的來決定,如果是軟件安裝或者卸載時(shí)間要更長(zhǎng)一些。這樣下來怎么也要一二十分鐘,用多線程后就快多了,所有的命令執(zhí)行完用了不到2分鐘!
2.最好用root用戶登錄,因?yàn)榘惭b或者卸載軟件的時(shí)候如果用普通用戶又會(huì)提示輸入密碼,這樣又多了一次交互,處理起來就比較麻煩!安裝軟件時(shí)apt-get install xxx 最好加上“-y”參數(shù),因?yàn)橛袝r(shí)安裝或刪除軟件時(shí)提示是否繼續(xù)安裝或卸載,這又是一次自動(dòng)交互!加上那個(gè)參數(shù)后就沒有人機(jī)交互了。
3. 循環(huán)時(shí)循環(huán)所有ip,因?yàn)橛?jì)算機(jī)的ip是路由器自動(dòng)分配的,保險(xiǎn)起見,最好全部都執(zhí)行,保證沒有遺漏的主機(jī)
4.遠(yuǎn)端執(zhí)行命令時(shí)如果有交互,可以這樣用 stdin.write("Y")來完成交互,“Y”就是輸入“Y”。
5.把所有的命令放到一個(gè)列表里面,遍歷列表可以依次執(zhí)行列表里面的命令
6.為了更好的進(jìn)行控制,最好在電腦上提前把root用戶打開,裝好ssh服務(wù)器并讓其開機(jī)自動(dòng)執(zhí)行。
作者:cnblogs ma6174
您可能感興趣的文章:
- 使用Python獲取當(dāng)前工作目錄和執(zhí)行命令的位置
- Python3.6安裝卸載、執(zhí)行命令、執(zhí)行py文件的方法詳解
- python 采用paramiko 遠(yuǎn)程執(zhí)行命令及報(bào)錯(cuò)解決
- python 切換root 執(zhí)行命令的方法
- python利用paramiko連接遠(yuǎn)程服務(wù)器執(zhí)行命令的方法
- Python實(shí)現(xiàn)SSH遠(yuǎn)程登陸,并執(zhí)行命令的方法(分享)
- Python實(shí)現(xiàn)ssh批量登錄并執(zhí)行命令
- python等待10秒執(zhí)行下一命令的方法
相關(guān)文章
Python OpenCV使用閾值方法進(jìn)行圖像處理
圖像閾值處理是計(jì)算機(jī)視覺和圖像處理中一種非?;A(chǔ)而重要的技術(shù),通過閾值化操作,可以將圖像的像素值按照一定標(biāo)準(zhǔn)分為兩類,在 Python 中,OpenCV 提供了便捷的函數(shù)來實(shí)現(xiàn)各種閾值處理技術(shù),本文將深入介紹如何在 OpenCV 中使用閾值方法進(jìn)行圖像處理2024-12-12
python將unicode和str互相轉(zhuǎn)化的實(shí)現(xiàn)
這篇文章主要介紹了python將unicode和str互相轉(zhuǎn)化的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
淺談Python小波分析庫Pywavelets的一點(diǎn)使用心得
這篇文章主要介紹了淺談Python小波分析庫Pywavelets的一點(diǎn)使用心得,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python數(shù)據(jù)結(jié)構(gòu)之雙向鏈表詳解
單鏈表只有一個(gè)指向直接后繼的指針來表示結(jié)點(diǎn)間的邏輯關(guān)系,可以方便的從任一結(jié)點(diǎn)開始查找其后繼結(jié)點(diǎn),但要找前驅(qū)結(jié)點(diǎn)則比較困難,雙向鏈表是為了解決這一問題,使用兩個(gè)指針表示結(jié)點(diǎn)間的邏輯關(guān)系。本文將重點(diǎn)為大家介紹雙向鏈表的相關(guān)操作,需要的可以參考一下2022-01-01
Python登錄系統(tǒng)界面實(shí)現(xiàn)詳解
這篇文章主要介紹了Python登錄系統(tǒng)界面實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06
python requests庫爬取豆瓣電視劇數(shù)據(jù)并保存到本地詳解
這篇文章主要介紹了python requests庫爬取豆瓣電視劇數(shù)據(jù)并保存到本地詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
python 實(shí)現(xiàn)IP子網(wǎng)計(jì)算
這篇文章主要介紹了python 實(shí)現(xiàn)IP子網(wǎng)計(jì)算的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-02-02

