When working with servers requiring privilege escalation via su, manually entering passwords breaks automation workflows. While SSH keys solve primary authentication, the secondary su password prompt remains problematic.
The scenario presents specific requirements:
1. Mandatory two-step authentication (user → su)
2. Passphrase-protected SSH key usage
3. Need for non-interactive execution
Combine sshpass with Expect scripting:
Host server
HostName hostname.server.com
User not-root
Port 1234
RemoteCommand expect -c 'spawn su; expect "Password:"; send "your_root_password\\r"; interact'
For production environments, consider these alternatives:
- SSH certificate-based authentication
- Configure sudo without password for specific commands
- Use SSH forced commands with limited privileges
Create a dedicated expect script (su_wrapper.exp):
#!/usr/bin/expect
set timeout 20
spawn su
expect "Password:"
send "actual_password\\r"
interact
Then modify your SSH config:
Host server
HostName hostname.server.com
User not-root
Port 1234
RemoteCommand /path/to/su_wrapper.exp
- Test expect scripts directly before SSH integration
- Verify file permissions on expect scripts (chmod 700)
- Check system logs for authentication failures
When working with servers that require privilege escalation, manually typing passwords breaks automation workflows. The standard .ssh/config approach fails because:
- SSH config doesn't natively support password passing (for security reasons)
RemoteCommand sutriggers an interactive password prompt- Key-based auth alone won't solve the post-login
surequirement
Here are three battle-tested methods I've used in production environments:
Method 1: SSH + Expect Script
#!/usr/bin/expect -f
set timeout 20
spawn ssh -F /path/to/config server
expect "password:"
send "your_root_password\r"
interact
Method 2: SSH Config with ProxyCommand
Host server
HostName hostname.server.com
User not-root
Port 1234
ProxyCommand bash -c 'sshpass -p "your_password" ssh -tt %h %n su -c "bash -i"'
Method 3: Combined Key and Password Solution
Host server
HostName hostname.server.com
User not-root
IdentityFile ~/.ssh/special_key
RemoteCommand echo "your_password" | su -c "cd $HOME; exec \$SHELL -l"
RequestTTY force
While these methods work, consider these precautions:
- Set strict file permissions (
chmod 600 ~/.ssh/config) - Use SSH certificates instead of raw passwords when possible
- Implement session timeouts for sensitive operations
- Consider
sudowith NOPASSWD for specific commands
For a cleaner solution without exposing passwords in config files:
function ssh_server() {
ssh -t server "echo 'YOUR_PASSWORD' | su -c 'your_command'"
}