很抱歉发布了很长时间
我有一个使用容器的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的正确转发吗?
感谢您的耐心等候。