Executing remote commands with SSH
Executing remote commands with SSH
Run commands on a remote server without opening an interactive shell. Syntax: ssh [options] user@hostname "command"
Basic syntax
ssh user@hostname "command"
ssh user@hostname command # Command is optional
Return to local shell immediately after execution.
Simple examples
ssh user@hostname "ls -la /tmp"
ssh user@hostname "pwd"
ssh user@hostname "whoami"
Multiple commands
Use semicolons or && (depends on success):
ssh user@hostname "cd /tmp && ls -la"
ssh user@hostname "uptime; df -h"
Or with newlines in a multi-line string:
ssh user@hostname << 'EOF'
cd /tmp
ls -la
whoami
EOF
Capture output locally
ssh user@hostname "ls -la /tmp" > local-file.txt
ssh user@hostname "cat /var/log/syslog" | grep "error"
Useful patterns
Check if service is running:
ssh user@hostname "systemctl is-active nginx"
Run with custom port and key:
ssh -i ~/.ssh/id_ed25519 -p 2222 user@hostname "df -h"
Execute script on remote:
ssh user@hostname < local-script.sh
Run with sudo (prompts for password):
ssh user@hostname "sudo systemctl restart nginx"
Background task (agent/daemon):
ssh user@hostname "nohup long-running-command > output.log 2>&1 &"
Important notes
- Command runs non-interactively — no interactive prompts
- No shell history recorded on remote
- Input/output fully controlled by local shell
- Permissions depend on the ssh user
- Environment variables may differ from interactive shell
SSH key authentication
# With specific key
ssh -i ~/.ssh/custom_key user@hostname "ls"
# Uses default key (~/.ssh/id_rsa or id_ed25519) if `-i` omitted
ssh user@hostname "ls"
Timeout and error handling
# Timeout after 5 seconds
ssh -o ConnectTimeout=5 user@hostname "sleep 10"
# Fail if command exits with error (useful in scripts)
ssh user@hostname "false" && echo "Success" || echo "Failed"
Leave a comment