Python 脚本入门:用 paramiko 批量管理服务器的 3 个实用场景
【摘要】 paramiko 是 Python 里最常用的 SSH 库。本文分享 3 个批量管理服务器的实用场景:循环批量执行命令(含超时与密钥认证要点)、用 SFTP 上传下载文件、包一层重试逻辑应对网络抖动,十几行代码覆盖日常九成运维需求。
做运维或测试经常要同时操作十几台服务器,一台台 SSH 登录敲命令效率太低。paramiko 是 Python 里最常用的 SSH 库,十几行代码就能批量执行命令、传文件。下面分享 3 个我常用的场景。
一、批量执行命令
把机器列表放进一个文件,循环连接并执行同一条命令:
import paramiko
with open("hosts.txt") as f:
for line in f:
ip, user, pwd = line.strip().split(",")
cli = paramiko.SSHClient()
cli.set_missing_host_key_policy(paramiko.AutoAddPolicy())
cli.connect(ip, username=user, password=pwd, timeout=5)
_, out, err = cli.exec_command("df -h /")
print(ip, out.read().decode())
cli.close()
注意三点:超时一定要设(timeout=5),否则某台机器宕机会卡住整个循环;生产环境建议改用密钥认证(key_filename 参数),不要在代码里放密码;exec_command 每次是一个独立会话,多条有依赖的命令用分号连成一条。
二、上传下载文件
SFTP 是 paramiko 自带的子模块,比 scp 更好编程:
sftp = cli.open_sftp()
sftp.put("local.log", "/tmp/remote.log")
sftp.get("/var/log/app.log", "app.log")
sftp.close()
批量分发配置文件、回收日志都很方便。大文件建议配合进度回调(put 的 callback 参数)打印进度。
三、包一层重试逻辑
网络抖动很常见,直接裸调会偶发失败。简单包一层:
import time
def run_with_retry(fn, n=3, wait=2):
for i in range(n):
try:
return fn()
except Exception as e:
if i == n - 1:
raise
time.sleep(wait)
把 connect 或 exec_command 包进 run_with_retry,成功率立刻上去。
小结
paramiko 的定位是「能用 Python 表达的 SSH」:批量执行、文件传输、异常重试三板斧覆盖了日常九成需求。机器规模上百后可以再升级到 Ansible 这类编排工具,但理解 paramiko 的原理会让你排查 Ansible 问题时不慌。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)