Refs to: Integrating Fedora Toolbox into VS Code (with the help of SSH)

笔者已经使用 Silverblue 一段时间了,在这一段时间内使用各类 IDE 都遇到让我困扰的问题。最开始我直接使用 vscode 等 IDE 直接打开本地的项目,但是这样打开的项目完全没有办法使用一些局部的环境变量,例如我的 Python 环境、前端开发的 npm 环境等;接下来我在 Toolbox 中创建我的环境,毕竟这个才是 rpm-os 推荐的做法,用户应该尽可能不要使用 rpm-ostree 来进行环境的安装,任何带 GUI 的应用都最好使用 flatpak 进行安装,需要开发的话在各个 toolbox container 中配置环境,但我通过 toolbox 中安装 vscode 打开本地项目,其中的 shell 依旧是处于 toolbox container 之外的 shell,这导致项目依旧不能识别是我配置的环境。例如在一个 python 虚拟环境中已经安装好了相关依赖,但是在 vscode on toolbox 中使用 pip 会导致受到 module "pip" not found 的报错。

翻越了互联网很久才发现上面的这一篇文章,我突然意识到可以使用 SSH 与 toolbox 进行连接开发,这样的开发可以实现在 vscode 中的 Shell 处于 toolbox 之中。

通过 SSH 连接至 Toolbox

Integrating Fedora Toolbox into VS Code (with the help of SSH) 中已经清晰地教会了如何使用 vscode 连接 toolbox,在任何情况下我都推荐你完整看一遍这篇文章。

细节补充

依据这篇文章的步骤,我也下载了该作者提供的脚本,一键配置好 Toolbox 中的 SSH,但是我还是躺了不少坑。

  1. 如果你有多个 Toolbox container 时,直接使用该脚本是不行的,因为他会给每一个 toolbox container 设置成同一个 ssh port,这会导致 vscode 不清楚自己究竟应该连接哪个 ssh server,因此你应该为每一个 container 手动配置一个端口,一个单独的名称。

    # my ~/.ssh/config file
    Host toolbox-minecraft
        Hostname localhost
        Port 22361
    
    Host toolbox-frontend
        Hostname localhost
        Port 22362
    
  2. 每次想要连接到 ssh server 时都务必要执行打开对应 toolbox 的 sshd,在这里我写了一个简单的 bash 脚本,可以帮助你快速打开 sshd

    toolbox-openssh() {
        if [ $# -eq 0 ]
        then
                echo "No toolbox is specified"
        else
                toolbox run -c $1 sudo /usr/sbin/sshd
        fi
    }
    

    执行该脚本需要在控制台中输入(例如:toolbox-openssh minecraft),随后会为你自动打开名为 minecraft 的 toolbox container 的 sshd 服务,当然你也可手动执行 toolbox run -c minecraft sudo /usr/sbin/sshd

TL, DR

所以我是不推荐你使用上述原作者提供的脚本的,不如手动添加,反正每次都只需要为一个 toolbox 使用,又不复杂,何乐而不为呢?

上述提供的所有命令:

# In toolbox
sudo dnf install openssh-server -y
sudo /usr/libexec/openssh/sshd-keygen rsa
sudo /usr/libexec/openssh/sshd-keygen ecdsa
sudo /usr/libexec/openssh/sshd-keygen ed25519
echo "
# For VS Code
Port 22$VERSION                 # Prevent conflicts with other SSH servers
ListenAddress localhost   # Don’t allow remote connections
PermitEmptyPasswords yes  # Containers lack passwords by default
PermitUserEnvironment yes # Allow setting DISPLAY for remote connections" | sudo tee -a /etc/ssh/sshd_config

# Out of toolbox
echo "
Host {custom}
    HostName localhost
    Port 22$VERSION" >> ~/.ssh/config   # 请手动替换为还指定的名称、端口号

# function (optional)
echo "
toolbox-openssh() {
    if [ $# -eq 0 ]
	then
            echo "No toolbox is specified"
	else
            toolbox run -c $1 sudo /usr/sbin/sshd
    fi
}" | tee -a ~/.bashrc && source ~/.bashrc

每次想要连接到 ssh server 时,如果该服务尚未打开,可以执行 toolbox-openssh 加上你的 toolbox container 的名称(如果添加了上述函数名称)