从 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 的SSHClient与SFTPClient。这条路径本身没问题,但实际运维里会遇到两类反复出现的麻烦:
第一类是字段语义对不上。psutil 返回的是 namedtuple,mem.total、mem.used、mem.percent、mem.free看起来直观,但buffers和cached在 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 failed或Unable 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=False和timeout=10。前者避免 paramiko 去~/.ssh里找私钥导致认证路径混乱,后者避免网络不通时脚本长时间挂起。这两个参数正是 Codex 在排障时经常建议补上的。
四、验证请求与成功结果:让 Codex 确认字段和连接
配置好之后,验证分两步。
第一步,验证 Codex 到 TaoToken 的请求能通。在 Codex 会话里发一句简单的确认,比如让它解释psutil.virtual_memory()返回的buffers和cached在 Linux 上的区别。如果模型正常返回内容,说明 Base URL 和 Key 都生效了,请求成功返回。这一步的意义是确认 Token 消耗在有效对话上,而不是卡在认证失败。
第二步,把脚本的真实输出贴给 Codex。先跑 psutil 那段,把disk_io_counters(perdisk=True)的打印结果贴进去,问它每个键对应的物理含义,以及read_bytes和read_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()的total、used、free做口径核对。注意free -m的buff/cache和 psutil 的buffers+cached不是简单相加关系,Codex 能帮你理清这个差异,避免你在监控脚本里把两个来源的数字混用。
如果 paramiko 报错,比如:
paramiko.ssh_exception.AuthenticationException: Authentication failed.把完整异常栈贴给 Codex,同时告诉它你用的connect()参数。它通常会让你先确认allow_agent和look_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这一条远程查询跑通,后面的批量运维脚本就有了可复用的验证路径。