Як вказати приватний ключ SSH, який слід використовувати при виконанні команди оболонки на Git?


1108

Можливо, досить незвична ситуація, але я хочу вказати приватний ключ 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, як вимагає поточна прийнята відповідь.
глоріфобія

Відповіді:


797

Щось подібне повинно працювати (запропоновано 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; це може містити ідентифікатор.pub, або конфігураційний файл, що встановлює IdentityFile.


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

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

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-агент з виходом в якості параметра.
Йоханнес "риба" Зімке

1199

Жодне з цих рішень не працювало для мене.

Натомість я детально розповідаю про згадку @Martin проти Левіса про встановлення 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 add <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
Я не був впевнений у хості для 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.
мігельморін

479

Починаючи з 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
Ted

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

8
Приємне і просте рішення. Я пропоную створити псевдонім, якщо вам потрібно це зробити багато.
Lasse Meyer

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

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

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
emory

@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 з облікового запису без домашнього каталогу.
піотреккр

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

1
Це єдиний спосіб, який працював на мене в середовищі cygwin
ChatterOne

113

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

Див. Команду 3c8ede3 (26 червня 2016 р.) Від Nguyễn Thái Ngọc Duy ( 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

Ви навіть можете встановити його лише для однієї команди:

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

Його випустили.
Флім

4
Працює. Люди вважають це найкращою відповіддю. Після випуску можна відрізняти .git / config файл із попередньо скопійованою версією в / tmp. Створено новий запис: sshCommand = ... Для чого це варто, я використав 'git config core.sshCommand "ssh -i $ HOME / .ssh / privatekeyfile".
WeakPointer

1
@Spanky Ви можете виконати команду inline, 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
Це, безумовно, найкраща відповідь!
Вагнер Патріота

110

Підводячи підсумки відповідей та коментарів , найкращий спосіб налаштувати 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?
hroptatyr

2
Ви відповіли на 4-річне запитання, не маючи нової інформації, і ви стверджуєте, що ваша відповідь - "найкращий спосіб". Більше того, ви спонукали інших людей до видалення їхньої відповіді ...
rudimeier

@hroptatyr: Я використовував dandvі workuserпідтримую свій приклад, "наприклад, особистий обліковий запис GitHub та робочий". dandvце моє ім’я користувача GitHub.
Дан Даскалеску

12
Я думаю, що це краща відповідь, ніж @ thamster's, хоча б тому, що він пояснює псевдоніми хоста.
Девід Молес

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
David

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 config, який є найкращою практикою та підтримується довгостроково.
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 - один для роботи та один для мого особистого рахунку. Не потрібно вводити доменне ім’я для "Хост". Ви можете розмістити будь-який псевдонім, який хочете. Наприклад, я використовую 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. Але коли я входжу в екземпляр openhift, здається, це не викликає. Я щось пропускаю?
Jigar Shah

Він не вдається з помилкою для мене .. його не вдалося знайти події сценарію, хоча його немає .. не впевнений, що відбувається ... помилка: не вдається запустити /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

а також переконайтесь, що ваше ім’я користувача та користувальницький пароль за замовчуванням правильне:

# 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), установка хоста , як *в ~/.ssh/configпрацював для мене, будь-який інший хост (наприклад, «GitHub» або «гб») не працює.

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

Можна також залишити всю лінію "Хост *".
Ліонелло,

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

Рішення Елвіна полягає у використанні чітко визначеного скрипту, який заповнює цей розрив:

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, щоб вам не потрібно було повторно вводити пароль щоразу. Знайшов інформацію в цій статті
кристобал

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 як нижче

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, він попросить вас пройти фразу!

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

Якщо ви створили свої ключі за допомогою puttygen, ви повинні перетворити свій приватний ключ у openssh!


1

Ви можете використовувати змінну середовища GIT_SSH. Але вам потрібно буде загорнути ssh та параметри в сценарій оболонки.

Дивіться посібник з git: man gitу вашій командній оболонці.


1

Я використовую, zshа різні ключі завантажуються в оболонку zsh ssh-agentавтоматично для інших цілей (тобто доступу до віддалених серверів) на моєму ноутбуці. Я змінив відповідь @ Ніка і використовую її для однієї з моїх репостів, яку потрібно часто оновлювати. (У цьому випадку це моя, 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 repo
  • Якщо cd репортаж вдався, витягніть з віддаленого репо
  • Вбивство породив ssh-агент. (Я не хотів би, щоб багато агентів затримувались навколо.)



0

Якщо номер порту 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

0

Якщо ти схожий на мене, ти можеш:

  • Організуйте свої 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}" "$@"

ПРИКЛАДИ

Використовуйте ключ 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 більшу частину часу.

Ви можете подумати: "Гей! Це багато чого відбувається з псевдонімом, сценарієм і деяким каталогом ключів", але для мене це умовність. Майже всі мої робочі станції (і сервери з цього приводу) налаштовані аналогічно.

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

Мої конвенції, наприклад, сценарії Баша, псевдоніми тощо, створюють послідовне середовище і допомагають мені робити прості речі.

KISS та назви мають значення.

Щоб отримати додаткові поради щодо дизайну, перегляньте Розділ 4 SOLID Design у моїй книзі: https://www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW

Сподіваюся, що це допомагає. - Лекс



0

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

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

Якщо ви хочете використовувати це для syncig repo за розкладом, вам потрібно додати "&& 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

Мені просто потрібно було додати ключ, а потім знову запустити git-клон.

ssh-add ~/.ssh/id_rsa_mynewkey
git clone git@bitbucket.org:mycompany/myrepo.git

-1

Ось злом ключа ключа ssh, який я знайшов, шукаючи рішення цієї проблеми:

Наприклад, у вас є два різних клавіші:

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.