paramiko模块
转载
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模块、进程、线程