介绍
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()
评论区