Control Claude Code Remotely with Zero-Friction SSH Tunnels

5 min read

Before:

# On local machine
ssh username@192.168.1.58
# Enter password...
# In SSH session
claude
# Open new terminal, manually set up port forwarding
ssh -L 8080:localhost:8080 username@192.168.1.58
# Enter password again...
# Finally access Claude Code at localhost:8080

After:

# Single command, no passwords, instant access
claude-mac
# Claude Code is running and accessible at localhost:8082

One command. No passwords. No manual port forwarding. Just instant access to Claude Code running on your remote machine. This guide shows you how to achieve this level of convenience.

Working with Claude Code across multiple machines shouldn’t require a complex dance of SSH commands, password prompts, and manual port forwarding. Whether you’re controlling Claude Code on a powerful desktop from your laptop or accessing it on a macOS machine from Linux, the setup should be invisible. Let’s build a solution that makes remote Claude Code access as simple as running a local command.

The Remote Development Challenge

If you’ve tried running Claude Code on a remote machine, you’ve likely encountered these friction points:

  • Multiple password prompts for each connection
  • Manual port forwarding setup every time
  • SSH agent warnings and authentication noise
  • Forgetting which ports are forwarded where
  • Terminal sessions tied up with SSH connections

Each of these interruptions breaks your flow. When you need to quickly access Claude Code on another machine, the last thing you want is a multi-step authentication process. The solution? A properly configured SSH tunnel with passwordless authentication and smart aliases.

Prerequisites

Before starting this setup, ensure you have:

  1. Claude Code installed on both machines (local and remote)
  2. SSH server enabled on the remote machine:
    • macOS: System Settings → Sharing → Remote Login (turn ON)
    • Linux: Usually enabled by default, verify with sudo systemctl status sshd
  3. Both machines on the same network (or remote machine accessible via public IP)
  4. Basic terminal knowledge and access to edit .bashrc or .zshrc

That’s it - with these basics in place, you’re ready to build your zero-friction setup.

Understanding the Components

Before diving into configuration, let’s understand what makes seamless remote access work:

  1. SSH Key Authentication: Eliminates password prompts
  2. Port Forwarding: Makes remote services accessible locally
  3. Shell Aliases: Reduces complex commands to simple keywords
  4. SSH Agent: Manages key authentication seamlessly
  5. Silent Mode: Removes unnecessary output and warnings

Building Your Remote Access Setup

Let’s build a configuration that gives you instant, passwordless access to Claude Code on remote machines.

Step 1: Locate Your Remote Machine

First, identify your remote machine on the network. If you don’t know the IP address:

# Scan your local network for active hosts
for ip in 192.168.1.{1..254}; do 
  (ping -c 1 -W 1 $ip >/dev/null 2>&1 && echo "Active: $ip") & 
done; wait

# Check which hosts have SSH enabled
for ip in 192.168.1.58 192.168.1.71; do 
  echo -n "Checking $ip: "
  nc -zv -w2 $ip 22 2>&1 | grep -E "(succeeded|refused|timed out)"
done

Step 2: Set Up Passwordless Authentication

SSH key authentication eliminates the need for passwords. First, check if you have an SSH key:

ls -la ~/.ssh/id_* | grep -v ".pub"

If you don’t have a key, create one:

ssh-keygen -t ed25519 -C "your-email@example.com"

Now copy your public key to the remote machine:

# Display your public key
cat ~/.ssh/id_ed25519.pub

# SSH into the remote machine (one last time with password)
ssh username@remote-ip

# On the remote machine, add your key
mkdir -p ~/.ssh
echo "your-public-key-content" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Step 3: Configure SSH Agent

To avoid entering your SSH key passphrase repeatedly, configure the SSH agent in your ~/.bashrc:

# SSH agent configuration
eval "$(ssh-agent -s)" > /dev/null
if ! pgrep -u "$USER" ssh-agent > /dev/null; then
    ssh-agent -t 24h > "$XDG_RUNTIME_DIR/ssh-agent.env"
fi
if [[ ! "$SSH_AUTH_SOCK" ]]; then
    source "$XDG_RUNTIME_DIR/ssh-agent.env" >/dev/null
fi

# Auto-load SSH key
ssh-add ~/.ssh/id_ed25519 2>/dev/null

Step 4: Create Smart Aliases

Now for the magic - aliases that make remote access effortless. Add to your ~/.bashrc:

# SSH tunnel to remote machine for Claude Code
alias claude-remote='ssh -q -o LogLevel=quiet -L 8082:localhost:8080 username@remote-ip -t "claude --dangerously-skip-permissions; bash"'

