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/