加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

详解Python远程控制模块:Paramiko概念、方法及七大案例

发布时间:2019-10-23 22:05:19 所属栏目:建站 来源:波波说运维
导读:概述 ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。 有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。今天主

7. paramiko的再封装

  1. import os 
  2. import paramiko 
  3. from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException, SSHException 
  4. class SshRemoteHost(object): 
  5.  def __init__(self, hostname, port, user, passwd, cmd): 
  6.  self.hostname = hostname 
  7.  self.port = port 
  8.  self.user = user 
  9.  self.passwd = passwd 
  10.  self.cmd = cmd 
  11.  def run(self): 
  12.  """默认调用的内容""" 
  13.  # cmd hostname 
  14.  # put 
  15.  # get 
  16.  cmd_str = self.cmd.split()[0] # cmd 
  17.  # 类的反射,判断类里面是否可以支持该操作 
  18.  if hasattr(self, 'do_'+ cmd_str): # do_cmd 
  19.  getattr(self, 'do_'+cmd_str)() 
  20.  else: 
  21.  print("目前不支持该功能") 
  22.  def do_cmd(self): 
  23.  client = paramiko.SSHClient() 
  24.  client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
  25.  try: 
  26.  client.connect(hostname=self.hostname, 
  27.  port=self.port, 
  28.  username=self.user, 
  29.  password=self.passwd) 
  30.  print("正在连接%s......." % (self.hostname)) 
  31.  except NoValidConnectionsError as e: 
  32.  print("连接失败") 
  33.  except AuthenticationException as e: 
  34.  print("密码错误") 
  35.  else: 
  36.  # 4. 执行操作 
  37.  cmd = ''.join(self.cmd.split()[1:]) ##将输入的后面的取出,作为 
  38.  stdin, stdout, stderr = client.exec_command(cmd) 
  39.  # 5.获取命令执行的结果 
  40.  result = stdout.read().decode('utf-8') 
  41.  print(result) 
  42.  finally: 
  43.  # 6.关闭连接 
  44.  client.close() 
  45.  def do_put(self): 
  46.  ###put /tmp/passwd ###将本地的/tmp/passwd上传到远端/tmp/passwd 
  47.  print('正在上传...') 
  48.  try: 
  49.  #获取Transport实例 
  50.  tran = paramiko.Transport(self.hostname,int(self.port)) ##由于端口为整形,而我们用split方法得到的是str 
  51.  #连接SSH服务端 
  52.  tran.connect(username = self.user, password = self.passwd) 
  53.  except SSHException as e: 
  54.  print('连接失败') 
  55.  else: 
  56.  #获取SFTP实例 
  57.  sftp = paramiko.SFTPClient.from_transport(tran) 
  58.  newCmd = self.cmd.split()[1:] 
  59.  if len(newCmd) == 2: 
  60.  #设置上传的本地/远程文件路径 
  61.  localpath=newCmd[0] 
  62.  remotepath=newCmd[1] 
  63.  #执行上传动作 
  64.  sftp.put(localpath,remotepath) 
  65.  print('%s文件上传到%s主机的%s文件成功' %(localpath,self.hostname,remotepath)) 
  66.  else: 
  67.  print('上传文件信息错误') 
  68.  tran.close() 
  69.  def do_get(self): 
  70.  print('正在下载...') 
  71.  try: 
  72.  # 获取Transport实例 
  73.  tran = paramiko.Transport(self.hostname, int(self.port)) ##由于端口为整形,而我们用split方法得到的是str 
  74.  # 连接SSH服务端 
  75.  tran.connect(username=self.user, password=self.passwd) 
  76.  except SSHException as e: 
  77.  print('连接失败') 
  78.  else: 
  79.  # 获取SFTP实例 
  80.  sftp = paramiko.SFTPClient.from_transport(tran) 
  81.  newCmd = self.cmd.split()[1:] 
  82.  if len(newCmd) == 2: 
  83.  # 设置下载的本地/远程文件路径 
  84.  localpath = newCmd[1] 
  85.  remotepath = newCmd[0] 
  86.  # 执行上传动作 
  87.  sftp.get( remotepath,localpath) 
  88.  print('%s主机的%s文件下载到%s文件成功' % (self.hostname,remotepath,localpath)) 
  89.  else: 
  90.  print('上传文件信息错误') 
  91.  tran.close() 
  92. import paramiko 
  93. import os 
  94. # 1.选择操作的主机组:eg:mysql,web,ftp 
  95. groups=[file.rstrip('.conf') for file in os.listdir('conf')] 
  96. print("主机组显示:".center(50,'*')) 
  97. for group in groups: 
  98.  print('t',group) 
  99. choiceGroup = input("选择批量操作的主机组(eg:mysql):") 
  100. ##2.根据选择的主机组,显示包含的主机IP/主机名 
  101. # 1).打开文件conf/choiceGroup.conf 
  102. # 2).依次读取文件每一行 
  103. # 3).只拿出 
  104. print("主机组包含的主机:".center(50,'*')) 
  105. with open('conf/%s.conf' %(choiceGroup)) as f: 
  106.  for line in f: 
  107.  print(line.split(':')[0]) 
  108.  f.seek(0,0) ##把指针移动到文件最开始 
  109.  hostinfos = [line.strip() for line in f.readlines()] 
  110. ###3.让用户确认信息,选择需要批量执行的命令; 
  111. ## -cmd shell 命令 
  112. ## -put 本地文件 远程文件 
  113. ## -get 远程文件 本地文件 
  114. print("批量执行脚本".center(50,"*")) 
  115. while True: 
  116.  cmd = input('>>:').strip() 
  117.  if cmd : 
  118.  if cmd == 'exit' or cmd == "quit": 
  119.  print("执行完毕,正在退出") 
  120.  break 
  121.  for info in hostinfos: 
  122.  host,port,user,passwd = info.split(':') 
  123.  clientObj = SshRemoteHost(host,port,user,passwd,cmd) 
  124.  clientObj.run() 

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读