Извините за длинный пост
У меня есть установка удаленной разработки VS Code с использованием контейнеров. У меня есть несколько учетных записей пользователей на одном сервере git. Я использую аутентификацию на основе ключей для взаимодействия с git -сервером. Я использую 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
Я создал конфигурацию s sh в ~ / .ssh / config
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
С терминала на хост-машине я могу аутентифицироваться на сервере
как user1:
ssh git@user1.git.server.com
как user2:
ssh git@user2.git.server.com
Я могу запускать несколько экземпляров кода vs и внутри терминал vs code (не открывая папку в удаленном контейнере), я могу использовать приведенные выше команды для аутентификации.
Все становится интересно, когда мы используем «Reopen in Containers». У меня нет папки .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
также невозможно, так как это не создание контейнера, а работа с контейнером в качестве среды разработки.
Следующее, что я замечаю, это то, что s sh -agent forwarding работает.
ssh-add -l
Если я выполняю указанную выше команду в терминале на хосте, терминал в коде vs (когда папка открывается локально) и терминал в коде vs (когда папка открывается в удаленном контейнере) все возвращают один и тот же результат (отпечаток пальца для ключей идентификаторов для user1 и user2).
Итак, я запускаю новый s sh -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 code (не открывая папку в удаленном контейнере) получаю желаемый результат. Я могу использовать:
ssh git@git.server.com
Так что мне больше не нужен файл sh -config. Но это не работает, когда папка открыта в удаленном контейнере. VS Code подключается только к первому запущенному s sh -агенту. То есть (в данном случае) repo1, открытый в VS Code Remote Container, отлично работает со всей поддержкой git, но repo2, открытый в VS Code Remote Container, не работает.
Как я могу указать VS Code для использования, который s sh -агент для пересылки в контейнер при переключении на удаленный контейнер?
Обходной путь
Временное решение, которое я использую в настоящее время, - это использовать агент s sh по умолчанию (Ubuntu запускает s sh -агент на момент входа в систему). Этот агент уже содержит оба удостоверения. Проверьте, запустив
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 для правильной пересылки s sh -agent?
Спасибо за ваше терпение.