Arshad Mehmood

Search the blog

    Today I Learned

    Executing remote commands with SSH

    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"