paramiko 是一个 Python 库,用于通过 SSH 协议连接远程服务器并执行命令,它实现了 SSHv2 协议,支持加密通信和身份验证,是自动化运维和远程管理的常用工具,通过 paramiko,开发者可以在本地代码中安全地远程操作服务器,无需手动登录终端,适用于批量部署、监控、文件传输等场景。

使用 paramiko 执行命令的核心流程包括创建 SSH 客户端、建立连接、执行命令、获取结果以及关闭连接,首先需要安装 paramiko 库,可通过 pip install paramiko 完成,执行命令时,通常使用 SSHClient 类,其 connect() 方法用于建立连接,需指定主机名、端口、用户名和密码(或密钥),连接成功后,通过 exec_command() 方法执行远程命令,该方法返回三个值:标准输入、标准输出和标准错误流,通过读取标准输出可获取命令执行结果,标准错误流则用于捕获错误信息。
paramiko 支持两种身份验证方式:密码验证和密钥验证,密码验证较为简单,直接在 connect() 方法中传入 password 参数即可;密钥验证更安全,需生成 SSH 密钥对(通常使用 ssh-keygen),并将公钥上传到远程服务器的 ~/.ssh/authorized_keys 文件中,代码中通过 pkey 参数传入私钥路径或私钥对象,使用密钥验证时,可先加载私钥文件:private_key = paramiko.RSAKey.from_private_key_file('/path/to/private_key'),然后在 connect() 中传入 pkey=private_key。
执行命令时,exec_command() 是阻塞式方法,命令执行完成后会立即返回结果,适合短时间运行的命令,对于长时间运行的命令(如持续监控日志),需结合 Channel 对象实现交互式操作,通过 invoke_shell() 创建交互式终端,模拟用户输入和输出,但需注意,交互式操作需要处理命令执行的延迟和缓冲区问题,通常使用 select 模块或线程管理输入输出流。
获取命令结果时,标准输出和标准错误流需使用 read().decode('utf-8') 转换为字符串,避免乱码。stdout = stdout.read().decode('utf-8'),同时可通过 stdout.channel.recv_exit_status() 获取命令的退出状态码,0 表示成功,非 0 表示执行失败,关闭连接时,需依次关闭标准输入、输出、错误流以及 SSH 客户端,释放资源。

以下是 paramiko 执行命令的常见步骤及代码示例:
导入库并创建 SSH 客户端对象:
import paramiko ssh = paramiko.SSHClient()
自动添加主机密钥(生产环境建议手动验证):
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
建立连接(以密码验证为例):
(图片来源网络,侵删)ssh.connect(hostname='hostname', port=22, username='username', password='password')
执行命令并获取结果:
stdin, stdout, stderr = ssh.exec_command('ls -l') output = stdout.read().decode('utf-8') error = stderr.read().decode('utf-8') exit_status = stdout.channel.recv_exit_status()关闭连接:
ssh.close()
在实际应用中,建议使用 with 语句或封装成类来管理 SSH 连接,确保资源正确释放,paramiko 还支持 SFTP 文件传输,可通过 open_sftp() 方法创建 SFTP 客户端,实现文件的上传和下载。
| 功能模块 | 关键方法/属性 | 说明 |
|---|---|---|
| 创建客户端 | SSHClient() | 初始化 SSH 客户端对象 |
| 连接服务器 | connect() | 建立 SSH 连接,支持主机名、端口、用户名、密码或密钥参数 |
| 执行命令 | exec_command() | 执行远程命令,返回输入、输出、错误流 |
| 获取结果 | stdout.read().decode() | 读取命令的标准输出并解码为字符串 |
| 获取退出状态 | stdout.channel.recv_exit_status() | 获取命令执行状态码,0 表示成功 |
| 关闭连接 | close() | 关闭 SSH 连接,释放资源 |
| 密钥验证 | RSAKey.from_private_key_file() | 从私钥文件加载密钥,用于 connect() 的 pkey 参数 |
相关问答FAQs:
问题:paramiko 执行命令时如何处理长时间运行的交互式命令?
解答:对于交互式命令(如top或tail -f),需使用SSHClient.invoke_shell()创建交互式终端,通过send()发送命令,recv()读取输出,同时需结合线程或select模块管理输入输出流,避免阻塞。channel = ssh.invoke_shell() channel.send('ls -l\n') output = channel.recv(4096).decode('utf-8')问题:paramiko 连接时出现
Authentication failed错误怎么办?
解答:该错误通常由身份验证失败引起,需检查用户名、密码或密钥是否正确,若使用密钥验证,确保私钥文件路径正确且公钥已上传到远程服务器,检查服务器 SSH 配置文件(/etc/ssh/sshd_config)是否允许密码或密钥登录,并重启 SSH 服务,可通过ssh.connect()的timeout参数设置超时时间,避免长时间等待无响应。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/479124.html<
