侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

paramiko模块的简单使用

zze
zze
2020-06-24 / 0 评论 / 0 点赞 / 503 阅读 / 4138 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

介绍

paramiko 是使用 SSHv2 协议的一个第三方的库,底层实现使用的是 cryptography。
paramiko 包括如下两个核心的组件:

  • SSHClient:它的作用类似于 Linux 的 SSH 命令,是对 SSH 会话的一个类的封装,主要用于 SSH 远程连接并执行命令;
  • SFTPClient:它的作用类似 Linux 的 SFTP 命令,是对 SFTP 客户端的一个类的封装,主要是实现对远程文件的操作,上传,下载,修改文件权限等操作;

paramiko 中有如下几个基础名词:

  • Transport:是一种加密的会话,使用时会同步创建一个加密的 Tunnels(通道),这个 Tunnels 叫 Channel;
  • Channel:是一种类 Socket,一种安全的 SSH 传输通道;
  • Session:是客户端和服务端保持连接的对象;

安装:

$ pip3 install paramiko

使用案例

1、基于密码远程连接执行命令:

import paramiko

# 创建 SSH 对象
ssh = paramiko.SSHClient()
# 允许连接不在 know_hosts 文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='10.0.1.200', port=22, username='root', password='root1234')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('hostname')
# 获取命令结果
result = stdout.read().decode()
# 输出
print(result)
# 关闭连接
ssh.close()

2、基于密码的加密连接:

import paramiko

# 创建一个通道
transport = paramiko.Transport(('10.0.1.200', 22))
transport.connect(username='root', password='root1234')

# 实例化 SSHClient
ssh = paramiko.SSHClient()
ssh._transport = transport

# 打开一个 Channel 并执行命令
stdin, stdout, stderr = ssh.exec_command('hostname')

# 打印结果
print(stdout.read().decode('utf-8'))

# 关闭连接
transport.close()

3、基于私钥进行连接:

import paramiko
# 在当前机器使用 ssh-keygen 生成私钥和公钥,使用 ssh-copy-id 将公钥上传到服务器 ~/.ssh/authorized_keys 中
# 私钥文件路径
private_key_path = 'C:/Users/Administrator/.ssh/id_rsa'
# 读取私钥文件生成私钥对象
private_key = paramiko.RSAKey.from_private_key_file(private_key_path)

# 创建 SSH 对象
ssh = paramiko.SSHClient()
# 允许连接不在 know_hosts 文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器,使用 key_filename 指定私钥路径
# ssh.connect(hostname='10.0.1.200', port=22, username='root', key_filename=private_key_path)
# 直接指定私钥对象
ssh.connect(hostname='10.0.1.200', port=22, username='root', pkey=private_key)

# 执行命令
stdin, stdout, stderr = ssh.exec_command('hostname')
# 获取命令结果
result = stdout.read().decode()
# 打印结果
print(result)

# 关闭连接
ssh.close()

4、基于私钥的加密连接:

import paramiko

# 配置私人密钥文件位置
private = paramiko.RSAKey.from_private_key_file('C:/Users/Administrator/.ssh/id_rsa')

# 创建一个通道
transport = paramiko.Transport(('10.0.1.200', 22))
transport.connect(username='root', pkey=private)

# 实例化 SSHClient
client = paramiko.SSHClient()
client._transport = transport

# 打开一个 Channel 并执行命令
stdin, stdout, stderr = client.exec_command('df -h')
# stdout 为正确输出,stderr 为错误输出,同时是有1个变量有值

# 打印执行结果
print(stdout.read().decode('utf-8'))

# 关闭 SSHClient
transport.close()

5、基于 SFTP 的文件上传:

import paramiko

# 获取Transport实例
tran = paramiko.Transport(('10.0.1.200', 22))

# 连接SSH服务端,使用password
# tran.connect(username="root", password='root1234')
# 或使用
# 配置私人密钥文件位置
private = paramiko.RSAKey.from_private_key_file('C:/Users/Administrator/.ssh/id_rsa')
# 连接SSH服务端,使用pkey指定私钥
tran.connect(username="root", pkey=private)

# 获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)

# 设置上传的本地/远程文件路径
localpath = "../app.py"
remotepath = "/tmp/1.txt"

# 执行上传动作
sftp.put(localpath, remotepath)

# 关闭连接
tran.close()

6、基于 SFTP 的文件下载:

import paramiko

# 获取Transport实例
tran = paramiko.Transport(('10.0.1.200', 22))

# 连接SSH服务端,使用password
# tran.connect(username="root", password='root1234')
# 或使用
# 配置私人密钥文件位置
private = paramiko.RSAKey.from_private_key_file('C:/Users/Administrator/.ssh/id_rsa')
# 连接SSH服务端,使用pkey指定私钥
tran.connect(username="root", pkey=private)

# 获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)

# 设置上传的本地/远程文件路径
localpath = "./1.py"
remotepath = "/tmp/1.txt"

# 执行下载动作
sftp.get(remotepath, localpath)

# 关闭连接
tran.close()
0

评论区