This alias:

  • Creates an SSH tunnel forwarding local port 8082 to remote port 8080
  • Runs Claude Code automatically on connection
  • Drops you into a shell when Claude exits
  • Suppresses all unnecessary output

Step 5: Eliminate SSH Noise

To remove login messages and warnings, create a .hushlogin file on the remote machine:

# On the remote machine
touch ~/.hushlogin

For the SSH agent messages, modify your remote machine’s shell configuration to redirect output:

# In remote machine's ~/.bashrc
eval "$(ssh-agent -s)" >/dev/null 2>&1
ssh-add ~/.ssh/id_ed25519 >/dev/null 2>&1

Handling Common Port Conflicts

If port 8080 or 8082 is already in use:

# Check what's using a port
lsof -i :8082

# Use a different port in your alias
alias claude-remote='ssh -q -L 8083:localhost:8080 username@remote-ip -t "claude; bash"'

Advanced Configuration

Multiple Remote Machines

Create aliases for each machine you regularly access:

# Different machines with memorable names
alias claude-desktop='ssh -q -L 8082:localhost:8080 marcus@192.168.1.58 -t "claude; bash"'
alias claude-server='ssh -q -L 8083:localhost:8080 marcus@192.168.1.100 -t "claude; bash"'
alias claude-laptop='ssh -q -L 8084:localhost:8080 marcus@192.168.1.150 -t "claude; bash"'

Quick Connection Status

Add a function to check your Claude Code tunnels:

claude-status() {
    echo "Active Claude Code tunnels:"
    ps aux | grep -E "ssh.*-L.*:localhost:8080" | grep -v grep | \
    awk '{for(i=1;i<=NF;i++) if($i ~ /-L/) print "  Port", $(i+1)}'
}

Automatic Reconnection

For unstable connections, use autossh:

# Install autossh
brew install autossh  # macOS
sudo apt install autossh  # Linux

# Create persistent tunnel
alias claude-persistent='autossh -M 0 -q -L 8082:localhost:8080 username@remote-ip -t "claude; bash"'

Troubleshooting Guide

”Permission denied” After Setup

If you still get password prompts:

  1. Verify your public key is in the remote’s authorized_keys:

    ssh username@remote-ip "cat ~/.ssh/authorized_keys"
    
  2. Check SSH permissions on the remote machine:

    ssh username@remote-ip "ls -la ~/.ssh/"
    # Should show: drwx------ for .ssh directory
    # Should show: -rw------- for authorized_keys
    

Port Already in Use

If you get “bind: Address already in use”:

# Find and kill the process using the port
lsof -ti:8082 | xargs kill -9

# Or use a different port
alias claude-alt='ssh -q -L 8085:localhost:8080 username@remote-ip -t "claude; bash"'

SSH Key Passphrase Prompts

If you’re tired of entering your key passphrase:

# Remove passphrase (less secure but more convenient)
ssh-keygen -p -f ~/.ssh/id_ed25519
# Enter old passphrase, then press Enter twice for no passphrase

Security Considerations

While this setup prioritizes convenience, consider these security aspects:

  1. Passphrase-less Keys: Only use on trusted machines
  2. Port Exposure: The forwarded ports are only accessible from localhost
  3. SSH Agent: Set reasonable timeouts for key storage
  4. Network Security: Use this setup only on trusted networks

For production environments, consider additional security measures like:

  • Jump hosts (bastion servers)
  • VPN connections
  • Certificate-based authentication
  • Port knocking

The Productivity Impact

After implementing this setup, remote Claude Code access becomes friction-free:

  1. Instant Access: One command connects and starts Claude Code
  2. No Authentication Delays: Passwordless operation throughout
  3. Clean Terminal Output: No visual noise or warnings
  4. Persistent Access: Tunnels remain active as long as needed
  5. Multi-Machine Workflow: Easily switch between different Claude Code instances

The time saved is substantial, but the real benefit is maintaining flow state. No more context switching for authentication, no more remembering complex SSH commands.

Taking It Further

This setup is just the beginning. Consider exploring:

  • tmux Integration: Keep Claude Code sessions persistent across disconnections
  • Reverse Tunnels: Access Claude Code running on machines behind NAT
  • SSH Config Files: Move complex options to ~/.ssh/config for cleaner aliases
  • Multi-hop Tunnels: Access Claude Code through jump hosts
  • Monitoring Scripts: Track and manage multiple Claude Code instances

Your development environment should adapt to your workflow, not the other way around. With this SSH tunnel setup, remote Claude Code access becomes as natural as local development. Set it up once, and enjoy seamless AI-powered coding across all your machines.