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

更多用法

  1. 快速得到一个 webui 的外部地址,但仅限自己浏览器访问

    from google.colab.output import eval_js
    print(eval_js("google.colab.kernel.proxyPort(8000)"))
  2. 通过 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
  3. 防止 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,所以诸如 ttydcode-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?