Google Colabを普通に使っているぶんには、例えばpip使ってなにかいれるような場合でも「!pip …」みたいにしてノート上で作業すれば良いのですが、なにかディープラーニング系のアプリケーションを入れて試すような場合だと、shellが使いたい… となることがあると思います。
そういう時にターミナルの画面出せるような方法ないのかな?と探したのですが、普通には出来ないのですね。
でそれを、ngrokを使って無理やりターミナルで繋げる方法が紹介されていました。
ngrok経由でsshdに接続できるようにする
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 &')
ngrokに接続するための認証とsshパスワードの取得
#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}')
で、これで繋げられるようになるのですが、ちょっと目を離しているすきにすぐ切れてしまうため、screenとかを導入しといたほうが良いと思います。
ちなみにそれらの設定するための /root/.profile や /root/.screenrc などの設定ファイルは、
こちらで紹介されている「%%writefile」を使って書いとくと良いです。