paramiko.sshclient,paramiko.ssh_exception

  paramiko.sshclient,paramiko.ssh_exception

  说明

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

  只需使用txt将登录信息构建到字典中。

  2.初始化SSH连接并执行命令。

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

  将结果存储在文件中。

  4.增加多线程执行。

  提高效率。

  5.添加Linux的crontab。

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

  实例

  #!/usr/bin/envpython

  #-*-编码:utf-8-*-

  进口

  进口时间

  from concurrent . futureimportthreadpoolexecutor

  importparamiko

  定义设备列表(文件名):

  从文本文件中读取设备列表,并返回由字典组成的列表。

  文本格式为:ip、用户名、密码、别名,例如:

  1 . 1 . 1 . 1管理员

  1 . 1 . 1 . 2管理员

  .

  Args:

  文件名([字符串]) 3360文件名

  withopen(文件名, r)asf:

  设备列表=[]

  forlineinf.readlines():

  ip,用户名,密码,name=line.strip()。拆分()

  设备列表附加(

  {

  ip:ip,

  用户名 :用户名,

  n

  bsp;"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("screendisablen")

  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-statisticsinterfaceoutboundin"^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-statisticsinterfaceoutboundin"^Drop"'

  #ret=run(cmd,**dev)

  #print(ret)

  

  if__name__=="__main__":

  """获取设备列表,使用多线程登录设备获取信息并返回

  """

  withThreadPoolExecutor(10)aspool:

  futures=[]

  cmd=r'disqosqueue-statisticsinterfaceoutboundin"^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电脑。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: