八、SSH协议的Python实现paramiko
一、paramiko的安装
SSH是一个协议,OPenSSH是其中一个开源实现。paramiko是一个Python的库,该库支持Python2.6+和Python3.3+版本,实现了SSHv2协议(底层使用cryptography)。也就是说,有了paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是调用ssh命令对远程服务器进行操作。
paramiko 实现了SSHv2的客户端协议和服务端协议;
paramiko是用Python实现的,所以,直接使用pip安装即可,安装完成以后尝试进行导入,一次确认安装是否成功。
>>> pip3.6 install paramiko
>>> import paramiko
二、SSHClient类与SFTPClient类
paramiko包含两个核心组建,分别是SSHClient和SFTPClient,前者的作用类似于Linux下的ssh命令,后者的作用类似于Linux下的sftp命令。SSHClient类是对SSH会话的封装,该类封装了传输(transport),通道(channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。SFTPClient类是对SFTP客户端的封装,用以实现远程文件操作,如文件上传,下载,修改文件权限等操作。
SSHClient类常用的几个方法:
1)connect: connect方法实现远程连接与认证,对于该方法,只有hostname是必传参数
connect(self,hostname,port=22,username=None,password=None,
pkey=None,key_filename=None,timeout=None,
allow_agent=True,look_for_keys=True,compress=False)
- set_missing_host_key_poilcy: 设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略,分别是AutoAddPolicy,RejectPolicy(默认策略)与WarningPolicy,分别表示自动添加服务器到know_hosts文件,拒绝本次连接,警告并将服务器添加到know_hosts文件中。
3)exec_command: 在远程服务器执行Linux命令的方法;
4)open_sftp: 在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象;
SFTPClient类常用的几个方法:
- put: 上传本地文件到远程服务器
- get: 从远程服务器下载文件到本地
- mkdir: 在远程服务器上创建目录
- remove: 删除远程服务器中的文件
- rmdir: 删除远程服务器中的目录
- rename: 重命名远程服务器中的文件或目录
- stat: 获取远程服务器中文件的详细信息
- listdir: 列出远程服务器中指定目录下的内容
ps:这里仅仅介绍了paramiko中SSHClient与SFTPClient类的常用方法;请点击了解更多
三、paramiko的基本使用
paramiko.SSHClient两种认证方式
在进行远程服务器操作之前,首先需要连接远程服务器并进行认证。paramiko与ssh命令一样,支持密码认证和密钥认证两种方式。
- 使用密码认证
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("IP",port,"username","password")
- 使用密钥认证
import paramiko
ssh = paramiko.SSHClient()
ssh.connect('IP',port,'username',key_filename='私钥')
使用方法
- 执行远程命令
#!/usr/bin/python
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("某IP地址",22,"用户名", "口令")
stdin, stdout, stderr = ssh.exec_command("你的命令")
print stdout.readlines()
ssh.close()
- 上传文件到远程
#!/usr/bin/python
import paramiko
t = paramiko.Transport(("某IP地址",22))
t.connect(username = "用户名", password = "口令")
sftp = paramiko.SFTPClient.from_transport(t)
remotepath='/tmp/test.txt'
localpath='/tmp/test.txt'
sftp.put(localpath,remotepath)
t.close()
- 从远程下载文件
#!/usr/bin/python
import paramiko
t = paramiko.Transport(("某IP地址",22))
t.connect(username = "用户名", password = "口令")
sftp = paramiko.SFTPClient.from_transport(t)
remotepath='/tmp/test.txt'
localpath='/tmp/test.txt'
sftp.get(remotepath, localpath)
t.close()