• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python中使用paramiko模块并实现远程连接服务器执行上传下载功能

python 搞代码 4年前 (2022-01-07) 42次浏览 已收录 0个评论
文章目录[隐藏]

paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。这篇文章主要介绍了python中使用paramiko模块并实现远程连接服务器执行上传下载功能,需要的朋友可以参考下

paramiko模块

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

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

因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。

通过ssh链接服务器并执行想要的命令,类似于XShell

ansible(远程批量管理服务器)底层源码其实就是paramiko模块实现的

安装

pip3 install paramiko

使用

前提须知:paramiko模块即支持用户名密码的方式,也支持公钥私钥的方式操作服务器

1.用户名密码的方式:

 # 执行命令 import paramiko # 创建链接对象 ssh = paramiko.SSHClient() # 允许链接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 链接服务器 ssh.connect(hostname='服务器ip地址',port='端口号',username='用户名',password='密码') # 执行命令 stdin, stdout, stderr = ssh.exec_command('ip a') """ <em style="color:transparent">来源[email protected]搞@^&代*@码网</em>stdin 是用来输入额外的参数的  -y stdout 命令的返回结果 stderr 错误的结果 """ # 获取命令执行的结果 res = stdout.read() print(res.decode('utf-8')) # 关闭链接 ssh.close()

2.公钥私钥的方式

首先在windows上产生公钥私钥对

可以用openssl工具产生,也可以用Git Bash工具产生(需要安装git)
1.打开 Git Bash工具 输入命令 ssh-keygen
2.输入完命令一直按回车即可
3.在  c/user/用户名下的文件/.ssh 的目录中生成了两个密钥文件。id_rsa 为私钥,id_rsa.pub 为公钥
4.将公钥内容复制到你的linux服务器下的 /root/.ssh/authorized_keys文件中即可

复制私钥文件到项目根目录下,我这里重命名为a.txt

 import paramiko # 读取本地私钥 private_key = paramiko.RSAKey.from_private_key_file('a.txt') # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='服务器ip地址', port=22, username='用户名', pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command('ls /') # 获取命令结果 result = stdout.read() print(result.decode('utf-8')) # 关闭连接 ssh.close() 

实现上传下载文件

1.用户名和密码的方式:

 import paramiko # 用户名和密码 transport = paramiko.Transport(('服务器ip地址', 22)) transport.connect(username='用户名', password='密码') sftp = paramiko.SFTPClient.from_transport(transport) # 上传文件 # sftp.put("a.txt", '/data/tmp.txt') # 注意上传文件到远程某个文件下 文件必须存在 # 下载文件 sftp.get('/data/tmp.txt', 'hahaha.txt') # 将远程文件下载到本地并重新命令 transport.close() 

2.公钥和私钥的方式:

 import paramiko private_key = paramiko.RSAKey.from_private_key_file('a.txt') transport = paramiko.Transport(('服务器地址', 22)) transport.connect(username='用户名', pkey=private_key) sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py sftp.put('manage.py', '/data/test.py') # 将remove_path 下载到本地 local_path sftp.get('remove_path', 'local_path') transport.close() 

下面将执行命令和上传下载文件 封装到一个类里面

SSHProxy类的封装

假如我想链接服务器执行三条命令,并且上传一个文件内容

大部分都会操作几次就链接几次服务器,效率较低,代码冗余

我们想实现一个类里面包含了执行命令和上传下载文件的操作

 # 类的代码无需掌握 只需要会拷贝使用即可 import paramiko class SSHProxy(object): # 这里的参数 你可以再加公钥私钥的形式 def __init__(self, hostname, port, username, password): self.hostname = hostname self.port = port self.username = username self.password = password self.transport = None def open(self): # 给对象赋值一个上传下载文件对象连接 self.transport = paramiko.Transport((self.hostname, self.port)) self.transport.connect(username=self.username, password=self.password) def command(self, cmd): # 正常执行命令的连接 至此对象内容就既有执行命令的连接又有上传下载链接 ssh = paramiko.SSHClient() ssh._transport = self.transport stdin, stdout, stderr = ssh.exec_command(cmd) result = stdout.read() return result def upload(self, local_path, remote_path): sftp = paramiko.SFTPClient.from_transport(self.transport) sftp.put(local_path, remote_path) sftp.close() def close(self): self.transport.close() def __enter__(self): # 对象执行with上下文会自动触发 self.open() return self # 这里发挥上面with语法内的as后面拿到的就是什么 def __exit__(self, exc_type, exc_val, exc_tb): # with执行结束自动触发 self.close() 

使用流程

 """ 上述的封装操作在使用的使用 必须按照下面的顺序 obj = SSHProxy(...) obj.open() # 产生的对象必须要先执行open方法 obj.command('ls /') obj.command('cat /data/tmp.txt') obj.upload(...) obj.upload(...) obj.close() 利用文件操作的特性 f = open() f.close() 嫌上述操作麻烦 利用with上下文做处理了 with open() as f: pass as后面的值由__enter__方法返回值决定 返回什么就是什么 # 一旦对象被执行with会自动触发对象内部的__enter__方法 with结束之后还会自动触发__exit__方法 obj = SSHProxy(1,2,3,4) with obj as f: pass 封装之后按照下面的方式使用即可 with SSHProxy(....) as obj: obj.command() obj.command() obj.upload() obj.upload() obj.command() """ 拓展: __enter__ 和 __exit__ 的使用 class Foo(object): def __enter__(self): print('他进来了') return 123 def __exit__(self, exc_type, exc_val, exc_tb): print('他就这么出去了') obj = Foo() with obj as f: print(f) """ 执行结果: 他进来了 123 他就这么出去了 """ 

总结:as后面的值由 __enter__ 方法返回值决定 返回什么就是什么,

​ 一旦对象被执行with会自动触发对象内部的 __enter__ 方法 with结束之后还会自动触发 __exit__ 方法

面试题

 # 面试题""" 请在Context类中添加代码完成该类的实现(意思是怎么样修改才能实现以下代码并不会报错) """ class Context: pass with Context() as ctx: ctx.do_something() # 答案 class Context: def __enter__(self): return self def __exit__(self,*args,**kwargs): pass def do_something(self): pass 

到此这篇关于python中使用paramiko模块并实现远程连接服务器执行上传下载功能的文章就介绍到这了,更多相关python paramiko模块内容请搜索gaodaima搞代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持gaodaima搞代码网

以上就是python中使用paramiko模块并实现远程连接服务器执行上传下载功能的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python中使用paramiko模块并实现远程连接服务器执行上传下载功能

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址