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


1110

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



28
Мне интересно, почему это так необычно, что у Git нет такой -iопции, как sshу.
Ник Т

29
С мерзавцем 2.10 (Q3 2016), у вас есть новый конфиг: git config core.sshCommand 'ssh -i private_key_file'. Смотрите мой ответ ниже
VonC

3
По моему мнению, ответ HeyWatchThis должен быть принятым ответом, поскольку он позволяет выполнять все команды git после установки в обычном режиме, а не создавать подоболочку для каждой команды git, как того требует текущий принятый ответ.
Глорифобия

Ответы:


801

Примерно так должно работать (предложено 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.


5
Но это добавит ключ навсегда как принятый SSH-ключ, верно? Я хочу избежать этого, чтобы theuser2 не мог связываться с проектами пользователя. Это для веб-приложения, поэтому нецелесообразно использовать разных пользователей ОС, что было бы лучшим вариантом.
Кристофер

28
Нет, когда git завершает работу, ssh-agent завершается, а ключ забывается.
Мартин против Лёвиса

6
эта команда не работает на Windows Git Bash. В нем говорится синтаксическая ошибка рядом с неожиданным токеном 'ssh-add'
Mohit

116
Фиксированная командная строка (для Windows или Linux) будет выглядеть примерно так:ssh-agent bash -c 'ssh-add sshkey; git clone url'
orip

4
ssh-agent $(..)Синтаксис не работает для меня , и я не знаю , как это предполагают , чтобы работать: (ба) ш должны выполнять команды в $(..)первом, а затем запустить SSH-агент с выходом в качестве параметра.
Йоханнес 'рыба' Ziemke

1201

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

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

Ссылки


17
Я обнаружил, что когда вы указываете несколько ключей с помощью .ssh / config, вам нужно использовать имя друга хоста в строке «Host» как часть команды «git remote add». Если строка "Host stg", то вам нужно использовать git remote, добавить <someName> user @ stg: /path_to_git_repo.git ". Если вы используете точное имя сервера, например user@myserver.com: /path_to_git_repo.git, файл конфигурации git не выбирается. Следовательно, он не выбирает файл закрытого ключа правильно. Я пробовал это, помещая одно и то же содержимое в github и heroku, и работает, только когда вы даете понятное имя в «git remote add»
Gopinath MR

2
Я не был уверен насчет Host для github. Я нашел эту ссылку: gist.github.com/jexchan/2351996 .
Карстен

1
Посмотрите здесь, если вы хотите иметь несколько ключевых файлов для нескольких git-репозиториев
e271p314

1
Вы можете использовать Host remote.server.comи продолжать использовать оригинальный URL
MauganRa

5
Это сработало для меня после двух изменений. Если файл конфигурации новый, не забудьте сделать это chmod 600 ~/.ssh/config(см. Здесь ). И если вы используете GitHub, замените Host gitservс Host github.com, опускает Hostname remote.server.com, и добавить пульт дистанционного управления с git remote add origin git@github.com:user_name/repo_name.git.
Мигельморин

481

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

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

3
Я получил, cannot run ssh -i /home/vagrant/.ssh/git: No such file or directoryхотя это существует 444 Nov 16 18:12 /home/vagrant/.ssh/gitсls -l /home/vagrant/.ssh/git
тед

3
@ted: chmod 400 /home/vagrant/.ssh/git
Yash

8
Хорошее и простое решение. Я предлагаю создать псевдоним, если вам нужно сделать это много.
Лассе Мейер

5
Не забудьте chmod 400 <path-to-private-key-file>. В противном случае команда git может завершиться неудачно без специального сообщения об ошибке ...
Eonil

5
Было бы хорошо, если бы этот ответ также включал, -o IdentitiesOnly=yesчтобы убедиться, что ключ, указанный с помощью, -iбудет использован (в отличие от ключа от агента SSH).
Робинст

423

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

Host github.com
  IdentityFile ~/.ssh/github_rsa

30
Вам IdentitiesOnlyтоже нужна опция.
Flimm

4
@EnzeChi вы можете иметь несколько учетных записей GitHub, манипулируя пультов: git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git. Тогда вы конфиг выглядит какHost personal HostName github.com ... Host corporate HostName github.com
Эмори

@EnzeChi Я делаю нечто подобное, так что я использую 2 разные ssh-клавиши - одну для получения, а другую для нажатия. У выборки нет парольной фразы. Толчок делает.
Эмори

144

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

4
Очень хорошее решение, если у вас есть несколько учетных записей в одном домене, с которыми другие решения не справляются
Beka

1
Хорошее решение. Вы также можете упростить это с помощью> GIT_SSH = my_git_ssh_wrapper; git clone git@github.com: TheUser / TheProject.git
Шива

2
Это решение также охватывает ситуации, когда вы хотите использовать git из учетной записи без домашнего каталога.
piotrekkr

Фантастический. Вы также можете использовать этот способ для частных серверов:GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
тонна

1
Это единственный способ, который работал для меня в среде
Cygwin

113

С мерзавцем 2.10+ (Q3 2016: выпущен сентября 2d, 2016), у вас есть возможность задавать конфигурации для GIT_SSH_COMMAND(и не только переменную окружения , как описано в Робер Джек «s ответ )

См. Коммит 3c8ede3 (26 июня 2016 г.) Нгуена Тхая Нгука Дуй ( pclouds) .
(Слиты Junio C Hamano - 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

Вы даже можете установить его только для одной команды:

git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git

Это проще , чем установки GIT_SSH_COMMANDпеременной окружения, которая, на Windows, а отметил на Mátyás Кути-Kreszács , будет

set "GIT_SSH_COMMAND=ssh -i private_key_file"

@Flimm даты выхода: calendar.google.com/calendar/…
VonC

Это было выпущено.
Flimm

4
Работает. Люди должны считать это лучшим ответом. После выдачи может быть полезно отразить файл .git / config с версией, предварительно скопированной в / tmp. Была создана новая запись: sshCommand = ... Для этого я использовал git config core.sshCommand "ssh -i $ HOME / .ssh / privatekeyfile".
WeakPointer

1
@Spanky Вы можете выполнить встроенную команду, git -c core.sshCommand="ssh -i private_key_file" clone host:repo.gitа затем установить конфигурациюgit config core.sshCommand 'ssh -i private_key_file'
dav_i

1
Это, безусловно, лучший ответ!
Вагнер Патриота

111

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


3
Я вас опроверг, потому что все, что вы говорите, уже отражено в ответах выше, и, на мой взгляд, еще яснее. Например, почему именно вы определяете пользователя для e dandv и workuser, соответственно?
Гроптатыр,

2
Вы ответили на 4-летний вопрос без новой информации, и вы утверждаете, что ваш ответ «лучший способ». Кроме того, вы понизили голосование и изнуряли других пользователей, чтобы убрать их ответ ... просто чтобы подтолкнуть вашего.
rudimeier

@hroptatyr: я использовал dandvи workuserподдержал мой пример, «например, личную учетную запись GitHub и рабочую». dandvмое имя пользователя GitHub
Дан Дакалеску

12
Я думаю, что это лучший ответ, чем @ thamster, хотя бы потому, что он объясняет псевдонимы хоста.
Дэвид Моулз

2
Мне нравится этот ответ. Однако, для меня это работает, только если я добавляю IdentitiesOnly yesв свой конфигурационный файл ssh.
winni2k

75

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

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

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

1
Что делает -F /dev/null? Насколько я вижу, это изменит configFile по ~/.ssh/configумолчанию, но почему это желательно? Для обеспечения изолированной команды?
Доминик

3
linuxcommand.org/man_pages/ssh1.html , не указывает файл конфигурации, поэтому, когда git запустит ssh, файл конфигурации не будет передан (на самом деле это своего рода режим песочницы, просто игнорируйте параметры конфигурации пользователя по умолчанию) Исходный поток в суперпользователе имеет больше информации о -F
Дэвид

1
Тот, который я искал. Спасибо!
lostcitizen

AAAAA + решение для работы в кубер-среде. Спасибо!
Кобра против ниндзя

1
Привет Знаете ли вы, как распространить это на подмодуль?
Арка Права Басу

38

Проблема в том, что у вас есть разные удаленные репозитории на одном хосте (скажем, 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)

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


1
На мой взгляд, это самый «правильный» ответ, где вы организуете соединения и ключи в своем конфигурационном файле ssh, что является наилучшей практикой и поддерживается в течение длительного времени.
Jamescampbell

Другие решения кажутся обходными путями, это отличная возможность, которую поддерживает инструмент.
Craig.C

Круто, именно то, что я искал, спасибо!
magikMaker

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

или

export GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key"
git clone REPO
git push

Этот работал для меня.
mohammed_ayaz

36

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

1
Это полезно, но заставляет вас использовать ключ репо для всего взаимодействия с этим именем хоста. Если на том же сервере есть другие репозитории, которым требуются разные ключи, лучше использовать оболочку и указать git использовать ее с GIT_SSH.
Джо Блок

11
Это не обязательно правда. Я использую несколько ключей для Github - один для работы и один для моей личной учетной записи. Вам не нужно указывать доменное имя для «Host». Вы можете указать любой псевдоним. Например, я использую gh-home и gh-work в качестве своих имен хостов, а когда я клонирую, я использую, например, git clone git@gh-work:repo/project.git в моем ~ / .ssh / config у меня есть два раздела, которые оба используют github.com для HostName. У них просто разные IdentityFile и Host
blockloop

@ brettof86 эта стратегия работает по большей части, но что вы делаете, если проверяемый вами репозиторий зависит от гема, который также размещен на github? Ссылка на репозиторий github в Gemfile не будет содержать ваш «псевдоним», ну, разве что, если вы не хотите что-то сломать для других разработчиков проекта ...
ktec

@ brettof86 У меня также есть две разные учетные записи github (работа, дом), но я не могу заставить пример работать на меня. Можете ли вы опубликовать образец с двумя?
Climbs_lika_Spyder

@Climbs_lika_Spyder вот что на моем ~/.ssh/config pastebin.com/8rYn7yCi
blockloop

32

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

Файл ~ / gitwrap.sh

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

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

export GIT_SSH=~/gitwrap.sh

Я установил это на .bashrc. Но когда я вхожу в экземпляр openshift, он, кажется, не вызывает его. Я что-то пропустил ?
Джигар Шах

Он завершается с ошибкой для меня .. он не может найти событие сценария, хотя он там .. не уверен, что происходит ... ошибка: не может запустить /tmp/gitwrap.sh: нет такого файла или каталога
ap1234

Если вы столкнулись с ошибкой «Нет такого файла или каталога», укажите полный путь gitwrap.sh, например,/home/ubuntu/gitwrap.sh
Тахир Ахтар

Вы можете добавить -o StrictHostKeyChecking=noв команду ssh
dan-man

12

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

git pull

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

id_rsa
id_rsa_other_key

тогда внутри git repo попробуйте:

# Run these commands INSIDE your git directory
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 "mona.lisa@email.com"

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


Обратите внимание, если вы получите Could not open a connection to your authentication agent., попробуйте $ eval `ssh-agent -s`и попробуйте снова.
Cgnorthcutt

1
Для тех, кто потерян, ssh-addкомандная уловка сработала для меня. Добавьте ключ идентификации в список тех, которые проверяются при аутентификации ssh. Это сработало для меня хорошо!
Бен Картрайт

Как вы думаете, почему это важно, в каком каталоге вы работаете ssh-add?
трипл

@BenCartwright Потому что вы изменяете локальные настройки, а не глобальные настройки. Этот подход изменяет .gitвнутри репо, а не программы git глобально. Вы можете использовать, --globalчтобы установить глобальное имя пользователя и адрес электронной почты.
cgnorthcutt

11

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

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

Также можно оставить всю строку «Host *».
Лионелло

1
Вероятно, он не работал, потому что он не соответствовал вашему удаленному URL. Если вы хотите использовать Host my-host-alias, вы должны установить remote.origin.url=git@my-host-alias:[username]/[repo].git.
Дэвид Моулз

11

Многие из этих решений выглядели заманчиво. Тем не менее, я нашел общий подход 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 :-)


1
Выглядит здорово! Я проверю это и отвечу обратно.
BlueBird

3
Помимо синтаксиса, как это лучше, чем GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone thatuser@myserver.com:/git/repo.gitсогласно ответу Роберта Джека Уилла ?
Дэвид Моулз

6

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

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

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


Позже выяснилось, что вы также можете установить свойства ControlMaster autoи ControlPersist yes, так что вам не нужно каждый раз вводить пароль заново. Нашел информацию в этой статье
CRISTOBAL

3

Вам нужно создать ~ / .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://blahblah@blah.com/userid/test.git

3

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

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

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


1
Большое спасибо, потратил так много времени, пытаясь выяснить, почему git не использует ключ ssh. Я не понимаю, почему GitHub дает https URL-адрес по умолчанию в кнопке клона.
Чакрадар Раджу

2

В 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!


1

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

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


1

Я использую 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'
  • Спаун ssh-агент
  • Добавить ключ только для чтения к агенту
  • Перейдите в мой каталог git
  • Если cdрепо прошло успешно, вытащите из удаленного репо
  • Убей порожденного ssh-агента. (Я бы не хотел, чтобы многие агенты задерживались.)



1

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

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

Если вы хотите использовать это для синхронизации репо по расписанию, вам нужно добавить «&& 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 завершит процесс, когда он будет завершен.


0

Если номер порта 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

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

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

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

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

  • Сократите обслуживание ssh-ключей.

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

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

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

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

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

ШАГ 2 - Создание сценария

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

#!/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}" "$@"

ПРИМЕРЫ

Используйте ключ 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 git@bitbucket.org:dave_andersen/exchange.git

НОТЫ

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

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

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

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

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

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

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




-1

Вот ключ взлома 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'

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.