When dealing with multi-server environments, you often need to access files on machine C through an intermediary jumphost B. While SSH tunneling works for command-line access, mounting remote filesystems via SSHFS requires special handling since SSHFS doesn't natively support proxy jumps.
We'll implement this using SSH's built-in ProxyJump feature combined with FUSE mounting. Here are the three methods to achieve this:
First, configure your SSH client to handle the jump:
# ~/.ssh/config Host JumpHost HostName B_host User your_username IdentityFile ~/.ssh/id_rsa Host TargetHost HostName C_host User your_username IdentityFile ~/.ssh/id_rsa ProxyJump JumpHost
Now mount using SSHFS:
sshfs TargetHost:/remote/path /local/mount/point -o follow_symlinks
For one-time mounting without config changes:
sshfs -o ssh_command="ssh -J B_host" C_host:/path /local/mount
Or the older ProxyCommand syntax:
sshfs -o ssh_command='ssh -A -t B_host ssh -A -t C_host' :/path /local/mount
For better performance on frequent access:
# Establish control path first ssh -Nf -M -S ~/.ssh/control-%C B_host ssh -Nf -M -S ~/.ssh/control-%C -o 'ProxyJump B_host' C_host # Then mount with control path sshfs -o ssh_command="ssh -S ~/.ssh/control-%C" C_host:/path /local/mount
Permission errors: Ensure you have fuse and sshfs properly installed on Host A, and appropriate permissions on Host C's filesystem.
Connection timeouts: Add these options to your mount command:
-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
Debugging: Use verbose mode to identify connection issues:
sshfs -o ssh_command="ssh -J B_host -v" C_host:/path /local/mount -o debug
For better performance across multiple hops:
- Use compression:
-o compression=yes
- Increase cache timeout:
-o cache_timeout=120
- Disable attribute caching if not needed:
-o noforget
For some use cases, creating a local port forward might be simpler:
ssh -L 2222:C_host:22 B_host sshfs -p 2222 localhost:/path /local/mount
Remember to unmount when done:
fusermount -u /local/mount
When working with nested SSH connections (A→B→C), mounting filesystems from machine C directly to A isn't as straightforward as a direct SSHFS connection. The standard sshfs
command doesn't natively support jump hosts, but we have several reliable workarounds.
The most robust solution uses SSH's ProxyCommand feature. First, add this to your ~/.ssh/config
:
Host JumpHost HostName B_host User your_username Host TargetHost HostName C_host User remote_username ProxyCommand ssh -W %h:%p JumpHost
Then mount with:
sshfs TargetHost:/remote/path /local/mount/point -o follow_symlinks
For quick one-time mounts without config changes:
sshfs -o ssh_command="ssh -t B_host ssh" C_host:/path /local/mount
When facing firewall restrictions:
# On machine A: ssh -L 2222:C_host:22 B_host # In another terminal: sshfs -p 2222 localhost:/remote/path /local/mount
If you encounter connection issues:
# Add verbose output: sshfs TargetHost:/path /mount -o sshfs_debug,debug # Check permissions: ls -la /mount
For better throughput over multiple hops:
sshfs TargetHost:/path /mount -o compression=no,cache_timeout=3600
Always use:
-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
And consider SSH key-based authentication with agent forwarding.