95

У меня есть личный аккаунт и корпоративный аккаунт на Unfuddle. В разделе «Развернуть» ключи SSH могут использоваться только для одной учетной записи, поэтому мне нужно создать отдельный ключ SSH на моем ноутбуке для обеих учетных записей. Я запустил ssh-keygen -t rsa чтобы сгенерировать два ключа с разными именами (personal - это имя по умолчанию, а company - {company} _rsa). Проблема сейчас в том, что кажется, что мой ключ по умолчанию используется везде, и я не могу узнать, как указать ключ для использования в Git для отдельных репозиториев.

Итак, мой вопрос: как мне указать ключ SSH для использования в режиме репо-репо?

Я установил свой ssh_config (~/.ssh/config), но он все еще не работает.

конфигурации:

Host {personalaccount}.unfuddle.com
     HostName {personalaccount}.unfuddle.com
     User git
     IdentityFile /Users/dave/.ssh/id_rsa

Host {companyaccount}.unfuddle.com
     HostName {companyaccount}.unfuddle.com
     User git
     IdentityFile /Users/dave/.ssh/cage_rsa

Мой конфигурационный файл репозитория Git для репо в учетной записи моей компании выглядит так:

[remote "origin"]
     url = git@{companyaccount}.unfuddle.com:{companyaccount}/overall.git
     fetch = +refs/heads/*:refs/remotes/origin/*

Поэтому я не уверен, что что-то не так с моей конфигурацией ssh или моей конфигурацией git.

4 ответа4

108

Если у вас есть активный ssh-agent , у которого загружен ваш ключ id_rsa , то, скорее всего, проблема в том, что ssh сначала предлагает этот ключ. Unfuddle, вероятно, принимает его для аутентификации (например, в sshd), но отклоняет его для авторизации доступа к репозиториям компании (например, в любом внутреннем программном обеспечении, которое они используют для авторизации, возможно, в чем-то похожем на Gitolite). Возможно, есть способ добавить ваш личный ключ в корпоративный аккаунт (несколько человек не используют одни и те же файлы открытого и закрытого ключей corp_rsa , не так ли?).


Ключевое слово конфигурации IdentitiesOnly .ssh/config можно использовать для ограничения ключей, которые ssh предлагает удаленному sshd, только теми, которые указаны с помощью ключевых слов IdentityFile (т. Е. Он откажется использовать любые дополнительные ключи, которые оказываются загруженными в активный ssh-agent).).

Попробуйте эти .ssh/config разделы:

Host {personalaccount}.unfuddle.com
     IdentityFile ~/.ssh/id_rsa
     IdentitiesOnly yes

Host {companyaccount}.unfuddle.com
     IdentityFile ~/.ssh/{companyaccount}_rsa
     IdentitiesOnly yes

Затем используйте URL-адреса Git, подобные этим:

git@{personalaccount}.unfuddle.com:{personalaccount}/my-stuff.git
git@{companyaccount}.unfuddle.com:{companyaccount}/their-stuff.git

Если вы хотите в полной мере воспользоваться механизмом .ssh/config , вы можете указать свое собственное имя хоста и изменить имя пользователя по умолчанию:

Host uf-mine
     HostName {personalaccount}.unfuddle.com
     User git
     IdentityFile ~/.ssh/id_rsa
     IdentitiesOnly yes

Host uf-comp
     HostName {companyaccount}.unfuddle.com
     User git
     IdentityFile ~/.ssh/{companyaccount}_rsa
     IdentitiesOnly yes

Затем используйте URL-адреса Git, подобные этим:

uf-mine:{personalaccount}/my-stuff.git
uf-comp:{companyaccount}/their-stuff.git
3

man ssh_config

Что-то вроде

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

И используйте personal_repo качестве хоста в вашем git-репо.

3

IdentityFile и IdentitiesOnly работают хорошо. Что меня беспокоит, так это то, что я не забываю использовать разные имена хостов для подключения, и тот факт, что переадресованное соединение с агентом по-прежнему содержит все ключи, а это означает, что, если удаленный хост скомпрометирован, они могут использовать любые мои идентификационные данные, пока я нахожусь в ,

Я недавно начал использовать:

https://github.com/ccontavalli/ssh-ident

это обертка вокруг ssh, это:

  • хранит совершенно отдельного агента для каждой определенной вами личности.
  • автоматически обменивается агентами между сеансами входа в систему, ничего не делать в вашем .bashrc.
  • загружает агент и соответствующие ключи по требованию, когда они вам нужны в первый раз.
  • определяет, какой агент использовать на основе командной строки ssh (имя хоста и т. д.) или вашего текущего рабочего каталога. Это особенно удобно, так как я склонен работать по-разному, в зависимости от того, что я делаю.
0

Вот правильный способ, если вы хотите использовать ssh agent:

# Create public keys to make sure they exist
# this is a must if you use ssh agent forwarding
# or want to use ssh-agent at all
ssh-agent -L | grep personal > ~/.ssh/personal_identity.pub
ssh-agent -L | grep company > ~/.ssh/company_identity.pub


# Add to ~/.ssh/config
Host {personalaccount}.unfuddle.com
  IdentityFile ~/.ssh/personal_identity.pub

Host {companyaccount}.unfuddle.com
  IdentityFile ~/.ssh/company_identity.pub

Объяснение: если у вас есть закрытый ключ в каталоге ~/.ssh, ssh-agent не будет использоваться. Поэтому мы создаем открытый ключ под другим именем, так что ssh вынужден использовать ssh-agent. Это также помогает, если у вас нет доступа к закрытым ключам (например, переадресация агента ssh)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .