Shell Networking Skill
Master networking operations from the command line
Learning Objectives
After completing this skill, you will be able to:
- [ ] Make HTTP requests with curl
- [ ] Use SSH for remote operations
- [ ] Check ports and connections
- [ ] Debug network issues
- [ ] Transfer files securely
Prerequisites
- Bash basics
- Basic networking concepts
- Understanding of HTTP
Core Concepts
1. Curl Essentials
# Basic requests
curl https://api.example.com # GET
curl -X POST https://api.example.com # POST
curl -o file.zip https://example.com/f # Download
# Headers and data
curl -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"key":"value"}' \
https://api.example.com
# Common options
curl -v url # Verbose
curl -s url # Silent
curl -L url # Follow redirects
curl -k url # Skip SSL verify
curl -w "%{http_code}" -o /dev/null -s url
2. SSH Operations
# Connect
ssh user@host
ssh -p 2222 user@host
ssh -i ~/.ssh/key.pem user@host
# File transfer
scp file.txt user@host:/path/
scp -r dir/ user@host:/path/
scp user@host:/path/file.txt ./
# Tunnels
ssh -L 8080:localhost:80 user@host
ssh -D 1080 user@host # SOCKS proxy
3. Port Checking
# List listening ports
ss -tlnp # TCP
ss -ulnp # UDP
netstat -tlnp # Alternative
# Check specific port
nc -zv host 80 # Port check
lsof -i :8080 # What's using port
# Scan ports
nmap -sT host # TCP scan
nmap -p 80,443 host # Specific ports
4. DNS Operations
# DNS lookup
dig example.com
dig +short example.com # IP only
dig example.com MX # MX records
dig @8.8.8.8 example.com # Specific DNS
# Alternatives
host example.com
nslookup example.com
Common Patterns
API Request with Error Handling
response=$(curl -s -w "\n%{http_code}" \
-H "Authorization: Bearer $TOKEN" \
"https://api.example.com/data")
http_code=$(echo "$response" | tail -1)
body=$(echo "$response" | sed '$d')
if [[ "$http_code" != "200" ]]; then
echo "Error: HTTP $http_code"
exit 1
fi
Wait for Port
wait_for_port() {
local host="$1" port="$2" timeout="${3:-30}"
for ((i=0; i<timeout; i++)); do
if nc -z "$host" "$port" 2>/dev/null; then
return 0
fi
sleep 1
done
return 1
}
SSH Config
# ~/.ssh/config
Host myserver
HostName 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/mykey
Anti-Patterns
| Don't | Do | Why |
|-------|-----|-----|
| curl \| bash | Download, inspect, run | Security risk |
| Store passwords | Use SSH keys | More secure |
| Skip SSL verify | Fix certificates | Security |
Practice Exercises
- API Client: Script to interact with REST API
- Health Checker: Check if services are up
- SSH Automation: Run commands on multiple hosts
- Port Scanner: Simple port availability checker
Troubleshooting
Common Errors
| Error | Cause | Fix |
|-------|-------|-----|
| Connection refused | Service down | Check if running |
| Connection timed out | Firewall/routing | Check network |
| Name not resolved | DNS issue | Check DNS |
| Permission denied (publickey) | SSH key | Check authorized_keys |
Debug Techniques
# Test connectivity
ping -c 2 host
traceroute host
# Debug curl
curl -v https://example.com
# Debug SSH
ssh -vvv user@host
Security Guidelines
- Use SSH keys instead of passwords
- Verify SSL certificates in production
- Don't store secrets in scripts
- Use environment variables for credentials
- Audit SSH access regularly