どうすればGoogleコラボレーションVMにSSHできますか? jupyterノートブックからリモートサーバーへのsshトンネルを作成するよりも簡単な方法はありますか?
以下をセルに貼り付けて実行してみてください( 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 は、マシンへのトンネルを作成し、パブリックにアクセス可能なホスト名を与えるために使用されます。サインアップし、認証トークンをコピーして、プロンプトが表示されたらColabノートブックに提供する必要があります。
完了すると、次のような接続の詳細が出力されます。
SSH command: ssh -p12312 [email protected]
Root password: abcdeLMh6vpNViGHQbXi
この最後の手順が失敗した場合は、セルを再度実行するか、次のコードだけで新しいセルを作成し、JSON出力を読み取ってホスト名とポートを見つけます。
! curl -s http://localhost:4040/api/tunnels
!
を使用して、ノートブックでシェルコマンドを実行できます。次に例を示します。
!echo "Echo in Shell"
現在、SSH経由でバックエンドに直接接続することはサポートされていません。