与Colab交互的一些姿势
Colab 使用 cell 控制有诸多不便,为了方便交互和监控资源,研究了一下通过终端交互的方式。
管理 Colab
【弃用】方案 1:通过 webshell… 对,就是木马当管理器用。
!apt install php !nohup php -S localhost:8000 > /dev/null & !echo '<?php @eval($_POST["shell"]);?>' > connect.php # 然后用 ngrok(我一开始就是这样修改文件的)
结论:不会被制裁。体验一言难尽,蛋疼。
【弃用】方案 2:使用 tmate
!apt install tmate !tmate # 自动分配外网地址
结论:一般不会被制裁。比没有强,像 tmux
那样操作。
【在用】方案 3:使用正经 ssh
!echo $($(echo "pip install colab""_ssh --upgrade")) from colab_ssh import launch_ssh_cloudflared, init_git_cloudflared launch_ssh_cloudflared(password="X")
结论:直接安装 colab_ssh
会有警告,虽然能绕过但制不制裁看官方心情。体验很爽。
方案 3 解释
这个方案需要本地下载一个 cloudflared,具体的 vscode 配置可以参考>这篇教程
作者给了一个修改本地 .ssh/config
的方案,实际上也可以在本地端口监听,像这样:
cloudflared.exe access tcp --listener localhost:2222 --hostname sub.trycloudflare.com
这样各种 ssh 客户端,如 Xshell,也可以通过连接 localhost:2222
来访问 colab
更多用法
-
快速得到一个 webui 的外部地址,但仅限自己浏览器访问
from google.colab.output import eval_js print(eval_js("google.colab.kernel.proxyPort(8000)"))
-
通过 cloudflare tunnel 将任意端口暴露到外网,所有人可访问
!wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -O cloudflared !chmod a+x cloudflared import nest_asyncio nest_asyncio.apply() import subprocess f = open("stdout", "w") p = subprocess.Popen(['./cloudflared', '--url', 'http://localhost:8000'], bufsize=0, stdout=f, stderr=subprocess.STDOUT) import time time.sleep(3) !grep -F trycloudflare stdout
-
防止 colab 断连,console 自动点击 connect。
var startClickConnect = function startClickConnect(){ var clickConnect = function clickConnect(){ console.log("Connnect Clicked - Start"); document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click(); console.log("Connnect Clicked - End"); }; var intervalId = setInterval(clickConnect, 60000); var stopClickConnectHandler = function stopClickConnect() { console.log("Connnect Clicked Stopped - Start"); clearInterval(intervalId); console.log("Connnect Clicked Stopped - End"); }; return stopClickConnectHandler; }; var stopClickConnect = startClickConnect(); // In order to stop, call: // stopClickConnect();
结论
Colab 虽然限制 ssh,但并不是特别严格,还是可以变相使用。不过,Colab 似乎不支持 websocket,所以诸如 ttyd
、code-server
等基于网页的终端无法使用。
Kaggle 严格限制 ssh,用了直接封号。不过,Kaggle 支持 websocket,所以可以使用 code-server
。
以上就是在两者直接使用终端交互的方式。
最后,连接时最好检查一下本地防火墙。如果火绒处于免打扰模式,很可能会自动拦截 ssh
或者 cloudflared
。
参考
- vscode连接Google colab
- cloudflare-tunnel-to-colab.ipynb
- Quick Tunnels · Cloudflare Zero Trust docs
- Arbitrary TCP · Cloudflare Zero Trust docs
- How can I prevent Google Colab from disconnecting?