How to specify the private SSH-key to use when executing shell command on Git?

Возможно, это довольно необычная ситуация, но я хочу указать закрытый 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, который использует указанный закрытый ключ, но это локальная команда. Является ли это возможным?

42 ответа

Решение

Нечто подобное должно работать (предложено 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.

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

Вместо этого я уточняю упоминание @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 без этой опции.

Рекомендации

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

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

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

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

Host github.com
  IdentityFile ~/.ssh/github_rsa

С git 2.10+ (3 квартал 2016 г.: выпущен 2 сентября 2016 г.) у вас есть возможность установить конфигурацию для GIT_SSH_COMMAND (а не просто переменная окружения, как описано в ответе Robert Jack Will)

Смотрите коммит 3c8ede3 (26 июня 2016 г.) Нгуен Тхай Нгук Дуй ( pclouds )
(Объединено Юнио С Хамано - gitster - в коммите dc21164, 19 июля 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

Содержимое 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

Чтобы суммировать ответы и комментарии, лучший способ настроить 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,

Проблема в том, что у вас есть разные удаленные репозитории на одном хосте (скажем, github.com), и вы хотите взаимодействовать с ними, используя разные ключи ssh (то есть разные учетные записи GitHub).

Для этого:

1) Сначала вы должны объявить разные ключи в файле ~/.ssh/config.

# Key for usual repositories on github.com
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa

# Key for a particular repository on github.com
Host XXX
HostName github.com
User git
IdentityFile ~/.ssh/id_other_rsa

Этим вы связываете второй ключ с новым понятным именем "XXX" для github.com.

2) Затем вы должны изменить удаленный источник вашего конкретного репозитория, чтобы он использовал понятное имя, которое вы определили.

Перейдите в папку локального хранилища в командной строке и отобразите текущий удаленный источник:

>git remote -v
origin  git@github.com:myuser/myrepo.git (fetch)
origin  git@github.com:myuser/myrepo.git (push)

Затем измените происхождение с помощью:

>git remote set-url origin git@XXX:myuser/myrepo.git
>git remote -v
origin  git@XXX:myuser/myrepo.git (fetch)
origin  git@XXX:myuser/myrepo.git (push)

Теперь вы можете нажать, выбрать... с правой кнопкой автоматически.

Как указано здесь: /questions/24437728/iis7-dobavit-novyij-veb-sajt-zagolovok-uzla-veb-formyi-aspnet/24437733#24437733

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

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push

The fastest and simplest way of doing it is by:

Clone your repo with ssh:

git -c core.sshCommand="ssh -i ~/.ssh/<your_key>" clone git@github.com:<user>/<repo>.git

then cd into you cloned repo and:

git config core.sshCommand 'ssh -i ~/.ssh/<your_key>'

To test it's working:

git --git-dir=/path/to/repo/.git pull

So you may wonder: why my created ssh key does not work after I planted the .pub in github and the private is in the default directory?

The documentation gives us a command that clarifies the issue: ssh -vT git@github.com

The output shows a list of ssh keys names git looks for. So, you may want to create your key with one of those names, or use the above process to include the one you need.

GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo

Лучше добавить этот хост или 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)

Начиная с Git версии 2.10.0, вы можете настроить это для каждого репо или глобально.

      git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -o 'IdentitiesOnly yes'"

Это укажет для текущего репо, какой ключ ssh будет использовать. Я предполагаю, что если вы хотите указать этот глобальный параметр, нужно только установить вариант.

Эта команда клонирует репозиторий и настраивает ключ SSH для постоянного использования:

      git clone -c "core.sshCommand=ssh -i ~/.ssh/<key>" git@github.com:<user>/<repo>.git

Теперь, если вы запуститеgit fetch,git pull, илиgit push, он будет использовать ключ SSH, настроенный вcore.sshCommand(сохранено в.git/config).

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

Файл ~/gitwrap.sh

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

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

export GIT_SSH=~/gitwrap.sh

2021. Если у вас Mac.

Допустим, у вас есть сервер ubuntu на aws, к которому вы обычно подключаетесь следующим образом:

      % ssh -i blah/yourkeypair.pem ubuntu@test.fattie.com

В терминале просто

      % export GIT_SSH_COMMAND="ssh -i /Users/fattie/Desktop/blah/yourkeypair.pem"

