SSH服务器管理
diegosouzapw2026-10-28查看 628复制 840
通过 SSH 安全连接并管理远程 Linux/Unix 服务器。执行命令、传输文件(SCP/SFTP)、设置端口转发和隧道。当用户要求 SSH 登录服务器、连接远程机器、运行远程命令、上传/下载文件到服务器、设置隧道或执行服务器管理任务时使用。适用于 Windows、macOS 和 Linux。
📘如何使用这个技能
- 1复制技能内容·点击上方「Copy SKILL.md」复制全部内容,或 Download 下载到本地
- 2打开你的 AI 客户端·支持 Claude Code、Trae、Cursor、ChatGPT、DeepSeek、Kimi 等任意 AI 助手
- 3粘贴为系统提示/知识文件·Claude Code:放入 .claude/skills/ 目录;普通对话:作为首条消息发送并说「请严格按这份技能文档执行」
- 4直接提出你的需求·AI 会按技能定义的工作流、格式和约束来处理,无需再解释背景
💡 提示:技能生效后,每次对话只需一句需求,AI 会按 SKILL.md 的流程执行。
SKILL.md12386 chars
--- name: ssh-server-admin description: Securely connect to and manage remote Linux/Unix servers via SSH. Execute commands, transfer files (SCP/SFTP), set up port forwarding and tunnels. Use when the user asks to SSH into a server, connect to a remote machine, run remote commands, upload/download files to servers, set up tunnels, or perform server administration tasks. Works on Windows, macOS, and Linux. --- # SSH Server Administration A comprehensive skill for secure remote server management via SSH. Supports command execution, file transfers, port forwarding, and tunneling. **Cross-platform compatible: Windows, macOS, and Linux.** ## Platform Detection **CRITICAL: Detect the operating system first to use the correct SSH approach.** Before executing SSH commands, check the platform: - **Windows**: Use PowerShell or Windows OpenSSH (built into Windows 10+) - **macOS/Linux**: Use standard bash SSH commands ## Authentication Methods (In Order of Preference) ### 1. SSH Key Authentication (RECOMMENDED - Works Everywhere) SSH keys are the most secure and reliable method. They work identically on all platforms. **Check for existing keys:** ```bash # Windows (PowerShell) Get-ChildItem ~/.ssh/id_*.pub # macOS/Linux ls -la ~/.ssh/id_*.pub ``` **If keys exist, use them:** ```bash # All platforms - key auth is automatic if keys are set up ssh -o StrictHostKeyChecking=accept-new [username]@[host] "[command]" ``` **If no keys exist, help user create them:** ```bash # All platforms (works in PowerShell, bash, zsh) ssh-keygen -t ed25519 -C "user@example.com" # Copy public key to server (if ssh-copy-id available) ssh-copy-id -i ~/.ssh/id_ed25519.pub [username]@[host] # Or manually append to server's authorized_keys cat ~/.ssh/id_ed25519.pub | ssh [username]@[host] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" ``` ### 2. Password Authentication **IMPORTANT: Password auth handling differs by platform.** #### Windows Approach Windows OpenSSH doesn't support `sshpass`. Use one of these methods: **Option A: Use the included Python SSH helper (RECOMMENDED)** ```powershell # Uses paramiko library for cross-platform SSH python scripts/ssh_helper.py --host [host] --user [username] --password [password] --command "[command]" ``` **Option B: Interactive SSH (user types password)** ```powershell # This will prompt for password interactively ssh -o StrictHostKeyChecking=accept-new [username]@[host] "[command]" ``` **Option C: Use PuTTY's plink (if installed)** ```powershell # plink can accept password via echo (less secure) echo [password] | plink -ssh -pw [password] [username]@[host] "[command]" ``` #### macOS/Linux Approach **Option A: Use sshpass (if available)** ```bash # Check if sshpass is installed which sshpass # If installed, use it sshpass -p '[password]' ssh -o StrictHostKeyChecking=accept-new [username]@[host] "[command]" ``` **Option B: Use the Python SSH helper** ```bash python3 scripts/ssh_helper.py --host [host] --user [username] --password [password] --command "[command]" ``` **Option C: Install sshpass** ```bash # Ubuntu/Debian sudo apt-get install sshpass # macOS (with Homebrew) brew install hudochenkov/sshpass/sshpass # Then use sshpass commands ``` --- ## Session Credential Management **CRITICAL: One-Time Credential Collection** When the user first requests an SSH operation, collect credentials ONCE: ``` I need SSH connection details. Please provide: 1. **Host/IP Address**: (e.g., 192.168.1.100 or server.example.com) 2. **Username**: (e.g., root, admin, ubuntu) 3. **Authentication Method**: - SSH Key (recommended) - just provide path if not default - Password 4. **Port** (optional): Default is 22 Example response: - Host: 192.168.1.100 - Username: admin - Auth: SSH Key (default location) OR Password: mypassword123 - Port: 22 ``` After receiving credentials: - Store them in working memory for the session - Detect the operating system and choose appropriate SSH method - Use credentials for ALL subsequent operations without re-prompting - NEVER write credentials to files or logs --- ## Cross-Platform Command Reference ### Remote Command Execution **With SSH Keys (All Platforms):** ```bash ssh -o StrictHostKeyChecking=accept-new -o ConnectTimeout=30 [username]@[host] "[command]" ``` **With Password (Platform-Specific):** ```bash # macOS/Linux with sshpass sshpass -p '[password]' ssh -o StrictHostKeyChecking=accept-new [username]@[host] "[command]" # All platforms with Python helper python scripts/ssh_helper.py --host [host] --user [username] --password "[password]" --command "[command]" ``` ### File Transfer (SCP) **Upload file:** ```bash # With keys (all platforms) scp -o StrictHostKeyChecking=accept-new [local_file] [username]@[host]:[remote_path] # With password (macOS/Linux) sshpass -p '[password]' scp -o StrictHostKeyChecking=accept-new [local_file] [username]@[host]:[remote_path] # With Python helper (all platforms) python scripts/ssh_helper.py --host [host] --user [username] --password "[password]" --upload [local_file] --remote-path [remote_path] ``` **Download file:** ```bash # With keys (all platforms) scp -o StrictHostKeyChecking=accept-new [username]@[host]:[remote_file] [local_path] # With password (macOS/Linux) sshpass -p '[password]' scp -o StrictHostKeyChecking=accept-new [username]@[host]:[remote_file] [local_path] # With Python helper (all platforms) python scripts/ssh_helper.py --host [host] --user [username] --password "[password]" --download [remote_file] --local-path [local_path] ``` ### Port Forwarding **Local Port Forwarding (-L):** ```bash # Access remote service on local port (all platforms with keys) ssh -L [local_port]:localhost:[remote_port] [username]@[host] # Example: Access remote MySQL (3306) on local port 3307 ssh -L 3307:localhost:3306 [username]@[host] ``` **Remote Port Forwarding (-R):** ```bash # Expose local service to remote (all platforms with keys) ssh -R [remote_port]:localhost:[local_port] [username]@[host] ``` **Dynamic Port Forwarding (SOCKS Proxy):** ```bash ssh -D [local_port] [username]@[host] ``` --- ## Server Administration Tasks ### System Information ```bash # Check system info ssh user@host "uname -a && cat /etc/os-release" # Check disk space ssh user@host "df -h" # Check memory usage ssh user@host "free -h" # Check running processes ssh user@host "ps aux --sort=-%mem | head -20" # Check system load ssh user@host "uptime && top -bn1 | head -15" ``` ### Service Management (systemd) ```bash # Check service status ssh user@host "systemctl status [service_name]" # Start/stop/restart service ssh user@host "sudo systemctl start|stop|restart [service_name]" # View service logs ssh user@host "journalctl -u [service_name] -n 50 --no-pager" ``` ### Log Analysis ```bash # View recent system logs ssh user@host "sudo tail -100 /var/log/syslog" # Search logs for errors ssh user@host "sudo grep -i error /var/log/syslog | tail -50" # View auth logs ssh user@host "sudo tail -50 /var/log/auth.log" ``` ### Network Diagnostics ```bash # Check listening ports ssh user@host "ss -tulpn" # Check network connections ssh user@host "netstat -an | grep ESTABLISHED" # Test connectivity ssh user@host "ping -c 3 [target] && traceroute [target]" ``` --- ## Instructions for Claude 1. **Detect Platform First**: Check if running on Windows, macOS, or Linux to choose the right SSH approach. 2. **Prefer SSH Keys**: Always check for and recommend SSH key authentication first. 3. **First SSH Request**: Prompt for credentials using the format above. Wait for response before proceeding. 4. **Store Credentials**: Remember credentials for the entire session. DO NOT ask again. 5. **Choose Correct Method**: - If SSH keys are available → Use standard SSH commands - If password auth on Windows → Use Python helper script or prompt user - If password auth on macOS/Linux → Try sshpass, fall back to Python helper 6. **Handle Errors**: If authentication fails, inform user and suggest alternatives: - Set up SSH keys - Install sshpass (macOS/Linux) - Use the Python helper script 7. **Security First**: - Never echo passwords in command output - Use `-o StrictHostKeyChecking=accept-new` for first connections - Recommend SSH keys over passwords 8. **Custom Port**: Add `-p [port]` to SSH/SFTP or `-P [port]` to SCP commands. --- ## Configuration Options | Option | SSH Flag | Description | | ------------- | ------------------------- | ------------------------- | | Custom port | `-p [port]` | Non-standard SSH port | | Timeout | `-o ConnectTimeout=[sec]` | Connection timeout | | Compression | `-C` | Enable compression | | Verbose | `-v` or `-vv` | Debug output | | Identity file | `-i [path]` | Specific SSH key | | Batch mode | `-o BatchMode=yes` | Fail instead of prompting | --- ## Troubleshooting | Issue | Platform | Solution | | ---------------------------- | -------- | ------------------------------------------------------------- | | `sshpass: command not found` | Windows | Use Python helper or set up SSH keys | | `sshpass: command not found` | macOS | `brew install hudochenkov/sshpass/sshpass` | | `sshpass: command not found` | Linux | `apt install sshpass` or `yum install sshpass` | | Permission denied | All | Check username/password/key, verify server allows auth method | | Connection refused | All | Verify host/port, check if SSH service running | | Host key changed | All | Server reinstalled - verify and update known_hosts | | Connection timeout | All | Check network, firewall rules | | `paramiko` not found | All | `pip install paramiko` for Python helper | --- ## When to Use This Skill - "SSH into my server at 192.168.1.100" - "Connect to my remote machine" - "Run a command on the server" - "Upload/download files to/from the server" - "Set up port forwarding" - "Create an SSH tunnel" - "Check server status" - "Restart a service on the server" - "View server logs" ## When NOT to Use This Skill - Local file operations (no SSH needed) - Cloud provider API operations (use their CLIs) - Database client connections (use database tools) --- ## Examples ### Example 1: First Connection with Keys **User:** "SSH into my server and check disk space" **Claude:** 1. Prompts for connection details 2. User provides: Host: 10.0.0.5, Username: admin, Auth: SSH Key 3. Executes: `ssh -o StrictHostKeyChecking=accept-new admin@10.0.0.5 "df -h"` 4. Returns disk space information ### Example 2: Windows with Password **User:** "Connect to 192.168.1.100 with password and restart nginx" **Claude:** 1. Detects Windows platform 2. Uses Python helper: `python scripts/ssh_helper.py --host 192.168.1.100 --user admin --password "secret" --command "sudo systemctl restart nginx"` 3. Returns result ### Example 3: macOS/Linux with Password **User:** "SSH to my server with password" **Claude:** 1. Detects macOS/Linux 2. Checks for sshpass: `which sshpass` 3. If available: `sshpass -p 'password' ssh admin@host "command"` 4. If not: Uses Python helper or suggests installing sshpass --- ## Python Helper Script The `scripts/ssh_helper.py` provides cross-platform SSH with password authentication. **Install dependencies:** ```bash pip install paramiko ``` **Usage:** ```bash # Run command python scripts/ssh_helper.py --host 192.168.1.100 --user admin --password "secret" --command "df -h" # Upload file python scripts/ssh_helper.py --host 192.168.1.100 --user admin --password "secret" --upload ./local.txt --remote-path /tmp/remote.txt # Download file python scripts/ssh_helper.py --host 192.168.1.100 --user admin --password "secret" --download /var/log/syslog --local-path ./syslog.txt ``` See `scripts/ssh_helper.py` for full implementation. --- ## Version History - v2.0.0 (2025-12-17): Cross-platform rewrite - Windows, macOS, Linux support - v1.0.0 (2025-12-17): Initial release