I want to connect to a Google Colab computer via SSH because it has really shit text editing abilities, and it likes to hide the characters I type in the interactive shell.

This is code I have on a Python 3 Jypyter notebook with Google Colab:

!echo "PermitRootLogin yes" >> /etc/ssh/sshd_config #gimme that root access, cause default user is root in Google Colab
!cat /etc/ssh/sshd_config                           #check check that everything is A-OK
!mkdir /content/ssh                                 #make an SSH folder
!chmod 700 /content/ssh                             #gimme permissions on that folder
!ssh-keygen -t rsa                                  #make me a key
!curl ifconfig.me                                   #find where i'm at
!restart ssh                                        #restart ssh, IDK why I do this
!service ssh restart

the Output it generates:

#   $OpenBSD: sshd_config,v 1.101 2017/03/14 07:19:07 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

#Port 22
#AddressFamily any
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m
#PermitRootLogin prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#PubkeyAuthentication yes

# Expect .ssh/authorized_keys2 to be disregarded by default in future.
#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
PrintMotd no
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# no default banner path
#Banner none

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

# override default of no subsystems
Subsystem   sftp    /usr/lib/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#   X11Forwarding no
#   AllowTcpForwarding no
#   PermitTTY no
#   ForceCommand cvs server
PermitRootLogin yes
PasswordAuthentication yes
PermitRootLogin yes
PasswordAuthentication yes
PermitRootLogin yes
PermitRootLogin yes
mkdir: cannot create directory ‘/content/ssh’: File exists
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): key
key already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): SSHNOW
Enter same passphrase again: SSHNOW
Your identification has been saved in key.
Your public key has been saved in key.pub.
The key fingerprint is:
SHA256:k+whmXKgXftXPAr3/zZJlZX85fST0RQOvqJOjBKX5NE root@dc8ab463b697
The key's randomart image is:
+---[RSA 2048]----+
|             ..o=|
|        .   . o+=|
|    . .o E   . +O|
|   o oo=o. .  .+=|
|  . o.*+S ..+.  o|
|     oo+o=.+.. . |
|     . .o+o . . .|
|      . o.   . o.|
|         .    .oo|
/bin/bash: restart: command not found

When I try to connect to this using PuTTY on Windows with [email protected] on port 22, I only get a network timeout.

related questions, with limited functionality: https://stackoverflow.com/questions/48709520/answer-yes-to-terminal-on-google-colaboratory #what is climt https://stackoverflow.com/questions/51882170/connect-to-google-collab-with-ssh-from-console-from-pc #script is useful, but does some extra stuff I don't want https://research.google.com/colaboratory/local-runtimes.html #can't use local runtimes, I'm develop on 5 different computers every da

  • It would help if you provided sshd and putty logs.
    – Layne B
    Commented Oct 29, 2018 at 23:49
  • I'm trying and I can't seem to get log output for either of these: Commented Oct 30, 2018 at 0:09
  • medium.com/machine-learning-world/… questions, with limited functionality: stackoverflow.com/questions/48709520/… #what is climt stackoverflow.com/questions/51882170/… #script is useful, but does some extra stuff I don't want research.google.com/colaboratory/local-runtimes.html #can't use local runtimes, Commented Nov 5, 2018 at 3:09
  • I'm not trying to be rude or unhelpful, but there's really just like... a lot of problems here. You shouldn't put echo "PermitRootLogin yes" >> /etc/ssh/sshd_config in the script, you only need to run that once. You're repeatedly adding the same config line over and over again, which won't really hurt anything but... yeah. You shouldn't do that. Then you cat the config file, which is actually helpful here but in normal use the config won't change, so why cat the file every time you run the script? These lines: mkdir /content/ssh, chmod 700 /content/ssh, and !ssh-keygen -t rsa
    – Layne B
    Commented Nov 6, 2018 at 23:28
  • also only need to be run one time, not every time you run the script. You grab the IP address with curl ifconfig.me, but this will get the external IP. Are you trying to connect over an external or local network? If you're connecting from the intranet you'll need port forwarding or some other solution to direct the session to the correct local IP. restart ssh is not a valid command and does nothing. service ssh restart restarts the ssh server, which is also not necessary once the config changes have been made.
    – Layne B
    Commented Nov 6, 2018 at 23:32

1 Answer 1


You are not going to be able to establish connection to machine running colab using incoming ssh simply because this port is not exposed by the pod it runs in (read it runs behind firewall).

How to setup SSHD on Colab and tunnel it through ngrok is described in details here https://stackoverflow.com/a/53252985/888545

As for better code editor you can run VSCode as server in colab using code-server project (more at https://coder.com) and ngrok (more at https://ngrok.com) to get a world wide accessible link.

This setup will also give you access to file system browser, code editor and terminal + almost any extensions of VSCode.

Download and unpack code-server and ngrok

!curl -sSL https://github.com/cdr/code-server/releases/download/1.1119-vsc1.33.1/code-server1.1119-vsc1.33.1-linux-x64.tar.gz | tar -xvz
!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip ngrok-stable-linux-amd64.zip

Run ngrok and code-server

!./ngrok http 8443 --log=stdout & ./code-server1.1119-vsc1.33.1-linux-x64/code-server --allow-http --no-auth /

Find like like this one in output:

msg="started tunnel" obj=tunnels name=command_line addr=http://localhost:8443 url=https://f49b32d9.ngrok.io

and click https://xxxx.ngrok.io link to switch to coder in browser

enter image description here

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .