news 2026/9/19 11:48:44

psutil 与 paramiko 批量运维脚本,Codex 连上 TaoToken 后能跑通 free -m 远程查询

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
psutil 与 paramiko 批量运维脚本,Codex 连上 TaoToken 后能跑通 free -m 远程查询

从 psutil 采集到 paramiko 远程执行:用 Codex 连上 TaoToken 跑通 free -m 验证

写运维脚本最怕的不是代码长,而是环境依赖多、SSH 参数一多就不知道哪一步断了。本文围绕 psutil 的系统信息采集与 paramiko 的远程命令执行,把 Codex 接到 TaoToken 上,让模型帮你核对psutil.virtual_memory()psutil.disk_io_counters()的字段含义,修正paramiko.SSHClient().exec_command('free -m')的连接写法,并在对话里看到请求成功返回,确认 Token 消耗落在有效的脚本排障上。TaoToken 官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end

一、原问题与场景:本地依赖多,SSH 一多就难排查

原文的路径是先在本地pip install psutil,然后逐个方法试cpu_times()virtual_memory()disk_io_counters()net_io_counters(),再进入 paramiko 的SSHClientSFTPClient。这条路径本身没问题,但实际运维里会遇到两类反复出现的麻烦:

第一类是字段语义对不上。psutil 返回的是 namedtuple,mem.totalmem.usedmem.percentmem.free看起来直观,但bufferscached在 Linux 上的口径、disk_io_counters(perdisk=True)返回的字典结构、net_io_counters(pernic=True)的键名,在不同内核和 psutil 版本下会有差异。你盯着一个数字,不确定它是不是你以为的那个含义。

第二类是 paramiko 连接参数一多就难定位。connect()里 hostname、port、username、password、pkey、key_filename、timeout、allow_agent、look_for_keys、compress 十来个参数,任何一个写错,报错信息往往只给一句Authentication failedUnable to connect,你分不清是密码错、端口错、还是set_missing_host_key_policy没设导致未知主机被拒。

这两类问题的共同点是:你需要一个能读懂你贴的报错和输出、并给出具体修改建议的执行工具。Codex 通过 TaoToken 拿到模型访问能力后,正好承担这个角色——你把free -m的输出或 paramiko 的异常栈贴进去,它帮你确认字段、修正写法,而不是让你在搜索引擎里翻十几篇口径不一的帖子。

二、TaoToken 前置:先创建 Key,再填 Base URL

在动 Codex 之前,先到 TaoToken 官网创建 API Key。入口在这里:

https://taotoken.net/?utm_source=taotoken_aicg_blog_end

登录后进入控制台,在 API Keys 页面新建一个 Key。这个 Key 就是后面 Codex 请求时用的凭证,格式形如YOUR_API_KEY。创建完先复制保存,页面刷新后不一定还能看到完整值。

Codex 侧的接入点(Base URL)填:

https://taotoken.net/api

注意这里不带任何查询参数,就是干净的 API 根地址。Codex 会把请求发到这个 Base URL 下的兼容路径,由 TaoToken 转发到对应模型。

如果你用的是命令行方式启动 Codex 相关能力,TaoToken 也提供了 CLI 工具:

npm i -g @taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m MODEL_ID

其中-k是刚创建的 Key,-u是 API 地址,-m是你要用的模型 ID。这条命令适合在终端里快速起一个带模型能力的会话,把 psutil/paramiko 的报错直接贴进去问。

需要区分的是:TaoToken 提供的是模型访问能力,不是替代你的 Python 环境,也不是替你执行 SSH。psutil 还是要pip install,paramiko 还是要你自己写连接逻辑,TaoToken 让 Codex 能读懂你的代码和报错并给出修正建议。

三、可复制配置:Codex 侧与脚本侧分开写

先看 Codex 侧的配置。如果你用的是配置文件方式,核心就是 Base URL 和 Key 两项。以常见的 OpenAI 兼容配置为例,在 Codex 的配置里指定:

