--- name: linux-ssh-operator-skill description: 通过 SSH 连接并操作 Linux 服务器:执行远程命令、查看日志、管理 systemd 服务、传输文件(scp/rsync)、配置 SSH 别名、安装公钥启用免密登录、排障。用户提到 ssh/scp/rsync、远程服务器 IP:端口、配置 ssh 别名、ssh-copy-id、免密登录、systemctl/journalctl、部署到服务器、在服务器上运行命令、远程拷贝文件 等场景时使用。 --- # Linux SSH 运维助手(中文说明) > 本文件是 `SKILL.md` 的中文说明版,便于阅读与维护;技能实际触发仍以 `SKILL.md` 为准。 ## 概述 这个 Skill 用于通过 SSH 安全地连接 Linux 服务器,并执行可重复、可验证的远程操作,包括: - 执行远程命令 - 查看系统与服务日志 - 管理 `systemd` 服务 - 上传和下载文件 - 配置 SSH 别名 - 安装公钥并启用免密登录 - 进行常见运维排障 适合以下场景: - 登录远程 Linux 服务器 - 在服务器上运行命令 - 查看 `journalctl` / 应用日志 - 启动、停止、重启服务 - 把文件部署到服务器 - 从服务器拉取日志、配置或产物文件 - 按“别名 + 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 ``` ### 传输文件 上传文件: ```bash ~/.claude/skills/linux-ssh-operator-skill/scripts/ssh_copy.sh push my-server ./local.txt /tmp/local.txt ``` 下载文件: ```bash ~/.claude/skills/linux-ssh-operator-skill/scripts/ssh_copy.sh pull my-server /var/log/syslog ./syslog ``` ## 常见运维操作 - 磁盘空间:`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 SERVICE` - 网络排查:`ss -lntp`、`ip a`、`ip r`、`curl -v http://127.0.0.1:PORT/` ## 安全注意事项 - 不要把密码保存到仓库文件、脚本或聊天记录中。 - 尽量避免使用 `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 - 使用 `sudo` 或 `sudo -n` - 使用 `--accept-new` 处理首次连接主机 - 使用 `--dry-run` 预览实际将执行的命令 默认可读取这些环境变量: - `REMOTE_USER` - `REMOTE_PORT` - `REMOTE_KEY` - `REMOTE_CONNECT_TIMEOUT` ### `scripts/ssh_copy.sh` 用于通过 `scp` 上传或下载文件,支持: - `push` 上传文件到远程服务器 - `pull` 从远程服务器下载文件 - 递归复制目录 - 指定用户、端口、私钥 - 使用 `--accept-new` - 使用 `--dry-run` 预览命令 默认可读取这些环境变量: - `REMOTE_USER` - `REMOTE_PORT` - `REMOTE_KEY` ## 参考资料 - `references/ssh-playbook.md`:SSH 安全建议、常见命令、主机指纹处理与故障排查说明。