八、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)
  1. 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命令一样,支持密码认证和密钥认证两种方式。

  1. 使用密码认证
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("IP",port,"username","password")

  1. 使用密钥认证
import paramiko
ssh = paramiko.SSHClient()
ssh.connect('IP',port,'username',key_filename='私钥')

使用方法

  1. 执行远程命令
#!/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()
  1. 上传文件到远程
#!/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()
  1. 从远程下载文件
#!/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()
posted @ 2018-06-10 17:09  云原生运维社区  阅读(940)  评论(0编辑  收藏  举报