# Codex 侧配置示意 base_url = "https://taotoken.net/api" api_key = "YOUR_API_KEY" model = "MODEL_ID"

如果你走的是环境变量方式,对应设置:

export OPENAI_BASE_URL="https://taotoken.net/api" export OPENAI_API_KEY="YOUR_API_KEY"

具体变量名以你所用 Codex 版本的文档为准,关键是 Base URL 指向https://taotoken.net/api,Key 用你创建的那一串。

再看脚本侧。原文的 psutil 采集部分保持不变,这里给一个可直接跑的片段,用来生成待验证的输出:

import psutil import datetime # CPU print("逻辑核心数:", psutil.cpu_count()) print("物理核心数:", psutil.cpu_count(logical=False)) print("用户进程CPU:", psutil.cpu_times().user) # 内存 mem = psutil.virtual_memory() print("内存总容量:", mem.total) print("内存已使用:", mem.used) print("内存占用:", mem.percent) print("剩余:", mem.free) print("虚拟内存:", psutil.swap_memory()) # 磁盘 print("磁盘分区:", psutil.disk_partitions()) print("磁盘读写:", psutil.disk_io_counters()) print("每块磁盘读写:", psutil.disk_io_counters(perdisk=True)) # 网络 print("总网络信息:", psutil.net_io_counters()) print("每块网卡:", psutil.net_io_counters(pernic=True)) # 其他 print("当前登录用户:", psutil.users()) print("开机时间:", datetime.datetime.fromtimestamp( psutil.boot_time()).strftime('%Y-%m-%d %H:%M:%S'))

paramiko 远程执行free -m的部分,按原文结构整理成可复制版本:

import paramiko hosts = '192.168.112.122' port = 22 user = 'root' pwd = '123123' paramiko.util.log_to_file('system.log') ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect( hostname=hosts, port=port, username=user, password=pwd, allow_agent=False, look_for_keys=False, timeout=10 ) stdin, stdout, stderr = ssh_client.exec_command('free -m') for line in stdout: print(line, end='') err = stderr.read().decode() if err: print("STDERR:", err) stdin.close() ssh_client.close()

这里比原文多加了look_for_keys=Falsetimeout=10。前者避免 paramiko 去~/.ssh里找私钥导致认证路径混乱,后者避免网络不通时脚本长时间挂起。这两个参数正是 Codex 在排障时经常建议补上的。

四、验证请求与成功结果:让 Codex 确认字段和连接

配置好之后,验证分两步。

第一步,验证 Codex 到 TaoToken 的请求能通。在 Codex 会话里发一句简单的确认,比如让它解释psutil.virtual_memory()返回的bufferscached在 Linux 上的区别。如果模型正常返回内容,说明 Base URL 和 Key 都生效了,请求成功返回。这一步的意义是确认 Token 消耗在有效对话上,而不是卡在认证失败。

第二步,把脚本的真实输出贴给 Codex。先跑 psutil 那段,把disk_io_counters(perdisk=True)的打印结果贴进去,问它每个键对应的物理含义,以及read_bytesread_count的单位。再跑 paramiko 那段,如果free -m正常返回,你会看到类似:

total used free shared buff/cache available Mem: 1837 412 198 12 1226 1180 Swap: 2047 0 2047

把这个输出贴给 Codex,让它对照psutil.virtual_memory()totalusedfree做口径核对。注意free -mbuff/cache和 psutil 的buffers+cached不是简单相加关系,Codex 能帮你理清这个差异,避免你在监控脚本里把两个来源的数字混用。

如果 paramiko 报错,比如:

paramiko.ssh_exception.AuthenticationException: Authentication failed.

把完整异常栈贴给 Codex,同时告诉它你用的connect()参数。它通常会让你先确认allow_agentlook_for_keys是否设成 False,再检查密码里是否有特殊字符被 shell 转义。这类排查如果自己翻文档,要来回试很多次;在 Codex 会话里,一轮对话就能定位到具体参数。

