假設網絡有多臺可管理的二層交換機,如今須要在每臺交換機上建立10個VLAN,在沒有CDP的狀況下,如何使用python完成?(別忘了python幾乎適用於全部支持遠程登陸的設備)python
首先準備的仍是和上篇文章同樣,交換機須要開啓SSH和配置IP,請將全部設備登陸的用戶名和密碼配置一致。shell
若是網絡中有臺設備,那麼每臺設備的IP地址都是不同的(這是廢話),咱們如何去逐個登陸多臺設備而後執行命令呢?微信
在python中,若是是連續的地址,那麼咱們可使用for循環實現逐個登陸設備的功能,好比網絡
[root@yunwei cisco]# cat for.py
for i in range(1,10):
print '192.168.108.%s' %i
[root@yunwei cisco]#
[root@yunwei cisco]# python for.py
192.168.108.1
192.168.108.2
192.168.108.3
192.168.108.4
192.168.108.5
192.168.108.6
192.168.108.7
192.168.108.8
192.168.108.9
可是,若是IP不是連續的怎麼辦呢?那麼在python中咱們能夠將全部的IP寫入一個文件,而後使用for循環去逐行循環該文件,實現登陸。如運維
[root@yunwei cisco]# cat IP.txt
192.168.108.252
192.168.108.253
[root@yunwei cisco]#
[root@yunwei cisco]# cat for.py
ip = file('IP.txt','rb') # 以只讀的形式打開文件
for i in ip.xreadlines(): # 逐行讀取文件中的內容
print i,
[root@yunwei cisco]#
[root@yunwei cisco]# python for.py
192.168.108.252
192.168.108.253
[root@yunwei cisco]#
如何一次性執行多個文件?咱們能夠像上次那樣使用屢次send函數,但很顯然,這樣效率過低了。咱們能夠將命令寫道一個文件中,使用for循環對文件進行逐行讀取,而後執行。如ssh
[root@yunwei cisco]# cat command.txt
conf t
vlan 10
name V10
vlan 20
name V20
vlan 30
name V30
vlan 40
name V40
vlan 50
name V50
vlan 60
name V60
vlan 70
name V70
vlan 80
name V80
vlan 90
name V90
vlan 100
name V100
exit
int e0/0
switchport trunk encapsulation dot1q
switchport mode trunk
end
show vlan
show int trunk
[root@yunwei cisco]#
[root@yunwei cisco]# cat for.py
cmd = file('command.txt','rb')
for i in cmd.xreadlines():
print i,
[root@yunwei cisco]#
這裏作個簡單的註釋,詳細註釋請參考第一篇文章。ide
import paramiko # 導入模塊
import time
user = 'yunwsn' # 定義登陸用戶名
passwd = '123456' # 定義登陸密碼
s = paramiko.SSHClient() # 實例化
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
IP = file('IP.txt','rb') # 打開IP文件
for ip in IP.xreadlines(): # 循環IP文件
s.connect(ip,username=user,password=passwd,look_for_keys=False,allow_agent=False) # 登陸讀取到的IP文件行
print '[ \033[0;32m success\033[0m ] login %s ' %ip # 打印登陸成功信息
cmd = s.invoke_shell() # 交互式sshell
command = file('command.txt','rb') # 由於上面已經登陸成功,這裏打開命令文件
for command in command.xreadlines(): # 逐行讀取命令
cmd.send(command) # 執行命令
time.sleep(0.1)
output = cmd.recv(65535) # 每執行一個命令就打印一次
print output
cmd.close() # 一個IP命令執行完畢,關閉交互式shell,循環下一個ip
IP.close() # 所有Ip執行完成,則關閉IP文件
效果以下(動圖)函數
登陸交換機查看結果ui
微信公衆號:運維少年spa