python之paramiko模块

矫情吗;* 2022-05-13 00:44 849阅读 0赞

paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。

由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。

一.paramiko模块的安装

1.pycharm内安装
进入pycharm,执行‘import paramiko‘,发现没有paramiko,此时我们将鼠标放在paramiko上,按‘alt + enter‘,会出现如下图界面,并选择第一个进行安装。
这里写图片描述

等待一会,若出现下面界面,说明安装成功
这里写图片描述
2.外部安装
pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto

yum -y install python-devel
pip3 install pycrypto
pip3 install paramiko

二.应用案例

1.paramiko远程密码连接

  1. import paramiko
  2. ##1.创建一个ssh对象
  3. client = paramiko.SSHClient()
  4. #2.解决问题:如果之前没有,连接过的ip,会出现选择yes或者no的操作,
  5. ##自动选择yes
  6. client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  7. #3.连接服务器
  8. client.connect(hostname='172.25.254.31',
  9. port=22,
  10. username='root',
  11. password='westos')
  12. #4.执行操作
  13. stdin,stdout, stderr = client.exec_command('hostname')
  14. #5.获取命令执行的结果
  15. result=stdout.read().decode('utf-8')
  16. print(result)
  17. #6.关闭连接
  18. client.close()

这里写图片描述

2.使用sftp上传文件

  1. import paramiko
  2. #获取Transport实例
  3. tran = paramiko.Transport("172.25.254.31",22)
  4. #连接SSH服务端
  5. tran.connect(username = "root", password = "westos")
  6. #获取SFTP实例
  7. sftp = paramiko.SFTPClient.from_transport(tran)
  8. #设置上传的本地/远程文件路径
  9. localpath="passwd.html" ##本地文件路径
  10. remotepath="/home/kiosk/Desktop/fish" ##上传对象保存的文件路径
  11. #执行上传动作
  12. sftp.put(localpath,remotepath)
  13. tran.close()

3.使用sftp下载文件

  1. import paramiko
  2. #获取SSHClient实例
  3. client = paramiko.SSHClient()
  4. client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  5. #连接SSH服务端
  6. client.connect("172.25.254.31",username="root",password="westos")
  7. #获取Transport实例
  8. tran = client.get_transport()
  9. #获取SFTP实例
  10. sftp = paramiko.SFTPClient.from_transport(tran)
  11. remotepath='/home/kiosk/Desktop/fish'
  12. localpath='/home/kiosk/Desktop/fish'
  13. sftp.get(remotepath, localpath)
  14. client.close()

4.批量远程密码连接

  1. from paramiko.ssh_exception import NoValidConnectionsError
  2. from paramiko.ssh_exception import AuthenticationException
  3. def connect(cmd,hostname,port=22,username='root',passwd='westos'):
  4. import paramiko
  5. ##1.创建一个ssh对象
  6. client = paramiko.SSHClient()
  7. #2.解决问题:如果之前没有,连接过的ip,会出现选择yes或者no的操作,
  8. ##自动选择yes
  9. client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  10. #3.连接服务器
  11. try:
  12. client.connect(hostname=hostname,
  13. port=port,
  14. username=username,
  15. password=passwd)
  16. print('正在连接主机%s......'%(hostname))
  17. except NoValidConnectionsError as e: ###用户不存在时的报错
  18. print("连接失败")
  19. except AuthenticationException as t: ##密码错误的报错
  20. print('密码错误')
  21. else:
  22. #4.执行操作
  23. stdin,stdout, stderr = client.exec_command(cmd)
  24. #5.获取命令执行的结果
  25. result=stdout.read().decode('utf-8')
  26. print(result)
  27. #6.关闭连接
  28. finally:
  29. client.close()
  30. with open('ip.txt') as f: #ip.txt为本地局域网内的一些用户信息
  31. for line in f:
  32. line = line.strip() ##去掉换行符
  33. hostname,port,username,passwd= line.split(':')
  34. print(hostname.center(50,'*'))
  35. connect('uname', hostname, port,username,passwd)

ip.txt 文件内容
这里写图片描述
连接后结果
这里写图片描述
5.paramiko基于公钥密钥连接

  1. import paramiko
  2. from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException
  3. def connect(cmd, hostname, port=22, user='root'):
  4. client = paramiko.SSHClient()
  5. private_key = paramiko.RSAKey.from_private_key_file('id_rsa')
  6. ###id_rsa为本地局域网密钥文件
  7. client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  8. try:
  9. client.connect(hostname=hostname,
  10. port=port,
  11. username=user,
  12. pkey=private_key
  13. )
  14. stdin, stdout, stderr = client.exec_command(cmd)
  15. except NoValidConnectionsError as e:
  16. print("连接失败")
  17. except AuthenticationException as e:
  18. print("密码错误")
  19. else:
  20. result = stdout.read().decode('utf-8')
  21. print(result)
  22. finally:
  23. client.close()
  24. for count in range(254):
  25. host = '172.25.254.%s' %(count+1)
  26. print(host.center(50, '*'))
  27. connect('uname', host)

6.基于密钥的上传和下载

  1. import paramiko
  2. private_key = paramiko.RSAKey.from_private_key_file('id_rsa')
  3. tran = paramiko.Transport('172.25.254.31',22)
  4. tran.connect(username='root',password='westos')
  5. #获取SFTP实例
  6. sftp = paramiko.SFTPClient.from_transport(tran)
  7. remotepath='/home/kiosk/Desktop/fish8'
  8. localpath='/home/kiosk/Desktop/fish1'
  9. sftp.put(localpath,remotepath)
  10. sftp.get(remotepath, localpath)

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()

这里写图片描述
这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,849人围观)

还没有评论,来说两句吧...

相关阅读

    相关 python模块 paramiko

    paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能。这是一个第三方的软件包,使用之前需要安装。 1 基于用户名和密码的 sshclient

    相关 pythonparamiko模块

    paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的