0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分別使用多線程多進(jìn)程協(xié)程+paramiko在華為交換機(jī)批量快速進(jìn)行配置

網(wǎng)絡(luò)技術(shù)干貨圈 ? 來(lái)源:CSDN ? 2024-01-16 09:13 ? 次閱讀

實(shí)驗(yàn)原理:

python對(duì)于網(wǎng)絡(luò)設(shè)備的操作屬于I/O密集型,在腳本運(yùn)行時(shí),存在大量的等待時(shí)間。我們便可以利用這些空閑的時(shí)間,進(jìn)行其他的操作。

由于python解釋器在同一時(shí)間只能運(yùn)行一個(gè)線程,所以不存在真正意義上的同時(shí)配置不同的設(shè)備。在多線程、多進(jìn)程和協(xié)程中推薦使用協(xié)程這種方法,讓一個(gè)線程不斷的切換執(zhí)行的任務(wù)。

實(shí)驗(yàn)拓?fù)洌?/p>

fcd04bae-b407-11ee-8b88-92fbcf53809c.png

cloud連接本機(jī),ip地址為192.168.56.1,五臺(tái)交換機(jī)的配置的地址為192.168.1.201~205?,F(xiàn)在通過paramiko,ssh進(jìn)入五臺(tái)設(shè)備,并且在五臺(tái)設(shè)備上分別創(chuàng)建將192.168.56.0 0.0.0.255通告進(jìn)入OSPF。

版本:python3.9

實(shí)驗(yàn)步驟:

一、ssh配置:

##創(chuàng)建秘鑰
[sw2]dsalocal-key-paircreate

##配置SSH認(rèn)證類型(密碼/其他)
[sw2]sshuserprinauthentication-typepassword
[sw2]sshuserprinservice-typestelnet
[sw2]stelnetserverenable

##配置認(rèn)證模式
[sw2]user-interfacevty04
[sw2-ui-vty0-4]authentication-modeaaa//配置認(rèn)證模式
[sw2-ui-vty0-4]protocolinboundssh//允許ssh連接虛擬終端

##配置本地用戶信息
[sw2]aaa
[sw2-aaa]local-userprinpasswordcipherHuawei@123
[sw2-aaa]local-userprinprivilegelevel15
[sw2-aaa]local-userprinservice-typessh

二、paramiko腳本:

ssh_device.py: 使用paramiko連接設(shè)備

importtime
importparamiko


