it-swarm.com.ru

Как указать закрытый SSH-ключ для использования при выполнении команды Shell в Git?

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

876
Christoffer

Примерно так должно работать (предложено orip):

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git'

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

ssh-agent $(ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git)

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

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

610
Martin v. Löwis

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

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

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

999
HeyWatchThis

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

Host github.com
  IdentityFile ~/.ssh/github_rsa
367
philfreo

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

GIT_SSH_COMMAND='ssh -i private_key_file' git clone [email protected]:repo.git

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

295
Robert Jack Will

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

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

81
Dan Dascalescu

С git 2.10+ (3 квартал 2016 г .: выпущен 2 сентября 2016 г.) у вас есть возможность установить config для GIT_SSH_COMMAND (а не просто переменную окружения, как описано в Робер Джек Уилл 's ответ )

См. совершить 3c8ede3 (26 июня 2016 г.) Нгуен Тхай Нгёк Дуй (pclouds) .
(Объединено с Junio ​​C Hamano - gitster - in commit 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
65
VonC

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

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

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

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

Файл ~/gitwrap.sh

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

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

export GIT_SSH=~/gitwrap.sh
30
Jamie

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

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

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

Многие из этих решений выглядели заманчиво. Тем не менее, я нашел общий подход 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 clone; все это теперь отлично работает в скрипте задания cron, в противном случае возникли проблемы при навигации по ограниченной оболочке. Я также смог вызвать этот скрипт изнутри R и все еще решить ту же самую проблему cron execute (Например, system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")).

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

7
Paul McMurdie

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

git pull

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

id_rsa
id_rsa_other_key

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

eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key

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

# Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "[email protected]"

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

4
cgnorthcutt

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

3
carlsborg

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

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

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

3
cristobal

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

2
AmazingTurtle

В 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 [email protected]:test/test.git' Какой закрытый ключ находится на диске D, проверка папки компьютера. Также, если вы хотите клонировать репозиторий, вы можете изменить git remote add Origin с помощью git clone.

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

Имейте в виду, что закрытый ключ openssh и закрытый ключ PuTTY различны!

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

2
Peyman Mahdavi

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

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

2
rudimeier

Вот ключ взлома ssh, который я нашел, находя решение этой проблемы:

Например, у вас есть 2 разных набора ключей:

key1, key1.pub, key2, key2.pub

Храните эти ключи в своем каталоге .ssh

Теперь добавьте эти команды в свой псевдоним .bashrc или .bash_profile

alias key1='cp ~/.ssh/key1 id_rsa && cp ~/.ssh/key1.pub id_rsa.pub'

alias key2='cp ~/.ssh/key2 id_rsa && cp ~/.ssh/key2.pub id_rsa.pub'

Вуаля! У вас есть ярлык для переключения клавиш в любое время!

Надеюсь, что это работает для вас. 

1
penduDev

для gitlabRSAAuthentication yes 

Host gitlab.com
  RSAAuthentication yes
  IdentityFile ~/.ssh/your_private_key_name
  IdentitiesOnly yes

Док здесь

1
Alupotha

Вам нужно создать ~/.ssh/config, как показано ниже

Host <Your bitbucket server>
User <userid>
Hostname <Your bitbucket server as above>
IdentitiesOnly yes
IdentityFile ~/.ssh/id_rsa<file> This is your private key file

разрешение, как показано ниже

-rw------- $HOME/.ssh/config

Добавьте ваш открытый ключ в ваш git (cat ~/.ssh/id_rsa_pub [или одноименное имя])

а затем мерзавец клон, как показано ниже

git clone ssh://[email protected]/userid/test.git
0
gajanan malvade

Проблема в том, что у вас есть разные удаленные репозитории на одном хосте (скажем, 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  [email protected]:myuser/myrepo.git (fetch)
Origin  [email protected]:myuser/myrepo.git (Push)

Затем измените Origin с помощью:

>git remote set-url Origin [email protected]:myuser/myrepo.git
>git remote -v
Origin  [email protected]:myuser/myrepo.git (fetch)
Origin  [email protected]:myuser/myrepo.git (Push)

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

0
rodo

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

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

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

Затем клонировать, используя название хоста в конфигурации. ("my_synology". чтобы избежать @chopstik "*") 

git clone my_synology:path/to/repo.git
0
w..k

Я использую zsh, и различные ключи автоматически загружаются в ssh-agent моей оболочки zsh для других целей (то есть доступа к удаленным серверам) на моем ноутбуке. Я изменил ответ @ Ника и использую его для одного из моих репозиториев, которое нужно часто обновлять. (В данном случае это моя 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'
  • Spawn ssh-agent
  • Добавить ключ только для чтения к агенту
  • Перейдите в мой каталог git
  • Если cd для репозитория dir успешен, вытащите из удаленного репо
  • Убей порождённого ssh-агента. (Я бы не хотел, чтобы многие агенты задерживались.)
0
sdkks

Если вы похожи на меня, вы можете:

  • Держите ваши ключи SSH организованными

  • Сделайте ваши команды git clone простыми

  • Обрабатывать любое количество ключей для любого количества репозиториев.

  • Сократите ваше обслуживание ключа SSH.

Я храню свои ключи в своем каталоге ~/.ssh/keys.

Я предпочитаю соглашение по конфигурации.

Я думаю, что кодекс - это закон; чем проще, тем лучше.

ШАГ 1 - Создать псевдоним

Добавьте этот псевдоним в свою оболочку: alias git-clone='GIT_SSH=ssh_wrapper git clone'

ШАГ 2 - Создать скрипт

Добавьте этот скрипт ssh_wrapper в вашу переменную PATH:

#!/bin/bash
# Filename: ssh_wrapper

if [ -z ${SSH_KEY} ]; then
    SSH_KEY='github.com/l3x'  # <= Default key
fi
SSH_KEY="~/.ssh/keys/${SSH_KEY}/id_rsa"
ssh -i "${SSH_KEY}" "[email protected]"

ПРИМЕРЫ

Используйте ключ github.com/l3x:

KEY=github.com/l3x git-clone https://github.com/l3x/learn-fp-go

В следующем примере также используется ключ github.com/l3x (по умолчанию):

git-clone https://github.com/l3x/learn-fp-go

Используйте ключ bitbucket.org/lsheehan:

KEY=bitbucket.org/lsheehan git-clone [email protected]:dave_andersen/exchange.git

ЗАМЕТКИ

Измените значение по умолчанию SSH_KEY в скрипте ssh_wrapper на то, что вы используете большую часть времени. Таким образом, вам не нужно использовать переменную KEY большую часть времени.

Вы можете подумать: «Эй! Многое происходит с псевдонимом, скриптом и некоторым каталогом ключей», но для меня это соглашение. Почти все мои рабочие станции (и серверы в этом отношении) настроены одинаково.

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

Мои условные обозначения, например скрипты Bash, псевдонимы и т.д., Создают согласованную среду и помогают мне быть проще.

Поцелуй и имена имеют значение.

Дополнительные советы по дизайну можно найти в Глава 4 SOLID Дизайн в Go из моей книги: https://www.Amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/ дп/B0725B8MYW

Надеюсь, это поможет. - Лекс

0
l3x