git - keygen - Укажите личный SSH-ключ для использования при выполнении команды оболочки?




ssh-keygen windows (12)

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


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

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

Будьте осведомлены о том, что opensh закрывает секретный ключ и секретный ключ шпатлевки!

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


Вы можете использовать переменную среды GIT_SSH. Но вам нужно будет обернуть ssh и опции в сценарий оболочки.

См. Руководство git: man git в командной оболочке.


Если номер порта SSH не равен 22 (по умолчанию), добавьте Port xx в ~/.ssh/config

В моем случае (синология),

Host my_synology
    Hostname xxxx.synology.me
    IdentityFile ~/.ssh/id_rsa_xxxx
    User myname
    Port xx

Затем выполните клонирование с использованием заголовка узла в config. («my_synology», чтобы избежать @chopstik «*»)

git clone my_synology:path/to/repo.git

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

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

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

Лучше всего добавить этот хост или 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-wrapping-script по следующей ссылке наиболее полезным:

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

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

git -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git

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

git.sh -i ~/.ssh/thatuserkey.pem clone [email protected]:/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 \[email protected]" > /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 "[email protected]"

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

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


Ни одно из этих решений не работало для меня.

Вместо этого я подробно расскажу об упоминании @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 [email protected]:myrepo.git

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

git push -v origin master

ЗАМЕТКИ

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

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


Подводя итог ответам и comments , лучший способ настроить 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 [email protected]:company/project.git .


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

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


Я использую zsh и разные ключи загружаются в ssh-agent моей zsh-оболочки автоматически для других целей (т.е. доступа к удаленным серверам) на моем ноутбуке. Я изменил ответ @ Nick, и я использую его для одного из моих репозиций, которые нужно часто обновлять. (В этом случае это мои dotfiles которые я хочу получить самую последнюю версию на всех моих машинах, где бы я ни работал).

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
  • Инициировать ssh-agent
  • Добавить ключ только для чтения к агенту
  • Измените каталог на мой git repo
  • Если cd to repo dir будет успешным, извлеките из удаленного репо
  • Убейте порожденного ssh-агента. (Я бы не хотел, чтобы многие агенты задерживались.)

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

Файл ~ / gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "[email protected]"

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

export GIT_SSH=~/gitwrap.sh






ssh