I’ve recently been testing a brand new Apple M1 device for compatibility with my .NET and JetBrains Rider workflow. What’s been interesting is my experience has predominantly been over an SSH tunnel using VNC, a remote screen sharing protocol.
In this short post, We’ll see the few commands we need to connect to a remote machine, determine the VNC port, and start a VNC connection. The approach will likely work on Linux distributions, as well as Windows Subsystem for Linux users.
Creating an SSH Key Pair
There are several ways to log in to an SSH session, but the most convenient is using SSH Keys. In general, our SSH key is our identity to other hosts. If we don’t already use SSH keys for Git, we can generate a new identity key pair by running the following command from a terminal.
> ssh-keygen
The command will generate a new private/public RSA key pair and save it under a .ssh
folder in our root directory.
Read more about generating an SSH key pair at SSH.Com.
The Host Setup
Folks will have to install the public key on the host environment. Consult your host machine administrator with enabling screen sharing on the target device. In general, we want to add our public key to the ~/.ssh/authorized_keys
on the host machine. We can do that by copying our public key on the host device, then running the following commands.
> mkdir -p ~/.ssh
> touch ~/.ssh/authorized_keys
> cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
We’ve now successfully tied our public ssh key to the current user on our host. Read more about the process in this post. For folks using hosting platforms like AWS, Azure, or Digital Ocean, enabling SSH should be part of the resource allocation process. Check the respective provider for guidance.
The Client Login
From here on out, we’ll need to run commands from a terminal until we start our VNC session. Now that we have our host setup, we need to login to our remote client.
To log in, we need to run the ssh login command.
ssh username@host
The username
will be the user account on the host machine. The host
will either be the IP address or the host machine’s publicly accessible name.
When successfully logged in, we should see our command line change to reflect our host’s environment.
[username@host1 ~]$ ssh username@host2.somewhere.edu
Last login: Mon Oct 20 09:23:17 2014 from host1.somewhere_else.edu
Determine VNC Server Port
In most cases, the VNC port will be in the range of 59xx
. If we don’t know which port VNC is using, we can run the following command on our host while still connected to the SSH session.
sudo lsof -i -P | grep -i "listen"
We can scan through the resulting output to find the exact port number.
launchd 1 root 15u IPv6 0x3af20c046b8704ad 0t0 TCP *:5900 (LISTEN)
launchd 1 root 16u IPv6 0x3af20c046b8704ad 0t0 TCP *:5900 (LISTEN)
launchd 1 root 17u IPv4 0x3af20c046b88327d 0t0 TCP *:5900 (LISTEN)
launchd 1 root 28u IPv4 0x3af20c046b88327d 0t0 TCP *:5900 (LISTEN)
In the example, we can see that our host machine is listening for VNC connections on port 5900
.
Creating The Tunnel
We’ll need to exit our SSH session from our previous section. We can close our session by typing exit
in the command line. Our goal is to connect our local port of 5900
to the remote host’s port of 5900
from the command line.
ssh -L 5900:localhost:5900 username@host
We should see the same prompt from our previous logins, but now we have established an SSH connection with a tunnel to the VNC Server on port 5900
.
Connecting The VNC Client
macOS comes with a built-in VNC Client, but they decided to rename it to Screen Sharing in Apple-being-Apple fashion. To connect to your host machine’s desktop, run the following command in a local command-line session (on your development machine).
open vnc://localhost:5900
Remember, we created a tunnel from our local IP address to our remote host. If we set up everything correctly, we should be looking at our remote host’s desktop.
I hope folks find this post helpful—happy and secure remoting.