Как указать закрытый SSH-ключ для использования при выполнении команды оболочки на Git? - PullRequest
886 голосов
/ 30 декабря 2010

Возможно, это довольно необычная ситуация, но я хочу указать закрытый SSH-ключ для использования при выполнении команды shell (git) с локального компьютера.

В основном так:

git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

Или даже лучше (в Ruby):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone git@github.com:TheUser/TheProject.git")
end

Я видел примеры подключения к удаленному серверу с Net :: SSH, который использует указанный закрытый ключ, но это локальная команда. Возможно ли это?

Ответы [ 24 ]

1053 голосов
/ 28 июня 2012

Ни одно из этих решений не помогло мне.

Вместо этого я уточняю упоминание @Martin v. Löwis о настройке файла config для SSH.

SSH будет искать файл ~/.ssh/config пользователя. У меня есть мои настройки как:

Host gitserv
    Hostname remote.server.com
    IdentityFile ~/.ssh/id_rsa.github
    IdentitiesOnly yes # see NOTES below

И я добавляю удаленный репозиторий git:

git remote add origin git@gitserv:myrepo.git

И тогда у меня нормально работают команды git.

git push -v origin master

ПРИМЕЧАНИЯ

  • IdentitiesOnly yes требуется для предотвращения поведения по умолчанию SSH отправки файла идентификации, соответствующего имени файла по умолчанию для каждого протокола. Если у вас есть файл с именем ~/.ssh/id_rsa, который будет опробован ДО вашего ~/.ssh/id_rsa.github без этой опции.

Ссылки

655 голосов
/ 30 декабря 2010

Как-то так должно работать (предложено orip):

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

если вы предпочитаете подоболочки, попробуйте следующее (хотя оно и более хрупкое):

ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git)

Git вызовет SSH, который найдет своего агента по переменной окружения; это, в свою очередь, загрузит ключ.

В качестве альтернативы, установка HOME также может помочь, если вы готовы настроить каталог, который содержит только каталог .ssh, как HOME; он может содержать либо identity.pub, либо файл конфигурации с настройкой IdentityFile.

382 голосов
/ 17 сентября 2013

Предложения других людей о ~/.ssh/config очень сложны. Это может быть так просто, как:

Host github.com
  IdentityFile ~/.ssh/github_rsa
339 голосов
/ 20 апреля 2015

Начиная с Git 2.3.0 у нас также есть простая команда (файл конфигурации не требуется):

GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git

Вам может потребоваться перезапуск службы ssh на вашем компьютере.

131 голосов
/ 17 февраля 2012

Содержимое my_git_ssh_wrapper:

#!/bin/bash

ssh -i /path/to/ssh/secret/key $1 $2

Затем вы можете использовать ключ, выполнив:

GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git
89 голосов
/ 19 сентября 2014

Суммируя ответы и комментарии , лучший способ настроить git на использование разных файлов ключей, а затем забыть об этом, который также поддерживает разных пользователей для одного хоста (например, личную учетную запись GitHub ирабочий вариант), который также работает в Windows, состоит в том, чтобы отредактировать ~/.ssh/config (или c:\Users\<your user>\.ssh\config) и указать несколько идентификаторов:

Host github.com
HostName github.com
IdentityFile /path/to/your/personal/github/private/key
User dandv

Host github-work
HostName github.com
IdentityFile /path/to/your/work/github/private/key
User workuser

Затем, чтобы клонировать проект в качестве личного пользователя, простовыполните обычную команду git clone.

Чтобы клонировать репо как workuser, запустите git clone git@github-work:company/project.git.

77 голосов
/ 20 июля 2016

С помощью git 2.10+ (3 квартал 2016 г .: выпущено 2 сентября 2016 г.) у вас есть возможность установить config для GIT_SSH_COMMAND (а не только переменную окружения, как описано в Робер Джек * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 101 * * * * * * * * * * * * * * * * * * * * * * * 101 .
(Объединено Junio ​​C Hamano - gitster - in commit dc21164 , 19 Jul 2016)

Была добавлена ​​новая переменная конфигурации core.sshCommand, чтобы указать, какое значение GIT_SSH_COMMAND будет использовать для каждого хранилища.

core.sshCommand:

Если эта переменная установлена, git fetch иgit push будет использовать указанную команду вместо ssh, когда им необходимо подключиться к удаленной системе.
Команда находится в той же форме, что и переменная окружения GIT_SSH_COMMAND, и переопределяется, если задана переменная окружения.

Это означает, что git clone может быть:

cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file' 
# later on
git clone host:repo.git
63 голосов
/ 12 января 2017

Как указано здесь: https://superuser.com/a/912281/607049

Вы можете настроить его для репо:

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
30 голосов
/ 15 января 2013

Я пошел с переменной среды GIT_SSH. Вот моя оболочка, похожая на ту, что была у Джо Блока сверху, но она обрабатывает любое количество аргументов.

Файл ~ / gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"

Затем в моем .bashrc добавьте следующее:

export GIT_SSH=~/gitwrap.sh
30 голосов
/ 02 октября 2012

Лучше добавить этот хост или ip в файл .ssh/config, например:

Host (a space separated list of made up aliases you want to use for the host)
    User git
    Hostname (ip or hostname of git server)
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_(the key you want for this repo)
...