モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

Colabでshellを利用する

Google Colabを普通に使っているぶんには、例えばpip使ってなにかいれるような場合でも「!pip …」みたいにしてノート上で作業すれば良いのですが、なにかディープラーニング系のアプリケーションを入れて試すような場合だと、shellが使いたい… となることがあると思います。

そういう時にターミナルの画面出せるような方法ないのかな?と探したのですが、普通には出来ないのですね。

でそれを、ngrokを使って無理やりターミナルで繋げる方法が紹介されていました。

stackoverflow.com

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 などの設定ファイルは、

qiita.com

こちらで紹介されている「%%writefile」を使って書いとくと良いです。