Remote Login must be ON
The #1 cause of "connection refused" errors. On MacTruc: System Settings → General → Sharing → Remote Login. If it's off, SSH won't even answer. If it's set to "Only these users," make sure trucbot1 is in the list.
Permissions on ~/.ssh matter
SSH silently ignores config and key files with loose permissions. ~/.ssh must be 700, ~/.ssh/config and private keys must be 600. If ssh-copy-id or ssh fails inexplicably, run ls -la ~/.ssh and check.
Host fingerprint changes after a rebuild
If MacTruc gets reinstalled or the SSH host keys change, you'll see a scary "REMOTE HOST IDENTIFICATION HAS CHANGED" warning. Clear the stale entry with ssh-keygen -R 192.168.1.51 and reconnect to accept the new fingerprint.
Stale entries from a previous IP
When MacTruc moved from 192.168.1.29 to 192.168.1.51, the old entry stayed in known_hosts. Harmless, but worth cleaning up: ssh-keygen -R 192.168.1.29.
Dashboard says "address already in use"
If port 18789 is already bound on BigMac (e.g., from a stuck SSH session), the LocalForward will fail silently and the dashboard won't load. Kill the old session: lsof -i :18789 to find the PID, kill -9 <pid> to clear it. Then reconnect.
Multi-bot port collisions
When adding TrucBot2, both bots' gateways default to port 18789. Two options: configure each bot's gateway port differently on MacTruc, or map a different BigMac-side port in the LocalForward. Example for TrucBot2: LocalForward 18790 localhost:18790.
Verbose mode for debugging
When SSH misbehaves and you don't know why, add -v (or -vv, -vvv for more). ssh -v TrucBot1 shows every step of the connection — key selection, host verification, channel setup. The "Offering public key" line tells you whether your key is actually being tried.
Tunnel survives the session, not BigMac sleep
The LocalForward stays up as long as the SSH session is alive. If BigMac sleeps or the network blips, the keepalive settings (ServerAliveInterval 60 / CountMax 3) will clean up the dead session within ~3 minutes. Just re-run ssh TrucBot1 when you're back.
Profile flag is required on MacTruc
Once SSH'd in, every openclaw command needs --profile trucbot1 or it'll talk to the default profile (empty/unused). Example: openclaw --profile trucbot1 status. Consider setting an alias in ~/.zshrc on MacTruc: alias oc='openclaw --profile trucbot1'.