Как указать приватный SSH-ключ для выполнения команды shell в Git?
У меня возникла несколько необычная ситуация: я хочу указать приватный SSH-ключ, который будет использоваться при выполнении команды в оболочке (git
) на локальном компьютере.
Скорее всего, это должно выглядеть так:
git clone [email protected]:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"
Или даже лучше (на Ruby):
with_key("/home/christoffer/ssh_keys/theuser") do
sh("git clone [email protected]:TheUser/TheProject.git")
end
Я видел примеры подключения к удаленному серверу с использованием Net::SSH
, где указывается конкретный приватный ключ, но это локальная команда. Возможно ли это?
5 ответ(ов)
Начиная с версии Git 2.3.0 у нас есть простая команда (не требуется файл конфигурации):
GIT_SSH_COMMAND='ssh -i private_key_file -o IdentitiesOnly=yes' git clone user@host:repo.git
Обратите внимание, что опция -o IdentitiesOnly=yes
обязательна, чтобы предотвратить стандартное поведение SSH, которое отправляет файл идентификации, соответствующий имени файла по умолчанию для каждого протокола, как упомянуто в предыдущем ответе.
Другие предложения по настройке ~/.ssh/config
могут показаться излишне сложными. На самом деле, это можно сделать гораздо проще:
Host github.com
IdentityFile ~/.ssh/github_rsa
Таким образом, вы указываете файл с ключом для подключения к GitHub, и больше ничего не нужно. Это позволяет избежать лишних complication'ов и делает настройку более понятной и удобной.
Содержимое моего my_git_ssh_wrapper
:
#!/bin/bash
ssh -i /path/to/ssh/secret/key $1 $2
Теперь вы можете использовать ключ, выполнив следующую команду:
GIT_SSH=my_git_ssh_wrapper git clone [email protected]:TheUser/TheProject.git
Этот скрипт обрабатывает параметры, переданные ему через $1
и $2
, и использует заданный SSH-ключ для подключения. Убедитесь, что путь к вашему секретному SSH-ключу указан корректно.
Проблема возникает, когда у вас есть разные удалённые репозитории на одном хосте (например, на github.com), и вы хотите взаимодействовать с ними, используя разные SSH-ключи (т.е. разные аккаунты GitHub).
Чтобы это сделать, выполните следующие шаги:
Сначала нужно объявить ваши разные ключи в файле
~/.ssh/config
.# Ключ для обычных репозиториев на github.com Host github.com HostName github.com User git IdentityFile ~/.ssh/id_rsa # Ключ для конкретного репозитория на github.com Host XXX HostName github.com User git IdentityFile ~/.ssh/id_other_rsa
Таким образом, вы связываете второй ключ с новым удобным именем "XXX" для github.com.
Затем вам нужно изменить удалённый origin вашего конкретного репозитория, чтобы он использовал дружелюбное имя, которое вы только что определили.
Перейдите в папку вашего локального репозитория в командной строке и отобразите текущий удалённый origin:
>git remote -v origin [email protected]:myuser/myrepo.git (fetch) origin [email protected]:myuser/myrepo.git (push)
Затем измените origin с помощью команды:
>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)
Теперь вы можете выполнять команды push, fetch и другие с правильным ключом автоматически.
Как указано здесь: https://superuser.com/a/912281/607049
Вы можете настроить это для каждого репозитория:
git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
Эта команда устанавливает конкретный SSH-ключ для операций git pull
и git push
в текущем репозитории.
Посчитать количество строк в репозитории Git
Как добавить перенос строки в 'git commit -m' из командной строки?
Как выводить команды оболочки по мере их выполнения
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как использовать 'grep' для непрерывного потока?