Wednesday, 20th February 2019
Editing remote files locally with help from vim scp and OpenSSH ProxyJump
Have you ever found yourself in a situation where you need to edit files on a protected_server that is only accessible via ssh through a whitelisted_server with a static IP?
Not an ideal workflow by any means, but allocating a pseudo-terminal with ssh -t to proxy through the whitelisted_server and edit files on the protected_server usually does the trick:
ssh -t me@whitelisted_server me@protected_server
Authenticate, fire up vim and you’re ready to edit!
However, doing this over a slow internet connection may introduce significant network latency, and editing over ssh through two servers will quickly become soul-crushingly, agonisingly slow.
You start to think—wouldn’t it be great if I could just edit these files locally?
Most modern vim installations include netrw file browser, which comes with a handy facility to edit and sync remote files locally, via scp or sftp. All edits are performed on a local copy of the file (usually saved somewhere in /tmp), and vim transparently handles file sync to and from the remote server automatically. Neat!
vim scp://me@whitelisted_server//path/to/my/file.txt
However, there is an issue with our proxied ssh -t setup—we need to specify protected_server as the remote scp host, but it’s only accessible through the whitelisted_server.
Fortunately, this is easy with a little ssh host configuration and ProxyJump. Open up ~/.ssh/config and create a config for each host; e.g:
# ssh/config
Host whitelisted_server
HostName 1.1.1.1
IdentityFile ~/.ssh/whitelisted_server.pem
User me
Host protected_server
ProxyJump whitelisted_server # <-- specify your proxy
HostName 1.1.1.2
IdentityFile ~/.ssh/protected_server.pem
User me
Now you can now specify the protected_server host alias wherever you use ssh and scp and a connection will be first established with the jump host whitelisted_server. Now we can easily use vim for remote editing again:
vim scp://protected_server//my/remote/file.txt
Done! :)
ProxyJump was introduced in OpenSSH 7.3. Check out this great answer on UNIX & Linux Stack Exchange for more usage examples and alternative methods using ProxyCommand for earlier versions.