当前位置:   article > 正文

python3 paramiko 基于RSA私钥远程执行ssh、上传、下载文件

paramiko sftp rsakey

介绍

paramiko 遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接,可以实现远程文件的上传,下载或通过ssh远程执行命令。

项目地址:https://github.com/paramiko/paramiko

官方文档:http://docs.paramiko.org/

使用pip3安装

pip3 install paramiko

上一篇章已经讲诉了使用密码访问的方式 python3 paramiko 远程执行 ssh 命令、上传文件、下载文件 , 下面来看看封装使用RSA公钥访问的方式。

文件结构

  1. [root@centos7 test_log]# tree paramiko-example/
  2. paramiko-example/
  3. ├── file3.txt
  4. ├── file4.txt
  5. ├── paramiko_test.py
  6. └── performance_rsa_4096
  7. 0 directories, 4 files
  8. [root@centos7 test_log]#

封装示例代码 paramiko_test.py

  1. import paramiko
  2. import os
  3. class ParamikoHelper():
  4. def __init__(self,remote_ip, remote_ssh_port, private_key_file, ssh_username ):
  5. self.remote_ip = remote_ip
  6. self.remote_ssh_port = remote_ssh_port
  7. self.ssh_username = ssh_username
  8. self.private_key = paramiko.RSAKey.from_private_key_file(private_key_file) # 实例化一个私钥对象
  9. def connect_ssh(self):
  10. try:
  11. self.ssh = paramiko.SSHClient()
  12. self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  13. self.ssh.connect(hostname=self.remote_ip, port=self.remote_ssh_port, username=self.ssh_username,
  14. pkey=self.private_key)
  15. except Exception as e:
  16. print(e)
  17. return self.ssh
  18. def close_ssh(self):
  19. try:
  20. self.ssh.close()
  21. except Exception as e:
  22. print(e)
  23. def exec_shell(self, shell):
  24. ssh = self.connect_ssh()
  25. try:
  26. stdin, stdout, stderr = ssh.exec_command(shell)
  27. return stdin, stdout, stderr
  28. except Exception as e:
  29. print(e)
  30. def sftp_put_file(self, file, local_dir, remote_dir):
  31. try:
  32. t = paramiko.Transport((self.remote_ip, self.remote_ssh_port))
  33. t.connect(username=self.ssh_username, pkey=self.private_key)
  34. sftp = paramiko.SFTPClient.from_transport(t)
  35. sftp.put(os.path.join(local_dir, file), remote_dir)
  36. t.close()
  37. except Exception:
  38. print("connect error!")
  39. def sftp_get_file(self, file, local_dir, remote_dir):
  40. try:
  41. t = paramiko.Transport((self.remote_ip, self.remote_ssh_port))
  42. t.connect(username=self.ssh_username, pkey=self.private_key)
  43. sftp = paramiko.SFTPClient.from_transport(t)
  44. sftp.get(remote_dir, os.path.join(local_dir, file))
  45. t.close()
  46. except Exception:
  47. print("connect error!")
  48. def main():
  49. remote_ip = '192.168.196.134'
  50. remote_ssh_port = 22
  51. ssh_username = 'root'
  52. private_key_file = 'performance_rsa_4096' # RSA私钥
  53. ph = ParamikoHelper(remote_ip=remote_ip,remote_ssh_port=remote_ssh_port,private_key_file=private_key_file,ssh_username=ssh_username)
  54. # 远程执行ssh命令
  55. shell = "df -h | grep dev"
  56. stdin, stdout, stderr = ph.exec_shell(shell)
  57. for line in stdout.readlines():
  58. print(line)
  59. ph.close_ssh()
  60. # 上传文件file4.txt到远程服务器上
  61. file = 'file4.txt'
  62. remote_dir = '/root/test_log/' + file
  63. local_dir = os.getcwd()
  64. ph.sftp_put_file(file=file, local_dir=local_dir, remote_dir=remote_dir)
  65. # 下载文件file3.txt
  66. file = 'file3.txt'
  67. remote_dir = '/root/test_log/' + file
  68. local_dir = os.getcwd()
  69. ph.sftp_get_file(file=file, local_dir=local_dir, remote_dir=remote_dir)
  70. if __name__ == '__main__':
  71. main()
13423234-0e3934319aa622f6.png
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/603439
推荐阅读
相关标签
  

闽ICP备14008679号