本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名原文链接~~~

paramiko模块的简单使用

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:


介绍

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

如果这篇文章对您有帮助,可点击下方链接分享给你的朋友们😋,如果遇到问题欢迎评论、留言~~~😇

评论

公众号:zze_coding

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×