После того, как вы это сделали. Тогда вы можете свободно ...

      % git clone ubuntu@test.fattie.com:/home/ubuntu/teste.git  

Это клонирует репо на вашем сервере в вашу локальную папку "teste",

затем вы можете свободно, когда в teste / выполнять обычные команды, такие как ...

      % git push origin master

и так далее.

-

Также обратите внимание: /questions/24906637/git-oshibka-udalennaya-raspakovka-ne-udalas-nevozmozhno-sozdat-katalog-vremennyih-obektov-pri-sozdanii-novoj-vetki/57402845#57402845


Что касается сервера, похоже, вы в основном

      ] git clone --bare the-actual-folder teste.git

а затем в teste.git

      ] git init --bare --shared

Если ни одно из других решений здесь не работает для вас, и вы создали несколько ssh-ключей, но по-прежнему не можете делать простые вещи, такие как

git pull

тогда предположим, что у вас есть два файла ключей ssh, таких как

id_rsa
id_rsa_other_key

затем внутри git-репо, с которым вы боретесь (перейдите туда), попробуйте:

ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key

а также убедитесь, что ваше имя пользователя и ID пользователя по умолчанию на github правильны:

git config user.name "Mona Lisa"
git config user.email "mona.lisa@email.com"

См. https://gist.github.com/jexchan/2351996 для получения дополнительной информации.

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

ssh-add ~/.ssh/id_rsa_mynewkey
git clone git@bitbucket.org:mycompany/myrepo.git

Многие из этих решений выглядели заманчиво. Тем не менее, я нашел общий подход git-wrapping-script по следующей ссылке наиболее полезным:

Как указать файл ключа ssh с помощью git команда

Дело в том, что нет git такая команда как:

git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

Решение Элвина заключается в использовании четко определенного сценария bash-wrapper, который заполняет этот пробел:

git.sh -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

куда git.sh является:

#!/bin/bash

# The MIT License (MIT)
# Copyright (c) 2013 Alvin Abad
# https://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command

