我正在 Google Cloud Run 上的云中运行 Ubuntu 20.04.3 桌面。当我在本地运行容器映像时,我可以运行任何进程,包括 bash 终端。
但是,在通过 noVNC 连接的 Google Cloud Run 上,我无法启动终端或除 Google Chrome 之外的任何其他进程。因此,我尝试了几种不同的基于浏览器的终端解决方案,这是我发现的:
在 Node.js 中使用 Spawn
使用 Spawn 和反向 shell Node.js Web 服务器,我可以传递终端命令。例如,localhost:xxxx/exec?q=ls,将列出当前工作目录中的文件。我也可以执行命令。
WebSSH2 和 shellinabox
这两种解决方案都使用 SSH 将浏览器客户端连接到 SSH 服务器。我可以登录它,但是当我运行任何命令时,我会得到以下输出:
root@localhost:~# ls
[1] stopped ls --color=auto
root@localhost:~# ls
正如您所看到的,我什至尝试以 root 身份使用 SSH,但仍然无法运行任何命令,除非我使用 Node.js 的 spawn 方法来执行 shell 命令。
作为上下文,以下是在本地运行 Ubuntu、fluxbox、xvfb 以及使用 noVNC 通过浏览器访问桌面的情况。请注意,在本地,一切正常,我可以ls
在我的主文件夹中运行并查看其中有哪些文件:
这就是我在 Google Cloud Run 中运行相同图像时看到的情况。请注意,该ls
命令仅返回stopped [1]
:
这是 Node.js 反向 shell 的样子。这里我们可以看到我可以ls
在/usr/bin文件夹下运行。这是我能够浏览文件系统并查看设置了哪些权限并在 Google Cloud Run 中运行的容器上执行命令的唯一方法:
即使我使用 Node.js 反向代理来放松对文件的权限,chmod -R 777 /usr
我仍然无法执行像ls
使用 WebSSH2 或 shellinabox 时那样的命令。
是什么可能阻止 shell 命令和进程运行,甚至以 root 身份运行?