paramiko模块

1)paramiko模块简介

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

 

2)使用paramiko模块作SSHClient

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

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()

运行以后得出执行命令的结果ssh

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程序spa

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模块、进程、线程code

相关文章
相关标签/搜索