defssh_multicmd(ip,username,password,cmd_list,asy_id,wait_time=2,verbose=True):
try:
print('tryssh'+str(asy_id))
ssh=paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,username,password,timeout=5,compress=True)
print("Youhavesuccessfullyconnectto"+ip+'
')
exceptparamiko.ssh_exception.AuthenticationException:
print("Userauthenticationfailedfor"+ip+".")
return

#激活交互式shell
command=ssh.invoke_shell()
#等待網(wǎng)絡(luò)設(shè)備回應(yīng)
command.send("system
")
#執(zhí)行具體的命令
forcmdincmd_list:
command.send(cmd)
time.sleep(wait_time)
#獲取路由器返回信息
output=command.recv(65535)
x=output.decode('ascii')
#關(guān)閉連接
ssh.close()
ifverbose:
print(x)
returnx


if__name__=='__main__':
#執(zhí)行命令,查看showversion的值,和配置OSPF
commands=['ospf1
','area0
','network192.168.56.00.0.0.255
']
return_results=ssh_multicmd('192.168.56.205','prin','Huawei@123',commands,1)

三、協(xié)程腳本與測(cè)試:

coroutine_ssh.py: 使用協(xié)程調(diào)用ssh_multicmd函數(shù)進(jìn)行快速批量配置

fromssh_deviceimportssh_multicmd

importgevent
fromgeventimportmonkey

monkey.patch_all()

commands=['ospf1
','area0
','network192.168.56.00.0.0.255
']


defget_ssh_result(i):
print("start",i)
#執(zhí)行的任務(wù)函數(shù)
result=ssh_multicmd('192.168.56.20'+str(i),'prin','Huawei@123',commands,i,verbose=False)
print("end",i)
returnresult


#同時(shí)執(zhí)行5個(gè)任務(wù),id為1-5
tasks=[gevent.spawn(get_ssh_result,i)foriin[1,2,3,4,5]]
all_result=gevent.joinall(tasks)

#獲取執(zhí)行信息
forxinall_result:
print(x.get())

協(xié)程測(cè)試結(jié)果: 可以看到,多個(gè)任務(wù)‘同時(shí)’執(zhí)行,節(jié)約時(shí)間。

fce5146c-b407-11ee-8b88-92fbcf53809c.png

四、多進(jìn)程/多線程腳本配置和測(cè)試

multiprocessing_ssh.py: 使用多進(jìn)程或者多線程來(lái)配置腳本

fromssh_deviceimportssh_multicmd
frommultiprocessingimportcpu_count,PoolasProcessPool
frommultiprocessing.poolimportThreadPool
frommultiprocessingimportfreeze_support

results=[]
commands=['ospf1
','area0
','network192.168.56.00.0.0.255
']


#多進(jìn)程
defmulti_process(ip_prefix,suffix,username,password,commands):
freeze_support()
cpus=cpu_count()#得到內(nèi)核數(shù)的方法
pool=ProcessPool(cpus)#有效控制并發(fā)進(jìn)程或者線程數(shù),默認(rèn)為內(nèi)核數(shù)(推薦)

#設(shè)置對(duì)應(yīng)函數(shù)和傳入的參數(shù)
foriinsuffix:
result=pool.apply_async(ssh_multicmd,args=(ip_prefix+str(i),username,password,commands,i,2,False))
results.append(result)

#調(diào)用join之前,先調(diào)用close函數(shù),否則會(huì)出錯(cuò)。執(zhí)行完close后不會(huì)有新的進(jìn)程加入到pool,join函數(shù)等待所有子進(jìn)程結(jié)束
pool.close()
pool.join()

forinfoinresults:
print(info.get())


#多線程
defmulti_thread(ip_prefix,suffix,username,password,commands):
pool=ThreadPool(100)
#設(shè)置對(duì)應(yīng)函數(shù)和傳入的參數(shù)
foriinsuffix:
result=pool.apply_async(ssh_multicmd,args=(ip_prefix+str(i),username,password,commands,i,2,False))
results.append(result)

#調(diào)用join之前,先調(diào)用close函數(shù),否則會(huì)出錯(cuò)。執(zhí)行完close后不會(huì)有新的進(jìn)程加入到pool,join函數(shù)等待所有子進(jìn)程結(jié)束
pool.close()
pool.join()

forinfoinresults:
print(info.get())


if__name__=='__main__':
#多線程
#multi_thread('192.168.56.20',range(1,6),'prin','Huawei@123',commands)
#多進(jìn)程
multi_process('192.168.56.20',range(1,6),'prin','Huawei@123',commands)

協(xié)程測(cè)試結(jié)果: 同樣多個(gè)任務(wù)‘同時(shí)’進(jìn)行,節(jié)約了時(shí)間。

fcf9869a-b407-11ee-8b88-92fbcf53809c.png








審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    277

    瀏覽量

    19897
  • SSH
    SSH
    +關(guān)注

    關(guān)注

    0

    文章

    184

    瀏覽量

    16283
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4767

    瀏覽量

    84375
  • 華為交換機(jī)
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    6292

原文標(biāo)題:分別使用多線程多進(jìn)程協(xié)程+paramiko在華為交換機(jī)批量快速進(jìn)行配置(eNSP模擬器)

文章出處:【微信號(hào):網(wǎng)絡(luò)技術(shù)干貨圈,微信公眾號(hào):網(wǎng)絡(luò)技術(shù)干貨圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用paramiko在eNSP的交換機(jī)批量創(chuàng)建VLAN

    cloud連接本機(jī),ip地址為192.168.56.1,五臺(tái)交換機(jī)配置的地址為192.168.1.11~55?,F(xiàn)在通過paramiko,ssh進(jìn)入五臺(tái)設(shè)備,并且在五臺(tái)設(shè)備上分別創(chuàng)建v
    的頭像 發(fā)表于 01-20 17:52 ?1565次閱讀
    使用<b class='flag-5'>paramiko</b>在eNSP的<b class='flag-5'>交換機(jī)</b>中<b class='flag-5'>批量</b>創(chuàng)建VLAN

    多線程多進(jìn)程的區(qū)別

    6.你的數(shù)據(jù)庫(kù)一會(huì)又500個(gè)連接數(shù),一會(huì)有10個(gè),你分析一下情況7.udp和tcp的區(qū)別8.多線程多進(jìn)程的區(qū)別9.有一臺(tái)web服務(wù)器,你選擇用多線程還是多進(jìn)程,...
    發(fā)表于 07-19 07:21

    淺談多進(jìn)程多線程的選擇

    魚還是熊掌:淺談多進(jìn)程多線程的選擇關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,
    發(fā)表于 08-24 07:38

    協(xié)線程有什么區(qū)別

    協(xié)線程的區(qū)別協(xié)線程的共同目的之一是實(shí)現(xiàn)系統(tǒng)資源的上下文調(diào)用,不過它們的實(shí)現(xiàn)層級(jí)不同;
    發(fā)表于 12-10 06:23

    python多線程多進(jìn)程對(duì)比

    段可以干多件事,譬如可以邊吃飯邊看電視;在Python中,多線程協(xié) 雖然是嚴(yán)格上來(lái)說是串行,但卻比一般的串行程序執(zhí)行效率高得很。 一般的串行程序,在程序阻塞的時(shí)候,只能干等著,不能去做其他事
    發(fā)表于 03-15 16:42

    LINUX系統(tǒng)下多線程多進(jìn)程性能分析

    采用多進(jìn)程處理多個(gè)任務(wù),會(huì)占用很多系統(tǒng)資源(主要是CPU 和內(nèi)存的使用)。在LINUX 中,則對(duì)這種弊端進(jìn)行了改進(jìn),在用戶態(tài)實(shí)現(xiàn)了多線程處理多任務(wù)。本文系統(tǒng)論述了多線程
    發(fā)表于 08-13 08:31 ?20次下載

    如何選好多線程多進(jìn)程

    關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”,這句話應(yīng)付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這么簡(jiǎn)單了,選
    的頭像 發(fā)表于 05-11 16:16 ?2929次閱讀
    如何選好<b class='flag-5'>多線程</b>和<b class='flag-5'>多進(jìn)程</b>

    多進(jìn)程多線程的深度比較

    嵌入式Linux中文站,關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”。這句話應(yīng)付考試基本上夠了,但如果在工作中遇
    發(fā)表于 04-02 14:42 ?451次閱讀

    淺談Linux網(wǎng)絡(luò)編程中的多進(jìn)程多線程

    在Linux網(wǎng)絡(luò)編程中,我們應(yīng)該見過很多網(wǎng)絡(luò)框架或者server,有多進(jìn)程的處理方式,也有多線程處理方式,孰好孰壞并沒有可比性,首先選擇多進(jìn)程還是多線程我們需要考慮業(yè)務(wù)場(chǎng)景,其次結(jié)合當(dāng)
    發(fā)表于 08-08 16:56 ?787次閱讀
    淺談Linux網(wǎng)絡(luò)編程中的<b class='flag-5'>多進(jìn)程</b>和<b class='flag-5'>多線程</b>

    華為交換機(jī)如何批量清除接口配置信息

    華為交換機(jī)如何批量清除接口配置信息
    的頭像 發(fā)表于 08-14 10:43 ?2985次閱讀

    關(guān)于Python多進(jìn)程多線程詳解

    進(jìn)程(process)和線程(thread)是操作系統(tǒng)的基本概念,但是它們比較抽象,不容易掌握。關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程
    的頭像 發(fā)表于 11-06 14:46 ?789次閱讀
    關(guān)于Python<b class='flag-5'>多進(jìn)程</b>和<b class='flag-5'>多線程</b>詳解

    Linux系統(tǒng)上多線程多進(jìn)程的運(yùn)行效率

    關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”,這句話應(yīng)付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這么簡(jiǎn)單了,選
    的頭像 發(fā)表于 11-10 10:54 ?1294次閱讀
    Linux系統(tǒng)上<b class='flag-5'>多線程</b>和<b class='flag-5'>多進(jìn)程</b>的運(yùn)行效率

    你還是分不清多進(jìn)程多線程嗎?一文搞懂!

    你還是分不清多進(jìn)程多線程嗎?一文搞懂! 多進(jìn)程多線程是并發(fā)編程中常見的兩個(gè)概念,它們都可以用于提高程序的性能和效率。但是它們的實(shí)現(xiàn)方式和使用場(chǎng)景略有不同。 1.
    的頭像 發(fā)表于 12-19 16:07 ?525次閱讀

    使用python批量備份華為交換機(jī)配置文件

    保證PC能分別和五臺(tái)交換機(jī)通信。五臺(tái)交換機(jī)的IP地址如圖上所示。
    的頭像 發(fā)表于 01-19 09:28 ?1281次閱讀
    使用python<b class='flag-5'>批量</b>備份<b class='flag-5'>華為</b><b class='flag-5'>交換機(jī)</b><b class='flag-5'>配置</b>文件

    Python中多線程多進(jìn)程的區(qū)別

    Python作為一種高級(jí)編程語(yǔ)言,提供了多種并發(fā)編程的方式,其中多線程多進(jìn)程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程多進(jìn)程的概念、區(qū)別以及如何使用
    的頭像 發(fā)表于 10-23 11:48 ?231次閱讀
    Python中<b class='flag-5'>多線程</b>和<b class='flag-5'>多進(jìn)程</b>的區(qū)別