成功跑通的标志有三个:Codex 能正常返回模型内容、psutil 输出字段被解释清楚、paramiko 的free -m输出与预期一致。三个都满足,说明这条从 TaoToken 到 Codex 再到运维脚本的链路是通的。

五、本篇常见错排查

错误一:Codex 请求返回 401 或认证失败。先检查 Key 是否复制完整,有没有多余空格。再确认 Base URL 是https://taotoken.net/api,没有多写路径或参数。如果用的是环境变量,确认当前终端会话里变量已生效,echo $OPENAI_API_KEY能看到值。

错误二:paramiko 报Unable to connect to port 22这通常是网络层问题,不是 Codex 或 TaoToken 的问题。先确认目标主机 IP 和端口可达,telnet 192.168.112.122 22试一下。如果目标机在云上,检查安全组是否放行 22 端口。

错误三:free -m返回空或只有表头。检查exec_command后是否读了stdout,以及是否在close()之前读。paramiko 的 stdout 是文件对象,for line in stdout会逐行读,但如果命令本身在远程执行失败,输出会进stderr。把stderr.read()也打印出来,能看到远程 shell 的报错。

错误四:psutil 的disk_io_counters()返回 None。在某些容器环境或权限受限的情况下,磁盘 IO 计数器不可读,psutil 会返回 None。这不是脚本写错,是环境限制。Codex 会建议你先判断返回值再取字段,避免AttributeError

错误五:set_missing_host_key_policy没设导致首次连接被拒。默认策略是RejectPolicy,首次连接未知主机时会直接拒绝。加上AutoAddPolicy()后,未知主机密钥会被自动加入本地 HostKeys。生产环境如果在意安全性,可以用WarningPolicy记录告警而不是静默接受。

错误六:Codex 会话里贴了报错但模型答非所问。把报错栈、你的connect()参数、以及你期望的结果一起贴进去,信息越完整,模型定位越准。只贴一句Authentication failed,任何工具都只能猜。

六、语义一致 CTA:按你的下一步选入口

如果你现在卡在 Key 创建或 Base URL 配置上,直接去 API Keys 页面和接入文档对照检查:

  • 创建与管理 Key:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
  • 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite

如果你已经配好,想先验证模型能不能正常返回、确认 psutil 字段解释是否准确,去模型对话页面直接试:

  • 模型对话:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite

如果你打算把 Codex 长期用在运维脚本的编写、审查和排障上,比如持续维护 psutil 采集逻辑和 paramiko 批量执行模块,看 Coding Plan:

  • Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite

回到本篇的场景:psutil 负责采集,paramiko 负责远程执行,Codex 通过 TaoToken 负责读懂你的输出和报错。三者各司其职,Token 消耗落在真实的脚本验证和排障上,而不是反复试错。先把free -m这一条远程查询跑通,后面的批量运维脚本就有了可复用的验证路径。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 11:46:43

Markmap 的 Markdown 转思维导图,这次让走 TaoToken 的 Codex 生成大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 11:45:12

2026年GitHub登录全指南:从令牌、SSH到OAuth认证实践

1. 先搞清楚一件事:2026年的GitHub登录到底是什么这两年如果你还停留在“用户名密码 登录”的思维里,那在GitHub上会寸步难行。GitHub早在2021年就从命令行删除了密码认证,到2023年之后,凡是涉及Git操作、API调用、CI/CD流水线的…

作者头像 李华
网站建设 2026/9/19 11:44:52

Win11右键新建文本文档消失?记事本找回与注册表修复指南

升级到 Win11 以后,右键新建菜单里找不到“文本文档”,开始菜单搜“记事本”也提示找不到应用——这个场景我在好几台电脑上遇到过,有同事从 Windows 10 升级后突然冒出来的,有朋友用了系统清理工具后消失的,还有的电脑…

作者头像 李华