python中使用paramiko模块并实现远程连接服务器执行上传下载功能
paramiko模块
paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。
由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux,Solaris,BSD,MacOSX,Windows等,paramiko都可以支持,因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。
因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。
通过ssh链接服务器并执行想要的命令,类似于XShell
ansible(远程批量管理服务器)底层源码其实就是paramiko模块实现的
安装
pip3installparamiko
使用
前提须知:paramiko模块即支持用户名密码的方式,也支持公钥私钥的方式操作服务器
1.用户名密码的方式:
#执行命令
importparamiko
#创建链接对象
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('ipa')
"""
stdin是用来输入额外的参数的-y
stdout命令的返回结果
stderr错误的结果
"""
#获取命令执行的结果
res=stdout.read()
print(res.decode('utf-8'))
#关闭链接
ssh.close()
2.公钥私钥的方式
首先在windows上产生公钥私钥对
可以用openssl工具产生,也可以用GitBash工具产生(需要安装git)
1.打开GitBash工具输入命令ssh-keygen
2.输入完命令一直按回车即可
3.在 c/user/用户名下的文件/.ssh的目录中生成了两个密钥文件。id_rsa为私钥,id_rsa.pub为公钥
4.将公钥内容复制到你的linux服务器下的/root/.ssh/authorized_keys文件中即可
复制私钥文件到项目根目录下,我这里重命名为a.txt
importparamiko
#读取本地私钥
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.用户名和密码的方式:
importparamiko
#用户名和密码
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.公钥和私钥的方式:
importparamiko
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类的封装
假如我想链接服务器执行三条命令,并且上传一个文件内容
大部分都会操作几次就链接几次服务器,效率较低,代码冗余
我们想实现一个类里面包含了执行命令和上传下载文件的操作
#类的代码无需掌握只需要会拷贝使用即可 importparamiko classSSHProxy(object): #这里的参数你可以再加公钥私钥的形式 def__init__(self,hostname,port,username,password): self.hostname=hostname self.port=port self.username=username self.password=password self.transport=None defopen(self):#给对象赋值一个上传下载文件对象连接 self.transport=paramiko.Transport((self.hostname,self.port)) self.transport.connect(username=self.username,password=self.password) defcommand(self,cmd):#正常执行命令的连接至此对象内容就既有执行命令的连接又有上传下载链接 ssh=paramiko.SSHClient() ssh._transport=self.transport stdin,stdout,stderr=ssh.exec_command(cmd) result=stdout.read() returnresult defupload(self,local_path,remote_path): sftp=paramiko.SFTPClient.from_transport(self.transport) sftp.put(local_path,remote_path) sftp.close() defclose(self): self.transport.close() def__enter__(self):#对象执行with上下文会自动触发 self.open() returnself#这里发挥上面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上下文做处理了
withopen()asf:
pass
as后面的值由__enter__方法返回值决定返回什么就是什么
#一旦对象被执行with会自动触发对象内部的__enter__方法with结束之后还会自动触发__exit__方法
obj=SSHProxy(1,2,3,4)
withobjasf:
pass
封装之后按照下面的方式使用即可
withSSHProxy(....)asobj:
obj.command()
obj.command()
obj.upload()
obj.upload()
obj.command()
"""
拓展:__enter__和__exit__的使用
classFoo(object):
def__enter__(self):
print('他进来了')
return123
def__exit__(self,exc_type,exc_val,exc_tb):
print('他就这么出去了')
obj=Foo()
withobjasf:
print(f)
"""
执行结果:
他进来了
123
他就这么出去了
"""
总结:as后面的值由 __enter__方法返回值决定返回什么就是什么,
一旦对象被执行with会自动触发对象内部的 __enter__方法with结束之后还会自动触发 __exit__方法
面试题
#面试题""" 请在Context类中添加代码完成该类的实现(意思是怎么样修改才能实现以下代码并不会报错) """ classContext: pass withContext()asctx: ctx.do_something() #答案 classContext: def__enter__(self): returnself def__exit__(self,*args,**kwargs): pass defdo_something(self): pass
到此这篇关于python中使用paramiko模块并实现远程连接服务器执行上传下载功能的文章就介绍到这了,更多相关pythonparamiko模块内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。