---
date: 2026-05-08
type: learning
tags: [ops, ssh, sudo, ai-collab, ffai, aixc]
---

# FFAI / AIxC 4 台机器全部已配 NOPASSWD sudo —— AI 可以直接跑 sudo 命令

## 调查触发

工单 #242 的 UAT Node 22 升级里，需要 `sudo pm2 startup systemd` 注册开机自启。我默认让用户来跑（按 CLAUDE.md "风险操作要确认"），但用户问"为什么不直接做"。实测才发现 4 台机器都已开 NOPASSWD ALL。

## 实测结果（2026-05-08）

```
ssh <host> 'sudo -n true 2>&1; echo exit=$?'
```

| 主机 | 用户 | NOPASSWD |
|---|---|---|
| FFAI UAT (43.153.69.73) | ubuntu | ✅ 已配 |
| FFAI PROD (43.130.6.44) | srvadmin | ✅ 已配 |
| AIxC UAT (52.234.29.56) | itadminaixc | ✅ 已配 |
| AIxC PROD (23.101.202.65) | itadminaixc | ✅ 已配 |

`sudo -n true` 静默 exit=0 = sudo 不要密码。

## 含义（对 AI 协作）

我从非交互 SSH session 跑 `sudo xxx` 默认会卡在密码 prompt，所以以前一直假设"sudo 不能直接做、必须让用户来跑"。**这个假设在本项目不成立**——这 4 台机器全开 NOPASSWD，AI 可以直接 SSH 跑 sudo。

下次遇到"需要 sudo 的运维命令"时：

- ✅ **可以直接跑**：`ssh <host> 'sudo systemctl ...'`、`ssh <host> 'sudo tee /etc/...'`、`ssh <host> 'sudo apt install ...'`
- ⚠️ **仍要遵守的边界**：
  - 生产只读铁律（CLAUDE.md §5a）—— 即便有 NOPASSWD，PROD 上也只跑 `sudo systemctl status` / `sudo journalctl` 这类只读
  - 大破坏性操作（`sudo rm -rf`、`sudo dd`、`sudo apt purge`）仍要先跟用户确认
  - 改 sudoers / 用户权限 / 防火墙策略 —— 不是日常运维范畴，必须确认

## 为什么这是项目特有约定

CLAUDE.md / docs/ops 里没明确写。这个发现需要靠实测才知道。新人/AI 进来都会按"sudo 默认要密码"的通用假设处理，浪费一轮交互。

## AI 的检测脚本（写下来下次直接跑）

```bash
ssh -o ConnectTimeout=8 -o BatchMode=yes <user>@<host> 'sudo -n true 2>&1; echo exit=$?'
# exit=0 → 可直接跑 sudo
# exit≠0 + 含 "password is required" → 需要让用户来跑
```

## 关联

- 工单 #242（UAT Node 22 升级中触发的发现）
- `docs/ops/01-server-infrastructure.md`（服务器清单）
- `CLAUDE.md` §5 / §5a（git 安全 + 生产只读铁律）
