当前位置: 首页 > 图灵资讯 > 行业资讯> python Paramiko的SSH用法

python Paramiko的SSH用法

来源:图灵python
时间: 2024-06-27 19:32:40

说明

1、将所有设备信息写入文本文档。

简单地使用txt,将登录信息构建成字典。

2、SSH连接和执行命令的初始化。

3、分析本需求指定的命令和输出结果。

将结果存储在文件中。

4、增加多线程执行。

提高效率。

5、crontab添加Linux。

每小时收集一次信息(服务器配置)

实例

#!/usr/bin/envpython
#-*-coding:utf-8-*-
importre
importtime
fromconcurrent.futuresimportThreadPoolExecutor
importparamiko


defget_device_list(filename):
"""读取文本文件中的设备列表,返回由字典组成的列表。
文本内容格式如下:ip,用户名、密码、别名,如:
1.1.1.1adminadminsw1
1.1.1.2adminadminsw2
...

Args:
filename([str]):文件名称
"""
withopen(filename,'r')asf:
device_list=[]
forlineinf.readlines():
ip,username,password,name=line.strip().split()
device_list.append(
{
"ip":ip,
"username":username,
"password":password,
"name":name,
}
)
returndevice_list

classNetworkDevice(object):
def__init__(self,ip="",username="",password="'",name="",port=22,):
self.conn=None
ifip:
self.ip=ip.strip()
elifname:
self.name=name.strip()
else:
raiseValueError("要求设备连接地址(IP或别名)")
self.port=int(port)
self.username=username
self.password=password
self._open_ssh()

def_open_ssh(self):
"""SSH连接的初始化,调动模拟终端,可以在会话结束前执行命令。

Raises:
e:抛出paramiko连接失败的任何异常

"""
ssh_connect_params={
"hostname":self.ip,
"port":self.port,
"username":self.username,
"password":self.password,
"look_for_keys":False,
"allow_agent":False,
"timeout":5,#TCP连接超时间
}
conn=paramiko.SSHClient()
conn.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
conn.connect(**ssh_connect_params)
exceptExceptionase:
raisee
self.conn=conn.invoke_shell(term="vt100",width=500,height=1000)
return""

defexec_cmd(self,cmd,recv_time=3):
"""登录设备,执行命令

Args:
cmd([type]):命令字符串
recv_time(int,optional):超时时间读取回显信息.defaultsto3.

Raises:
EOFError:没有信息输出,说明连接失败。

Returns:
output:
"""
cmd=cmd.strip()+"\n"
self.conn.sendall("screendisable\n")
self.conn.sendall(cmd)
time.sleep(int(recv_time))
output=self.conn.recv(1024*1024)
iflen(output)==0:
raiseEOFError("可能会关闭连接,没有信息输出")
returnoutput.decode('utf-8','ignore')


dev={
"ip":"192.168.56.21",
"username":"netdevops",
"password":"Admin@h3c.com",
"name":"sw1"
}
#sw1=NetworkDevice(**dev)
#ret=sw1.exec_cmd("disversion")
#print(ret)

defparse_interface_drop(output):
"""将设备输出队列的丢包信息分析成累加值
命令和输出示例如下:
#[H3C]disqosqueue-statisticsinterfaceoutbound|||in"^Drop"
#Dropped:0packets,0bytes
"""
ptn=re.compile(r"\s(\S+):\s+(\d+)\s+(\S+),\s+(\d+)\s+(\S+)")
count=0
foriinptn.findall(output):
count+=int(i[1])
returncount

defrun(cmd,**conn_parms):
"""登录单台设备,执行指定命令,对丢包统计进行分析
"""
sw=NetworkDevice(**conn_parms)
output=sw.exec_cmd(cmd)
drop_count=parse_interface_drop(output)
return"%s%s%s"%(
conn_parms.get("name"),
conn_parms.get("ip"),
drop_count)

#cmd=r'disqosqueue-statistinterfaceoutboundin"^Drop"'
#ret=run(cmd,**dev)
#print(ret)

if__name__=="__main__":
"""获取设备列表,使用多线程登录设备获取信息并返回
"""
withThreadPoolExecutor(10)aspool:
futures=[]
cmd=r'disqosqueue-statisticsinterfaceoutbound|||in"^Drop"'
dev_info=get_device_list("./iplist.txt")
fordindev_info:
future=pool.submit(run,cmd,**d)
futures.append(future)
#forfinfutures:
#print(f.result())
#根据执行时间将结果写入文件,精确到小时
withopen("./drops/%s.log"%time.strftime("%Y%m%d_%H"),'w')asf:
forlineinfutures:
f.write(line.result()+"\n")

以上是python 希望Paramiko的SSH用法对大家有所帮助。更多Python学习指导:python基础教程

本文教程操作环境:windows7系统Python 3.9.1,DELL G3电脑。