The Linux ssh Command: My Portal to Remote Servers
The Linux ssh Command: My Portal to Remote Servers
I remember the first time I needed to restart a server in a different city. I called our data center, waited for 2 hours, paid $200 for after-hours support—all because I didn't know how to use ssh properly.
That $200 taught me the most valuable lesson: ssh is your remote portal. Master it.
First ssh Connection
My boss gave me an IP and login:
ssh user@192.168.1.10
It asked for password. Worked! But password authentication is slow and insecure.
Key-based authentication
Generate a key pair:
ssh-keygen -t ed25519
Copy public key to server:
ssh-copy-id user@192.168.1.10
Now password-less login works.
Custom port
ssh defaults to port 22. Change with -p:
ssh -p 2222 user@192.168.1.10
Understanding ssh Options
Connection timeout
ssh -o ConnectTimeout=10 user@server
Keep-alive
ssh -o ServerAliveInterval=60 user@server
```
Prevents disconnection on idle.
### Jump host (bastion)
```bash
ssh -J bastion.example.com internal.server
```
Proxy through bastion without config.
### Execute remote command
```bash
ssh user@server "uptime"
```
Run command, return output.
### Copy file with scp
```bash
scp file.txt user@server:/path/
```
### Copy file with sftp
```bash
sftp user@server
```
Interactive file transfer.
---
## ssh Mistakes I Made
### 1. Using default ports
Our production servers used custom ports:
```bash
ssh user@production-server # Failed - wrong port!
ssh -p 2222 user@production-server # Success
```
### 2. Forgetting to forward keys
ssh-agent wasn't running:
```bash
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
```
### 3. Jump host confusion
Couldn't reach internal servers:
```bash
ssh user@internal.server # No route!
ssh -J bastion user@internal.server # Works via jump host
```
### 4. Permission denied (keys)
Key file too open:
```bash
chmod 600 ~/.ssh/id_rsa
```
---
## ssh Commands That Work
### Quick remote command
```bash
ssh user@server "systemctl restart nginx"
```
Service restart.
### Remote with sudo
```bash
ssh -t user@server "sudo systemctl restart apache"
```
-t allocates pseudo-terminal.
### Tunnel for local port
```bash
ssh -L 8080:localhost:80 user@server
```
Forward local 8080 to server's port 80.
### Reverse tunnel
```bash
ssh -R 8080:localhost:80 user@home
```
Remotely forward port.
### SOCKS proxy
```bash
ssh -D 1080 user@server
```
Local SOCKS proxy for browsing.
### X11 forwarding
```bash
ssh -X user@server
```
Run remote GUI apps locally.
---
## The ssh Command Builder: Visual Remote Access
Building ssh commands with tunnels and options is tricky—the **[ssh Command Builder](/linux-tools/ssh-command-builder)** helps:
- **Visual interface** for common options
- **Quick presets** for tunnels, proxies
- **Copy with proper syntax** and escaping
---
## ssh Config for Lazy People
Instead of remembering flags, use ~/.ssh/config:
```bash
Host prod
HostName production.example.com
User admin
Port 2222
IdentityFile ~/.ssh/prod_rsa
Host internal
HostName 192.168.1.10
ProxyJump bastion.example.com
```
Now just `ssh prod` or `ssh internal`.
---
## Quick Reference
| Command | What It Does |
|---------|-------------|
| `ssh user@host` | Connect |
| `ssh -p port user@host` | Custom port |
| `ssh -J jump user@host` | Jump host |
| `ssh -L local:remote` | Local tunnel |
| `ssh -R remote:local` | Reverse tunnel |
| `ssh -D port` | SOCKS proxy |
| `ssh -X` | X11 forward |
| `scp file user@host:path` | Copy file |
---
## Security Best Practices
1. **Use key-based auth** — passwords can be brute-forced.
2. **Disable root login** in /etc/ssh/sshd_config:
```bash
PermitRootLogin no
```
3. **Use custom port** — reduce automated attacks.
4. **Set idle timeout** — auto-disconnect inactive sessions.
5. **Use jump hosts** — don't expose internal servers.
---
## Lessons Learned
1. **Key authentication is essential** — faster and more secure.
2. **Jump hosts simplify** — one bastion to secure.
3. **Tunnels are powerful** — local services through remote.
4. **ssh config is your friend** — remember commands once.
5. **Use -v for debugging** — see exactly what's failing.
---
## Conclusion: ssh Is Your Portal
ssh is your window to remote servers. Master it, and you'll save time and money.
The **[ssh Command Builder](/linux-tools/ssh-command-builder)** makes building commands easy—click, connect.
---
## Further Reading
- [OpenSSH Manual](https://man.openbsd.org/ssh)
- [ssh Command Builder](/linux-tools/ssh-command-builder)
- [Linux Tools Library](/linux-tools)