1)paramiko模块简介

  paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。

 



2)使用paramiko模块做SSHClient

用于连接远程服务器并执行基本命令,server上要启动ssh程序



2.1 SSHClient没有封装Transport的用法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2018/7/30 17:43
# @Author : zhouyuyao
# @File : demon2.py
import paramiko

# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在~/.ssh/known_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='xxx.xxx.xxx.xxx', port=22, username='username', password='password')
# 执行命令,不要执行top之类的在不停的刷新的命令
stdin, stdout, stderr = ssh.exec_command('df -h')
# 获取命令结果
result = stdout.read()
# 获取的命令结果是bytes类型
print(result.decode(encoding="utf-8"))
# 关闭连接
ssh.close()

运行之后得出执行命令的结果

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1 40G 27G 11G 71% /
/dev/vdb1 99G 81G 14G 86% /mnt/vdbdata



2.2 SSHClient 封装 Transport 的用法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2018/7/30 17:50
# @Author : zhouyuyao
# @File : demon3.py
import paramiko
transport = paramiko.Transport(('xxx.xxx.xxx.xxx', 22)) # 建立连接
transport.connect(username='username', password='password') # 建立连接
# 创建SSH对象
ssh = paramiko.SSHClient() # SSHClient是定义怎么传输命令、怎么交互文件
ssh._transport = transport
# 执行命令,不要执行top之类的在不停的刷新的命令
stdin, stdout, stderr = ssh.exec_command('w')
# 获取命令结果
result = stdout.read()
# 获取的命令结果是bytes类型
print(result.decode(encoding="utf-8"))
# 关闭连接
transport.close()

运行之后得出执行命令的结果

08:47:47 up 220 days, 23:29,  1 user,  load average: 0.05, 0.06, 0.09
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
loguser pts/1 xx.xx.xx.xx 08:47 31.00s 0.01s 0.01s -bash



2.3 基于ssh免密登入的私钥连接

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2018/7/30 17:56
# @Author : zhouyuyao
# @File : demon4.py
import paramiko

# 指定使用ssh免密登入的私钥
private_key = paramiko.RSAKey.from_private_key_file('/home/username/.ssh/id_rsa')

transport = paramiko.Transport(('xxx.xxx.xxx.xxx', 22))
transport.connect(username='username', pkey=private_key)

ssh = paramiko.SSHClient()
ssh._transport = transport

stdin, stdout, stderr = ssh.exec_command('uptime')

transport.close()

 



3)使用 paramiko 模块做 SFTPClient

用于连接远程服务器并执行上传下载,server上要启动ssh程序



3.1 基于用户名密码上传下载

此处使用 SFTPClient 封装 Transport 的用法,仅适用于文件,不支持目录。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2018/7/31 8:54
# @Author : zhouyuyao
# @File : demon5.py
import paramiko

transport = paramiko.Transport(('xxx.xxx.xxx.xxx', 22)) # 建立连接
transport.connect(username='username', password='password') # 建立连接
# 创建sftp对象
sftp = paramiko.SFTPClient.from_transport(transport) # SFTPClient是定义怎么传输文件、怎么交互文件
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('E:/GitHub/Python-Learning/work/2018-07-27/auto_task.yml', '/tmp/auto_task.yml')
# 将remove_path 下载到本地 local_path
sftp.get('/root/nohup.out', 'E:/GitHub/Python-Learning/work/2018-07-27/nohup.out')
# 关闭连接
transport.close()



3.2 基于 ssh 免密登入的私钥上传下载

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko

# 指定使用ssh免密登入的私钥
private_key = paramiko.RSAKey.from_private_key_file('/home/username/.ssh/id_rsa')

transport = paramiko.Transport(('xxx.xxx.xxx.xxx', 22))
transport.connect(username='username', pkey=private_key )

sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 将remove_path 下载到本地 local_path
sftp.get('remove_path', 'local_path')

transport.close()

 

 



参考资料

1. ​​paramiko模块、进程、线程​