Files
sproutclaw-data/agent/skills/linux-ssh-operator-skill/SKILL.zh-CN.md
shumengya 50edff80f5 feat: 导出 SproutClaw .sproutclaw 配置
包含 extensions、skills、prompts、settings、auth、models、mcp 等配置。
排除 node_modules、npm 缓存、sessions 等运行时数据。
2026-06-26 15:48:56 +08:00

271 lines
8.1 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: linux-ssh-operator-skill
description: 通过 SSH 连接并操作 Linux 服务器:执行远程命令、查看日志、管理 systemd 服务、传输文件scp/rsync、配置 SSH 别名、安装公钥启用免密登录、SSH 隧道/端口转发、跳板机、内网穿透、排障。用户提到 ssh/scp/rsync、远程服务器 IP:端口、配置 ssh 别名、ssh-copy-id、免密登录、systemctl/journalctl、部署到服务器、在服务器上运行命令、远程拷贝文件、SSH 隧道、端口转发、跳板机、堡垒机、服务器上看一下、帮我连上服务器、查看服务器日志 等场景时使用。
---
# Linux SSH 运维助手(中文说明)
> 本文件是 `SKILL.md` 的中文说明版,便于阅读与维护;技能实际触发仍以 `SKILL.md` 为准。
## 概述
这个 Skill 用于通过 SSH 安全地连接 Linux 服务器,并执行可重复、可验证的远程操作,包括:
- 执行远程命令
- 查看系统与服务日志
- 管理 `systemd` 服务
- 上传和下载文件scp 或 rsync
- 配置 SSH 别名
- 安装公钥并启用免密登录
- SSH 隧道 / 端口转发 / 跳板机
- 进行常见运维排障
适合以下场景:
- 登录远程 Linux 服务器
- 在服务器上运行命令
- 查看 `journalctl` / 应用日志
- 启动、停止、重启服务
- 把文件部署到服务器scp 或 rsync 增量同步)
- 从服务器拉取日志、配置或产物文件
- 按"别名 + IP + 密码"快速配置一键 SSH 免密登录
- 配置端口转发访问内网服务
- 通过跳板机/堡垒机连接内网服务器
## 工作流程
1. 先确认授权,以及目标信息:主机、端口、用户名。
2. 优先使用 SSH 密钥进行非交互连接,避免在聊天记录或文件里保存密码。
3. 优先先做只读检查,再执行修改,最后进行验证。
4. 如果需要密码提示或交互式工具,使用真实终端或启用 TTY。
## 快速开始
### 配置 SSH 密钥(推荐)
生成一把 `ed25519` 密钥:
```bash
ssh-keygen -t ed25519 -C "codex" -f ~/.ssh/id_ed25519
```
把公钥安装到目标服务器(示例端口为 `22`
```bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 22 USER@SERVER_IP
```
可选:在 `~/.ssh/config` 中配置主机别名:
```sshconfig
Host my-server
HostName SERVER_IP
Port 22
User USER
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
```
之后可直接连接:
```bash
ssh my-server
```
### 一键配置别名 + 免密登录
当用户提供"别名、主机/IP、密码",并希望直接通过 `ssh 别名` 登录时,优先使用下面的流程:
1. 使用辅助脚本写入或更新 SSH 别名:
```bash
~/.claude/skills/linux-ssh-operator-skill/scripts/ssh_alias_setup.sh my-server 192.168.1.10 --user root --install-key
```
2. 如果 `ssh-copy-id` 提示输入密码,请在 TTY 中输入一次密码。
3. 安装完成后验证免密登录:
```bash
ssh -o BatchMode=yes my-server 'echo SSH_OK; id -un 2>/dev/null || echo root'
```
4. 告诉用户 `scp``rsync` 也可以直接复用这个别名:
```bash
scp ./file.txt my-server:/root/
rsync -av ./dir/ my-server:/root/dir/
```
补充说明:
- `scripts/ssh_alias_setup.sh` 在本机没有 `~/.ssh/id_ed25519` 时会自动生成。
- 它会幂等更新 `~/.ssh/config`,默认使用 `root`、端口 `22``StrictHostKeyChecking=accept-new`
- 如果要做临时测试,可以设置 `SSH_CONFIG_FILE=/path/to/temp-config`
### 运行远程命令
直接执行:
```bash
ssh my-server uname -a
```
`sudo` 执行(通常需要 TTY
```bash
ssh -tt my-server sudo systemctl status nginx --no-pager
```
使用封装脚本执行(统一参数风格,支持环境变量默认值如 `REMOTE_USER``REMOTE_PORT``REMOTE_KEY`
```bash
~/.claude/skills/linux-ssh-operator-skill/scripts/ssh_run.sh my-server -- uname -a
~/.claude/skills/linux-ssh-operator-skill/scripts/ssh_run.sh --tty --sudo my-server -- systemctl restart nginx
~/.claude/skills/linux-ssh-operator-skill/scripts/ssh_run.sh --compress my-server -- cat /var/log/big.log
```
### 传输文件
上传文件scp
```bash
~/.claude/skills/linux-ssh-operator-skill/scripts/ssh_copy.sh push my-server ./local.txt /tmp/local.txt
```
下载文件scp
```bash
~/.claude/skills/linux-ssh-operator-skill/scripts/ssh_copy.sh pull my-server /var/log/syslog ./syslog
```
增量同步rsync推荐用于目录或大文件
```bash
# 上传目录
~/.claude/skills/linux-ssh-operator-skill/scripts/ssh_copy.sh --rsync push my-server ./dist/ /var/www/html/
# 上传并删除远端多余文件
~/.claude/skills/linux-ssh-operator-skill/scripts/ssh_copy.sh --rsync --delete push my-server ./dist/ /var/www/html/
# 下载目录
~/.claude/skills/linux-ssh-operator-skill/scripts/ssh_copy.sh --rsync pull my-server /var/log/ ./logs/
```
### SSH 隧道 / 端口转发
本地转发(将远程服务映射到本地端口):
```bash
# 把远程 MySQL(3306) 映射到本地 13306
ssh -L 13306:127.0.0.1:3306 my-server -N
```
远程转发(将本地服务暴露到服务器端口):
```bash
# 把本地 :8080 映射到服务器 :18080
ssh -R 18080:127.0.0.1:8080 my-server -N
```
跳板机 / 堡垒机:
```bash
ssh -J bastion-user@bastion:22 target-user@target-host
```
或在 `~/.ssh/config` 中配置:
```sshconfig
Host target-internal
HostName 10.0.0.50
User ubuntu
ProxyJump bastion
```
### SSH 多路复用(加速重复连接)
`~/.ssh/config` 中添加,复用同一 TCP 连接:
```sshconfig
Host *
ControlMaster auto
ControlPath ~/.ssh/ctrl-%h-%p-%r
ControlPersist 60s
```
第一次 `ssh my-server` 建立主连接,后续连接直接复用,无需重新握手,速度更快。
## 常见运维操作
- 磁盘空间:`df -h`
- 目录占用:`du -sh /path/* | sort -h`
- 内存查看:`free -h`
- 进程查看:`ps aux --sort=-%mem | head`
- 日志查看:`journalctl -u SERVICE -n 200 --no-pager`
- 日志跟踪:`tail -n 200 -f /path/log`
- 服务管理:`systemctl status|restart|stop|enable SERVICE`
- 网络排查:`ss -lntp``ip a``ip r``curl -v http://127.0.0.1:PORT/`
- Docker`docker ps``docker logs -f CONTAINER``docker exec -it CONTAINER bash`
- 配置测试:`nginx -t``sshd -T`
- 端口占用:`lsof -i :PORT``fuser PORT/tcp`
## 安全注意事项
- 不要把密码保存到仓库文件、脚本或聊天记录中。
- 尽量避免使用 `StrictHostKeyChecking=no`
- 首次连接建议核验主机指纹;只有在临时环境自动化场景下,才考虑 `accept-new`
- 对于破坏性命令(如删除、关机、防火墙调整),必须先确认再执行,并展示将要运行的确切命令。
## 附带脚本
### `scripts/ssh_alias_setup.sh`
用于创建或更新 SSH 别名,并可选执行 `ssh-copy-id`,支持:
- 指定别名、主机、用户、端口、私钥
- 自动生成默认的 `~/.ssh/id_ed25519`
- 幂等更新 `~/.ssh/config`
- 可选直接运行 `ssh-copy-id` 安装公钥
- 使用 `--dry-run` 预览即将执行的动作
### `scripts/ssh_run.sh`
用于通过 SSH 执行远程命令,支持:
- 指定用户、端口、私钥
- 设置连接超时
- 启用 TTY`--tty`
- 启用 SSH 压缩(`--compress`,适合慢速链路)
- 使用 `sudo``sudo -n`
- 使用 `--accept-new` 处理首次连接主机
- 使用 `--dry-run` 预览实际将执行的命令
默认可读取这些环境变量:
- `REMOTE_USER`
- `REMOTE_PORT`
- `REMOTE_KEY`
- `REMOTE_CONNECT_TIMEOUT`
### `scripts/ssh_copy.sh`
用于通过 `scp``rsync` 上传或下载文件,支持:
- `push` 上传文件到远程服务器
- `pull` 从远程服务器下载文件
- `--rsync`:使用 rsync 增量同步(显示进度,适合目录和大文件)
- `--delete`:配合 `--rsync push` 删除远端多余文件
- 递归复制目录scp 模式用 `-r`
- 指定用户、端口、私钥
- 使用 `--accept-new`
- 使用 `--dry-run` 预览命令
默认可读取这些环境变量:
- `REMOTE_USER`
- `REMOTE_PORT`
- `REMOTE_KEY`
## 参考资料
- `references/ssh-playbook.md`SSH 安全建议、常见命令、主机指纹处理与故障排查说明。