Skill v1.0.1
currentAutomated scan100/1003 files
version: "1.0.1" 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:
# Windows (PowerShell)Get-ChildItem ~/.ssh/id_*.pub# macOS/Linuxls -la ~/.ssh/id_*.pub
If keys exist, use them:
# All platforms - key auth is automatic if keys are set upssh -o StrictHostKeyChecking=accept-new [username]@[host] "[command]"
If no keys exist, help user create them:
# 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_keyscat ~/.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)
# Uses paramiko library for cross-platform SSHpython scripts/ssh_helper.py --host [host] --user [username] --password [password] --command "[command]"
Option B: Interactive SSH (user types password)
# This will prompt for password interactivelyssh -o StrictHostKeyChecking=accept-new [username]@[host] "[command]"
Option C: Use PuTTY's plink (if installed)
# 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)
# Check if sshpass is installedwhich sshpass# If installed, use itsshpass -p '[password]' ssh -o StrictHostKeyChecking=accept-new [username]@[host] "[command]"
Option B: Use the Python SSH helper
python3 scripts/ssh_helper.py --host [host] --user [username] --password [password] --command "[command]"
Option C: Install sshpass
# Ubuntu/Debiansudo 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- Password4. **Port** (optional): Default is 22Example 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):
ssh -o StrictHostKeyChecking=accept-new -o ConnectTimeout=30 [username]@[host] "[command]"
With Password (Platform-Specific):
# macOS/Linux with sshpasssshpass -p '[password]' ssh -o StrictHostKeyChecking=accept-new [username]@[host] "[command]"# All platforms with Python helperpython scripts/ssh_helper.py --host [host] --user [username] --password "[password]" --command "[command]"
File Transfer (SCP)
Upload file:
# 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:
# 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):
# 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 3307ssh -L 3307:localhost:3306 [username]@[host]
Remote Port Forwarding (-R):
# Expose local service to remote (all platforms with keys)ssh -R [remote_port]:localhost:[local_port] [username]@[host]
Dynamic Port Forwarding (SOCKS Proxy):
ssh -D [local_port] [username]@[host]
Server Administration Tasks
System Information
# Check system infossh user@host "uname -a && cat /etc/os-release"# Check disk spacessh user@host "df -h"# Check memory usagessh user@host "free -h"# Check running processesssh user@host "ps aux --sort=-%mem | head -20"# Check system loadssh user@host "uptime && top -bn1 | head -15"
Service Management (systemd)
# Check service statusssh user@host "systemctl status [service_name]"# Start/stop/restart servicessh user@host "sudo systemctl start|stop|restart [service_name]"# View service logsssh user@host "journalctl -u [service_name] -n 50 --no-pager"
Log Analysis
# View recent system logsssh user@host "sudo tail -100 /var/log/syslog"# Search logs for errorsssh user@host "sudo grep -i error /var/log/syslog | tail -50"# View auth logsssh user@host "sudo tail -50 /var/log/auth.log"
Network Diagnostics
# Check listening portsssh user@host "ss -tulpn"# Check network connectionsssh user@host "netstat -an | grep ESTABLISHED"# Test connectivityssh user@host "ping -c 3 [target] && traceroute [target]"
Instructions for Claude
- Detect Platform First: Check if running on Windows, macOS, or Linux to choose the right SSH approach.
- Prefer SSH Keys: Always check for and recommend SSH key authentication first.
- First SSH Request: Prompt for credentials using the format above. Wait for response before proceeding.
- Store Credentials: Remember credentials for the entire session. DO NOT ask again.
- 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
- Handle Errors: If authentication fails, inform user and suggest alternatives:
- Set up SSH keys
- Install sshpass (macOS/Linux)
- Use the Python helper script
- Security First:
- Never echo passwords in command output
- Use
-o StrictHostKeyChecking=accept-newfor first connections - Recommend SSH keys over passwords
- 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:
- Prompts for connection details
- User provides: Host: 10.0.0.5, Username: admin, Auth: SSH Key
- Executes:
ssh -o StrictHostKeyChecking=accept-new admin@10.0.0.5 "df -h" - Returns disk space information
Example 2: Windows with Password
User: "Connect to 192.168.1.100 with password and restart nginx"
Claude:
- Detects Windows platform
- Uses Python helper:
python scripts/ssh_helper.py --host 192.168.1.100 --user admin --password "secret" --command "sudo systemctl restart nginx" - Returns result
Example 3: macOS/Linux with Password
User: "SSH to my server with password"
Claude:
- Detects macOS/Linux
- Checks for sshpass:
which sshpass - If available:
sshpass -p 'password' ssh admin@host "command" - 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:
pip install paramiko
Usage:
# Run commandpython scripts/ssh_helper.py --host 192.168.1.100 --user admin --password "secret" --command "df -h"# Upload filepython scripts/ssh_helper.py --host 192.168.1.100 --user admin --password "secret" --upload ./local.txt --remote-path /tmp/remote.txt# Download filepython 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