How can I ssh to google colaboratory VM?

Rastislav Rabatin picture Rastislav Rabatin · Jan 26, 2018 · Viewed 8k times · Source

How can I ssh to google collaboratory VM? Is there a more straightforward way to do it than to create ssh tunnel from jupyter notebook to a remote server?

Answer

Tamlyn picture Tamlyn · Nov 11, 2018

Try pasting the following into a cell and running it (inspired by this gist):

import random, string, urllib.request, json, getpass

#Generate root password
password = ''.join(random.choice(string.ascii_letters + string.digits) for i in range(20))

#Download ngrok
! wget -q -c -nc https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
! unzip -qq -n ngrok-stable-linux-amd64.zip

#Setup sshd
! apt-get install -qq -o=Dpkg::Use-Pty=0 openssh-server pwgen > /dev/null

#Set root password
! echo root:$password | chpasswd
! mkdir -p /var/run/sshd
! echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
! echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
! echo "LD_LIBRARY_PATH=/usr/lib64-nvidia" >> /root/.bashrc
! echo "export LD_LIBRARY_PATH" >> /root/.bashrc

#Run sshd
get_ipython().system_raw('/usr/sbin/sshd -D &')

#Ask token
print("Copy authtoken from https://dashboard.ngrok.com/auth")
authtoken = getpass.getpass()

#Create tunnel
get_ipython().system_raw('./ngrok authtoken $authtoken && ./ngrok tcp 22 &')

#Get public address and print connect command
with urllib.request.urlopen('http://localhost:4040/api/tunnels') as response:
  data = json.loads(response.read().decode())
  (host, port) = data['tunnels'][0]['public_url'][6:].split(':')
  print(f'SSH command: ssh -p{port} root@{host}')

#Print root password
print(f'Root password: {password}')

ngrok is used to create a tunnel to the machine and give it a publicly accessible hostname. You will need to sign up, copy your auth token and provide it to the Colab notebook when prompted.

When it completes, it will print out your connection details, something like:

SSH command: ssh -p12312 [email protected]
Root password: abcdeLMh6vpNViGHQbXi

If this last step fails, try running the cell again or create a new cell with just the following and read the JSON output to find the hostname and port.

! curl -s http://localhost:4040/api/tunnels