在使用远程容器时,如何运行多个VS Code实例以使用不同的身份与远程git存储库进行交互?

时间:2020-05-06 08:00:37

标签: visual-studio-code vscode-remote ssh-agent

很抱歉发布了很长时间

我有一个使用容器的VS Code远程开发设置。我在同一个git服务器上有多个用户帐户。我正在使用基于密钥的身份验证与git-server进行交互。我在主机中使用Ubuntu 18.04 LTS,在容器中使用Debian Buster。

Git Server - git.server.com
Git urls 
 - git@git.server.com:repo1.git
 - git@git.server.com:repo2.git

Repo1 is used by User1 account
Repo2 is used by User2 account

ssh-key for User1 - ~/.ssh/id_ed25519_user1
ssh-key for User2 - ~/.ssh/id_ed25519_user2

我已经在〜/ .ssh / config中创建了一个ssh配置

Host user1.git.server.com
    HostName git.server.com
    User git
    IdentityFile /home/user/.ssh/id_ed25519_user1
    IdentitiesOnly yes

Host user2.git.server.com
    HostName git.server.com
    User git
    IdentityFile /home/user/.ssh/id_ed25519_user2
    IdentitiesOnly yes

我可以从主机上的终端向服务器进行身份验证

作为用户1:

ssh git@user1.git.server.com

作为用户2:

ssh git@user2.git.server.com

我可以启动多个vs代码实例,并在vs代码终端内部(无需打开远程容器中的文件夹),可以使用上述命令进行身份验证。

一旦使用“在容器中重新打开”,事情就会变得有趣起来。 我没有在容器内安装.ssh / config文件夹,因此上述命令由于出现错误而无法执行:

Could not resolve hostname user1.git.server.com: Name or service not known
or
Could not resolve hostname user2.git.server.com: Name or service not known

出于明显的原因,我不想将./ssh文件夹安装到容器中。此外,mount=type=ssh也是不可能的,因为这不是在构建容器而是将容器作为开发环境使用。

接下来我要注意的是ssh-agent转发正在工作。

ssh-add -l

如果我在主机的终端中执行上述命令,则vs代码中的终端(在本地打开文件夹时)和vs代码中的终端(当在远程容器中打开文件夹时)都返回相同的输出(身份密钥的指纹)用户1和用户2)。

所以我在启动代码之前在主机终端中启动一个新的ssh-agent。

~/repo1$ eval `ssh-agent -s`
~/repo1$ ssh-add ~/.ssh/id_ed25519_user1
~/repo1$ code .

and in another terminal
~/repo2$ eval `ssh-agent -s`
~/repo2$ ssh-add ~/id_ed25519_user2
~/repo2$ code .

在相应的主机终端和vs代码终端中(没有在远程容器中打开文件夹),我得到了预期的结果。我可以使用:

ssh git@git.server.com

因此,我不再需要ssh-config文件。 但这在“远程容器”中打开文件夹时不起作用。 VS Code仅连接到启动的第一个ssh-agent。也就是说(在这种情况下)在VS Code Remote Container中打开的repo1可以与所有git支持完美配合,但是在VS Code Remote Container中打开的repo2不起作用。

切换到远程容器时,如何指示VS Code使用哪个ssh代理转发到容器?

解决方法

我当前使用的解决方法是使用默认的ssh-agent(Ubuntu在登录时启动ssh-agent)。该代理已经包含两个身份。通过运行进行验证

ssh-add -l

照常启动多个vs代码实例,然后切换到“远程容器”。 当我想执行git操作时,请在主机终端中执行以下操作:

For repo1 (user1) operations
$ ssh-add -D
$ ssh-add ~/.ssh/id_ed25519_user1

For repo2 (user2) operations
$ ssh-add -D
$ ssh-add ~/.ssh/id_ed25519_user2

还有其他建议的方法吗?可以将任何设置添加到devcontainer.json中以实现ssh-agent的正确转发吗?

感谢您的耐心等候。

0 个答案:

没有答案