Many sysadmins face this workflow dilemma: we maintain strict security by disabling direct root login (PermitRootLogin no), yet need to frequently elevate privileges after initial authentication. The standard ssh -t hostname su - approach works but becomes tedious for daily operations.
Here are three technical approaches to embed privilege escalation directly in your SSH client configuration:
Option 1: Host-Specific Command Execution
Host myserver-root
HostName actual.server.com
User your_username
IdentityFile ~/.ssh/id_ed25519
RequestTTY force
RemoteCommand sudo -i || su -
Option 2: ProxyCommand Implementation
Host myserver-root
ProxyCommand ssh -W %h:%p myserver
RequestTTY yes
RemoteCommand su -
Option 3: Match Directive (SSH 7.3+)
Match host myserver exec "pgrep -f 'ssh myserver-root'"
RequestTTY yes
RemoteCommand su -
- RequestTTY: Critical for interactive sessions (equivalent to
-tflag) - RemoteCommand: Executes immediately after connection
- Fallback Logic: Consider adding
|| sudo -ifor sudo environments
While convenient, this approach has implications:
- Command appears in process listing on both client and server
- Consider using
sudowith timestamp instead ofsu - Always verify the integrity of your SSH config file permissions (600)
For a production jump host setup:
Host prod-root
HostName jumphost.prod.example.com
User deploy
IdentityFile ~/.ssh/prod_deploy_key
RequestTTY yes
RemoteCommand sudo -u root /bin/bash -l
- Test with
ssh -vvv myserver-rootfor verbosity - Ensure
/etc/sudoersallows your user to escalate - Modern SSH versions (8.0+) may require
PermitUserRC yesserver-side
When managing multiple servers, we often need to switch to root using su - after SSH login. While ssh myserver -t su - works from command line, we want this behavior configurable in ~/.ssh/config for convenience.
SSH config supports the RemoteCommand option (introduced in OpenSSH 7.6+) which serves our purpose:
Host myserver-root
HostName actual.server.com
User yourusername
Port 22
IdentityFile ~/.ssh/id_rsa
RequestTTY yes
RemoteCommand su -
For versions before 7.6, we can use ProxyCommand trick:
Host myserver-root
HostName actual.server.com
User yourusername
ProxyCommand ssh -q -t %h "su -"
While this approach is convenient, consider these security implications:
- Never store root passwords in scripts
- Use
sudowhen possible instead of full root access - Consider SSH certificates instead of password authentication
Verify your setup works properly:
ssh -v myserver-root
The -v flag helps debug any connection issues.
For managing multiple servers with similar requirements:
Host *-root
User defaultuser
RequestTTY yes
RemoteCommand su -
Host webserver-root
HostName web1.example.com
Host dbserver-root
HostName db1.example.com