if [ $# -eq 0 ]; then
    echo "Git wrapper script that can specify an ssh-key file
Usage:
    git.sh -i ssh-key-file git-command
    "
    exit 1
fi

# remove temporary file on exit
trap 'rm -f /tmp/.git_ssh.$$' 0

if [ "$1" = "-i" ]; then
    SSH_KEY=$2; shift; shift
    echo "ssh -i $SSH_KEY \$@" > /tmp/.git_ssh.$$
    chmod +x /tmp/.git_ssh.$$
    export GIT_SSH=/tmp/.git_ssh.$$
fi

# in case the git command is repeated
[ "$1" = "git" ] && shift

# Run the git command
git "$@"

Я могу убедиться, что это решило проблему, с которой я столкнулся при распознавании пользователя / ключа для удаленного репозитория Bitbucket с git remote update, git pull, а также git clone; все из которых теперь отлично работают в cron сценарий задания, в противном случае возникли проблемы с навигацией по ограниченной оболочке. Я также был в состоянии вызвать этот скрипт изнутри R и до сих пор решить ту же самую cron выполнить задачу (например, system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")).

Не то чтобы R такой же, как Ruby, но если R может это сделать... O:-)

Много хороших ответов, но некоторые из них предполагают предварительные знания администрации.

Я думаю, что важно четко подчеркнуть, что если вы начали свой проект с клонирования веб-URL-https://github.com/<user-name>/<project-name>.git
то вам необходимо убедиться, чтоurl стоимость ниже[remote "origin"] в .git/config был изменен на URL-адрес SSH (см. блок кода ниже).

Кроме того, убедитесь, что вы добавили sshCommmand как указано ниже:

user@workstation:~/workspace/project-name/.git$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    sshCommand = ssh -i ~/location-of/.ssh/private_key -F /dev/null <--Check that this command exist
[remote "origin"]
    url = git@github.com:<user-name>/<project-name>.git  <-- Make sure its the SSH URL and not the WEB URL
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

Подробнее об этом читайте здесь.

Когда нужно подключиться к github с обычным запросом (git pull origin master), установив Хост как * в ~/.ssh/config работал для меня, любой другой Host (скажем, "github" или "gb") не работал.

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx

Почему бы вам просто не добавить местоположение ключа идентификации в файл конфигурации git для конкретного репо, например:

      cd .git

vi config

[core]
    sshcommand = ssh -i <IDENTITY_KEY_LOCATION>

Это все, что вам нужно.

Если на вашем пути есть каталог, в котором вы хотите подписать данный файл идентификации, вы можете указать, чтобы использовать определенный файл идентификации через файл.ssh/config, установив ControlPath например:

host github.com
  ControlPath ~/Projects/work/**
  HostName github.com
  IdentityFile ~/.ssh/id_work
  User git

затем ssh будет использовать указанный файл идентификации при выполнении команд git по заданному рабочему пути.

В Windows с Git Bash вы можете использовать следующее для добавления репозиторияssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"'например: ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git' Какой закрытый ключ находится на диске D, папка проверки компьютера. Также, если вы хотите клонировать репозиторий, вы можете изменить git remote add origin с git clone,

После ввода этого в Git Bash, он попросит вас ввести пароль!

Знайте, что закрытый ключ openssh и закрытый ключ putty различны!

Если вы создали свои ключи с помощью puttygen, вы должны преобразовать свой закрытый ключ в openssh!

Большинство ответов, приведенных здесь, не объясняют деталей для самого простого использования.

После настройки сервера (в данном случае linux server) в облаке, вы подключаетесь к нему с помощью ssh из терминала.

Со своего компьютера добавьте закрытый ключ dyson-ubuntu-vm.pemкоторый предоставляется вам вашим поставщиком облачных услуг, таким как Azure, AWS и т. д., в вашу конфигурацию .ssh на вашем локальном компьютере. Скопируйте .pem файл в /home/ssenyonjo/.ssh папку, затем откройте /home/ssenyonjo/.ssh/config файл и добавьте следующую запись:

      Host 20.85.213.44
  HostName 20.85.213.44
  User Dyson
  IdentityFile /home/ssenyonjo/.ssh/dyson-ubuntu-vm.pem
  IdentitiesOnly yes

Теперь с вашего терминала зайдите на облачный Linux-сервер следующим образом:

      ssh Dyson@20.85.213.44

Когда это сработает, создайте проект git на облачном сервере следующим образом:

      Dyson@dyson-ubuntu-vm:~/projects$ git init s2

Теперь вернитесь на свой локальный компьютер и клонируйте этот пустой репозиторий следующим образом:

      ssenyonjo@ssenyonjo-pc:~/Projects/mastering-git/rsgilbert2/ssh$ git clone ssh://Dyson@20.85.213.44/home/Dyson/projects/s2

Если вы видите ошибку, которая выглядит примерно так: fatal: Could not read from remote repository, Это означает, что вы обращаетесь не к той папке. Убедитесь, что вы указали правильный путь от корня до созданного репозитория.

Проблема этого метода в том, что, по крайней мере, при запуске bash.exe в Windows, он каждый раз будет создавать новый процесс, который останется бездействующим.

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

Если вы хотите использовать это для репозитория syncig по расписанию, вам нужно добавить в конце "&& ssh-agent -k".

Что-то типа:

ssh-agent bash -c 'ssh-add C:/Users/user/.ssh/your_key; git -C "C:\Path\to\your\repo" pull && ssh-agent -k' 

ssh-agent -k завершит процесс, когда это будет сделано.

Кроме того, как простой «обходной путь», если он вам не так часто нужен:

Удалить все удостоверения ssh

      ssh-add -D

Повторно добавьте тот, с которым вам нужно работать

      ssh-add ~/.ssh/MyProperProfile

Делай гадов

Необязательно - вернуться, добавив другие удостоверения (или все).

Чтобы переменная среды GIT_SSH_COMMAND работала под Windows вместо:

set GIT_SSH_COMMAND="ssh -i private_key_file"

Использование:

set "GIT_SSH_COMMAND=ssh -i private_key_file"

Цитата должна быть похожей

set "variable=value" 

Некоторая предыстория: /questions/31489253/kak-ustanovit-peremennyie-sredyi-s-probelami/31489262#31489262

Клонировать одной командой

      git -c core.sshCommand='ssh -i /path/to/key/' clone git@github.com:your_repository.git /path/target/clone --branch git_branch_name

Уловка для меня заключалась в том, чтобы использовать git@hostname вместо http://hostname/

Другие вопросы по тегам