以下是 Python paramiko
模块的常用方法及实际场景的详细说明和示例。paramiko
是一个用于 SSH 协议操作的库,支持远程命令执行、文件传输(SFTP)等功能,广泛应用于服务器管理和自动化运维。
一、核心类与方法
1. SSHClient
类
- 用途:管理 SSH 连接、执行远程命令、传输文件。
- 关键方法:
connect()
:建立 SSH 连接。exec_command()
:执行远程命令。open_sftp()
:创建 SFTP 客户端。set_missing_host_key_policy()
:设置主机密钥验证策略(如自动接受新主机)。
2. SFTPClient
类
- 用途:通过 SSH 协议进行文件传输。
- 关键方法:
put()
:上传本地文件到远程服务器。get()
:下载远程文件到本地。mkdir()
:在远程服务器创建目录。listdir()
:列出远程目录内容。
3. AutoAddPolicy
- 用途:自动添加未知主机的密钥到本地
known_hosts
文件(适用于测试环境)。
二、实际场景与示例
场景 1:远程执行命令(如重启服务)
import paramiko
# 创建 SSH 客户端
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 自动接受新主机
try:
# 连接服务器
client.connect(
hostname="192.168.1.100",
port=22,
username="admin",
password="your_password"
)
# 执行命令(检查服务状态)
stdin, stdout, stderr = client.exec_command("systemctl status nginx")
output = stdout.read().decode()
print("服务状态:", output)
# 重启服务(需要管理员权限)
stdin, stdout, stderr = client.exec_command("sudo systemctl restart nginx")
print("重启结果:", stderr.read().decode())
except paramiko.AuthenticationException:
print("认证失败!")
except paramiko.SSHException as e:
print(f"SSH 连接错误: {e}")
finally:
client.close()
场景 2:通过 SFTP 上传/下载文件(如部署代码)
import paramiko
from paramiko import SFTPClient
# 创建 SSH 客户端并连接
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("192.168.1.100", username="admin", password="your_password")
# 创建 SFTP 客户端
sftp: SFTPClient = client.open_sftp()
try:
# 上传本地文件到远程服务器
sftp.put(localpath="local/app.tar.gz", remotepath="/opt/app/app.tar.gz")
print("文件上传成功!")
# 下载远程日志文件到本地
sftp.get(remotepath="/var/log/nginx/access.log", localpath="local/access.log")
print("文件下载成功!")
# 创建远程目录(需权限)
sftp.mkdir("/opt/app/backup")
except IOError as e:
print(f"文件操作失败: {e}")
finally:
sftp.close()
client.close()
场景 3:使用密钥认证(安全运维)
import paramiko
# 指定私钥路径(默认读取 ~/.ssh/id_rsa)
private_key = paramiko.RSAKey.from_private_key_file("/path/to/private_key.pem")
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
client.connect(
hostname="192.168.1.100",
username="admin",
pkey=private_key # 使用密钥认证
)
# 执行需要高权限的命令
stdin, stdout, stderr = client.exec_command("sudo docker ps")
print("运行中的容器:", stdout.read().decode())
except paramiko.SSHException as e:
print(f"SSH 错误: {e}")
场景 4:交互式 Shell(如配置交换机)
import paramiko
client = paramiko.SSHClient()
client.connect("192.168.1.1", username="admin", password="cisco123")
# 创建交互式 Shell 会话
channel = client.invoke_shell()
# 发送配置命令
commands = [
"configure terminal",
"interface GigabitEthernet0/1",
"ip address 192.168.2.1 255.255.255.0",
"no shutdown",
"end"
]
for cmd in commands:
channel.send(cmd + "\n")
# 等待命令执行(避免输出混乱)
while not channel.recv_ready():
pass
output = channel.recv(4096).decode()
print(f"命令 {cmd} 输出:\n{output}")
client.close()
三、高级功能
1. 处理超时和连接异常
try:
client.connect(
"192.168.1.100",
username="admin",
password="your_password",
timeout=10 # 设置连接超时时间
)
except paramiko.ssh_exception.NoValidConnectionsError:
print("无法连接到服务器!")
2. 通过代理跳转连接内网服务器
# 先连接跳板机
jump_host = paramiko.SSHClient()
jump_host.connect("jump.example.com", username="user", password="pass")
# 通过跳板机建立到内网服务器的连接
transport = jump_host.get_transport()
dest_addr = ("192.168.1.100", 22)
local_addr = ("jump.example.com", 22)
channel = transport.open_channel("direct-tcpip", dest_addr, local_addr)
# 创建内网服务器的 SSH 客户端
inner_client = paramiko.SSHClient()
inner_client.connect("192.168.1.100", username="admin", sock=channel)
四、总结
功能 | 适用场景 | 关键方法 |
---|---|---|
远程命令执行 | 批量服务器管理、服务重启 | exec_command() |
SFTP 文件传输 | 代码部署、日志下载 | put() , get() , listdir() |
密钥认证 | 安全运维(避免密码泄露) | pkey=private_key |
交互式 Shell | 网络设备配置(如交换机、路由器) | invoke_shell() |
代理连接 | 访问内网服务器(通过跳板机) | open_channel("direct-tcpip") |
优缺点:
- 优点:支持完整的 SSH/SFTP 协议、灵活性强。
- 缺点:性能较低(不适合高并发)、依赖系统库(需安装
libssh2
)。
通过 paramiko
,可以实现服务器自动化运维、网络设备配置等复杂操作,是 Python 运维脚本的核心工具之一。