Як сказати git, який приватний ключ використовувати?


646

sshмає -iможливість вказати, який файл приватного ключа використовувати для автентифікації:

-i identity_file

    Вибирає файл, з якого зчитується ідентифікація (приватний ключ) для аутентифікації RSA або DSA. За замовчуванням ~/.ssh/identityдля протоколу версії 1 ~/.ssh/id_rsaта ~/.ssh/id_dsaдля протоколу версії 2. Файли ідентифікаційних файлів також можуть бути вказані на основі хоста у файлі конфігурації. Можливо мати декілька -iваріантів (і декілька ідентичностей, вказаних у файлах конфігурації).

Чи існує подібний спосіб сказати, gitякий файл приватного ключа використовувати в системі з кількома приватними ключами в ~/.sshкаталозі?



Відповіді:


671

В ~/.ssh/config, додайте:

host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github
 User git

Тепер ви можете зробити git clone git@github.com:username/repo.git.

ПРИМІТКА. Переконайтеся, що дозволи на IdentityFile дорівнюють 400. SSH, не чітко чітко відхиляючи ключі SSH, занадто читабельні. Це буде виглядати як відхилення довіри. У цьому випадку рішення:

chmod 400 ~/.ssh/id_rsa_github

117
Що робити, якщо вам потрібно підключитися до одного і того ж хоста за допомогою різних клавіш?
Валентин Клінгеммер

6
@Quelltextfabrik - ви можете додати ще один розділ з іншим хостом: nerderati.com/2011/03/…
Ben Challenor

1
@Cliff Nop, на моїй сторінці: " HostName: Вказує справжнє ім'я хоста для входу. Це можна використовувати для визначення псевдонімів або скорочень для хостів." Моя версія ssh є openssh-6.7p1.
Гриссіома

11
Якщо конфігураційний файл новий, не забудьте зробити цеchmod 600 ~/.ssh/config
elysch

2
@ValentinKlinghammer відповідь від @Flimm має рішення для цього питання. Це використовувати core.sshCommandконфігурацію git. superuser.com/a/912281/162466
VasyaNovikov

345

Змінна середовище GIT_SSH_COMMAND:

З Git версії 2.3.0 ви можете використовувати змінну середовища GIT_SSH_COMMANDтак:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example

Зауважте, що -iіноді ваш конфігураційний файл може бути замінений, і в цьому випадку вам слід надати SSH порожній конфігураційний файл, наприклад, такий:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example

Конфігурація core.sshCommand:

З Git версії 2.10.0 ви можете налаштувати це за репо або глобально, тому більше не потрібно встановлювати змінну середовища!

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

1
Мені довелося експортувати змінну оболонки до змінної середовища, щоб зробити цю роботу, тобто export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example"тодіgit clone example
Абдул

7
@Abdull У Bash, виконуючи завдання в тому ж рядку, що й команда, експортує змінну середовища для саме цієї команди. Спробуйте: example=hello /usr/bin/env | grep example.
Flimm

3
речі стали ще краще: на Git 2.10, ви можете зберегти команду в конфігурації Git: stackoverflow.com/a/38474220/520162
Екес

2
@Noitidart /dev/null- лише дійсне ім'я файлу в UNIX-подібних операційних системах, воно не працює в Windows.
Flimm

2
Для мене GIT_SSH_COMMANDне працював , поки я не використовував IdentitiesOnly, наприклад, командою: GIT_SSH_COMMAND="ssh -i ~/.ssh/mysubdir/id_rsa -o 'IdentitiesOnly yes'" git push.
Тайлер Коллер

111

Там немає ні прямого способу сказати , gitякий секретний ключ використовувати, тому що вона спирається на sshдля аутентифікації в сховище. Однак є кілька способів досягти своєї мети:

Варіант 1: ssh-agent

Ви можете використовувати ssh-agentдля тимчасового авторизації приватного ключа.

Наприклад:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

Варіант 2: GIT_SSH_COMMAND

Передайте ssh аргументи, використовуючи GIT_SSH_COMMANDзмінну оточення (Git 2.3.0+).

Наприклад:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

Ви можете ввести все це в одному рядку - ігноруйте $і не залишайте \.

Варіант 3: GIT_SSH

Передайте ssh аргументи, використовуючи GIT_SSHзмінну оточення, щоб вказати альтернативну sshбінарну.

Наприклад:

$ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH='./ssh' git clone user@host

Примітка. Наведені вище рядки є командними рядками оболонки (терміналу), які слід вставити у свій термінал. Вони створять файл з ім’ям ssh, зроблять його виконуваним та (опосередковано) його виконають.

Примітка: GIT_SSHдоступний з v0.99.4 (2005).

Варіант 4: ~/.ssh/config

Використовуйте ~/.ssh/configфайл, як пропонується в інших відповідях, щоб вказати місце вашого приватного ключа, наприклад

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa

1
//, Що робити, якщо ваша особистість у ssh-агенті передається, як і в цьому питанні? superuser.com/questions/971732/…
Натан Басанес

1
Я дозволив мені переформатувати цю посаду: ІМО - це, безумовно, найбільш вичерпна відповідь. У своєму оригінальному дизайні швидке сканування запропонувало повідомлення, де описано єдине складне рішення проблеми, тому я пропустив його.
Альберто

3
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'працював на мене, коли нічого іншого не хотів би. Кудос.
Даніель Девхерст

1
Мені довелося скористатися ~/.ssh/configметодом, env vars для мене не працював ...
Грег Дубіцький

1
GIT_SSHдоступний з v0.99.4 (серпень 2005 р.) , в основному з часу існування Git (квітень 2005 р.).
Домінік

32

Напишіть сценарій, який викликає sshпотрібні аргументи, і введіть ім'я файлу сценарію $GIT_SSH. Або просто помістіть свою конфігурацію ~/.ssh/config.


2
Ще одне пояснення, як це зробити.
Сітсу

1
~/.ssh/configЄ шлях.
hek2mgl

Я працюю на машині (A), з якої я натискаю на сервер (B), який приймає лише автентифікацію ключа ssh. Хоча моє налаштування ~ / .ssh / config увімкнено (A) працює прекрасно, коли я працюю безпосередньо на цій машині, це не відбувається, коли я входжу з іншого місця (C). Використання $GIT_SSHта сценарій вирішили цю проблему. Дякую!
bsumirak

18

Якщо вам не потрібно вказувати змінні середовища щоразу, коли ви запускаєте git, не хочете іншого скрипта обгортки, не / не можете запускати ssh-agent (1), а також не хочете завантажувати інший пакет саме для цього, використовуйте git -ремот-ext (1) зовнішній транспорт:

$ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
Cloning into 'repository'
(...)
$ cd repository
$ git remote -v
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (push)

Я вважаю це рішення вищим, оскільки:

  • Це сховище / віддалений
  • Уникайте роздуття сценарію обгортки
  • Не потрібен агент SSH - корисний, якщо ви хочете без нагляду клонів / push / тягне (наприклад, в cron)
  • Однозначно, не потрібен зовнішній інструмент

2
Ця відповідь була саме тим, що мені потрібно було змусити gitресурс Chef використовувати специфічні для репозиторія ключі розгортання для клонування / отримання з приватних сховищ Github. Додатковою перевагою цього методу перед середовищем / сценарієм є те, що оскільки ключ-шлях кодується в конфігурації робочого репо, він буде використовувати один і той же ключ як для початкового клонування, так і для наступних вилучень / натискань.
Адам Франко

2
ОЦЕ ТАК! Це просто чудово, про це не знали. Дякуємо за відповідь, що дуже корисно і в лялькових умовах, щоб не допустити зайвих клопотів в управлінні .ssh/configтощо. +1!
gf_

1
Це рішення не працює разом із --рекурсивним прапором. Підмодулі не дістаються за допомогою вказаного ключа і для цього виходять з ладу, якщо їм потрібна автентифікація.
Даніеле Теста

1
Кожен підмодуль - це зовсім інше сховище зі своїм набором віддалених. Вони склеюються Git для вашої зручності, але жодним чином пульти для підмодуля не прив’язуються до тих, що знаходяться в батьківському сховищі. Я боюся, що ви повинні встановити пульт, використовуючи extтранспорт у кожному підмодулі для рекурсії у батьків для роботи.
flaviovs

2
Якщо ви зіткнулися з наступною помилкою fatal: transport 'ext' not allowed, вам доведеться додати білий список протоколу через export GIT_ALLOW_PROTOCOL=ext. В основному, віддалений помічник git-remote-ext (який підтримує URL-адреси "ext :: ssh example.com% S foo / repo") дозволяє виконувати довільну команду. Зазвичай це не викликає занепокоєння, оскільки користувач завжди бачить та довіряє URL-адресу, яку він передає git. Однак підмодулі git через файл .gitmodules дозволяють зловмиснику просити клієнта отримати довільні URL-адреси git. hackerone.com/reports/104465
Гоміно

18

Використовуйте власну конфігурацію хоста ~/.ssh/config, наприклад:

Host gitlab-as-thuc  
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.thuc
    IdentitiesOnly yes

тоді використовуйте власне ім’я хоста так:

git remote add thuc git@gitlab-as-thuc:your-repo.git  

2
Цю відповідь я шукав, оскільки у мене є окремі облікові записи GitHub для дому та роботи. Я просто повинен був встановити Host work.github.com HostName github.com IdentityFile ~/.ssh/work, а потім замінити "github.com" на "work.github.com" кожного разу, коли я клонував робоче сховище. Він все ще підключається до "github.com", але використовує пару ключів за замовчуванням.
Міккель

1
URL-адреса для деталей (" itblog.study.land / ..." ) більше не працює :(
Карл Смотрич

@CarlSmotricz оригінал був перенесений сюди: medium.com/@thucnc/…
thucnguyen

4
ОКОНЧНО !!! Ця відповідь фактично показує, як ви можете використовувати те, що ви помістили у ~/.ssh/configфайл. У будь-якій іншій відповіді пропущено те, як можна встановити хост, коли ви додаєте джерело, що автоматично дозволяє git використовувати правильний файл ключа. СПАСИБІ!!
BrianVPS

1
Приємно, на це я дивився :)
Лукас Д'Авіла

15

Після своєї боротьби $GIT_SSHя хотів би поділитися тим, що працювало на мене.

Через мої приклади я припускаю, що у вас є ваш приватний ключ/home/user/.ssh/jenkins

Помилка уникнення: значення GIT_SSH включає параметри

$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"

або щось подібне не вдасться, оскільки git намагатиметься виконати значення у вигляді файлу . З цієї причини вам доведеться створити сценарій.

Робочий приклад сценарію $ GIT_SSH /home/user/gssh.sh

Сценарій буде викликаний наступним чином:

$ $GIT_SSH [username@]host [-p <port>] <command>

Приклад роботи сценарію може виглядати так:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins $*

Зверніть увагу $*на кінець, це важлива його частина.

Навіть більш безпечною альтернативою, яка б запобігла можливому конфлікту з будь-чим у конфігураційному файлі за замовчуванням (плюс явне згадування про порт, який слід використовувати), було б:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins -F /dev/null -p 22 $*

Припускаючи, що сценарій увімкнено /home/user/gssh.sh, ви повинні:

$ export GIT_SSH=/home/user/gssh.sh

і все працюватиме.


Дякую. Лише зауважте: використовуйте "$ @" замість $ * для аргументів проходження через, оскільки перший поводиться правильно, коли аргументи містять пробіл.
Piotr Findeisen

@PiotrFindeisen Дякуємо за вашу замітку. Однак я не розумію це повністю - в zsh це допомагає мені тримати рядки з пробілом в одному шматку, а в bash - ні. Чи можете ви мені більше сказати чи вказати на якесь пояснення? Я не хочу сліпо додавати деякі зміни.
Ян Вльчинський

Ви повинні видалити першу половину своєї відповіді. Ніхто не зацікавлений у рішенні, яке не працює, і даремно прочитання, яке обмацує правильну відповідь внизу, що чудово працює.
Серін

@Cerin Якщо ви маєте на увазі видалити "Помилка, щоб уникнути", я збираюся зберегти її там. Він має загальну проблему, яку слід уникати, і це дуже коротко. Я впевнений, хтось спробує оптимізувати рішення, надавши всі речі в змінну (це сталося зі мною), тому я намагався скоротити шлях до успіху.
Ян Вльчинський

5

Ви можете просто використовувати ssh-ident замість створення власної обгортки.

Більше ви можете прочитати на веб- сайті: https://github.com/ccontavalli/ssh-ident

За потреби він завантажує ssh-клавіші, коли потрібно вперше, навіть із кількома сеансами входу, xterms або NFS-спільним домом.

Маючи крихітний конфігураційний файл, він може автоматично завантажувати різні ключі та тримати їх розділеними в різних агентах (для переадресації агента), залежно від того, що вам потрібно зробити.


5

У мене був клієнт, якому потрібен окремий рахунок github. Тому мені потрібно було використовувати окремий ключ саме для цього одного проекту.

Моє рішення було додати це до мого .zshrc / .bashrc:

alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git $@"

Щоразу, коли я хочу використовувати git для цього проекту, я замінюю "infogit" на git:

infogit commit -am "Some message" && infogit push

Мені простіше запам'ятати.


4

Тому я встановив змінну GIT_SSH env на $HOME/bin/git-ssh.

Для того, щоб підтримувати мою конфігурацію репо, диктуйте, яку ssh ідентифікацію використовувати, мій ~/bin/git-sshфайл такий:

#!/bin/sh
ssh -i $(git config --get ssh.identity) -F /dev/null -p 22 $*

Тоді у мене є глобальна настройка конфігурації git:

$ git config --global ssh.identity ~/.ssh/default_id_rsa

І в будь-якому сховищі git я можу просто встановити локальне ssh.identityзначення конфігурації git:

$ git config --local ssh.identity ~/.ssh/any_other_id_rsa

Вуаля!

Якщо у вас може бути інша адреса електронної пошти для кожної особи, вона стає ще простішою, оскільки ви можете просто назвати свої ключі після своїх електронних адрес, а потім надати git config user.email керувати вибором ключа ~/bin/git-sshтак:

#!/bin/sh
ssh -i $HOME/.ssh/$(git config --get user.email) -F /dev/null -p 22 $*

2

Моє рішення було таким:

створити сценарій:

#!/bin/bash
KEY=dafault_key_to_be_used
PORT=10022 #default port...
for i in $@;do
   case $i in
    --port=*)
        PORT="${i:7}";;
    --key=*)KEY="${i:6}";;
   esac
done
export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/${KEY} -p ${PORT}"
echo Command: $GIT_SSH_COMMAND

тоді, коли вам доведеться змінити var run:

. ./thescript.sh [--port=] [--key=]

Не забувайте додаткову крапку !! це робить сценарій встановити середовища вар !! --key та --port - необов’язкові.


2

Як правило, ви хочете використовувати ~/.ssh/configдля цього. Просто з’єднайте адреси серверів з ключами, які ви хочете використовувати для них, таким чином:

Host github.com
  IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
  IdentityFile ~/.ssh/id_rsa.heroku
Host *
  IdentityFile ~/.ssh/id_rsa

Host *позначає будь-який сервер, тому я використовую його для встановлення ~/.ssh/id_rsaяк ключ за замовчуванням для використання.


2

Я будую на @shellholic, і ця тема нитки SO з декількома напоями. Я використовую GitHub як приклад і припускаю, що у вас є приватний ключ ~/.ssh/github(інакше див. Цю тему SO ) і що ви додали відкритий ключ до свого профілю GitHub (інакше див . Довідку GitHub ).

Якщо потрібно, створіть новий конфігураційний файл SSH у ~/.ssh/configта змініть дозволи на 400

touch ~/.ssh/config
chmod 600 ~/.ssh/config

Додайте це до ~/.ssh/configфайлу:

Host github.com
    IdentityFile ~/.ssh/github
    IdentitiesOnly yes

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

git remote rm origin

Потім додайте пульт дистанційного керування до сховища git та помічайте двокрапки перед ім'ям користувача:

git remote add origin git@github.com:user_name/repo_name.git

Потім команди git працюють нормально, наприклад:

git push origin master
git pull origin 

@HeyWatchЦе в цьому потоці SO пропонується додати, IdentitiesOnly yesщоб запобігти поведінці SSH за замовчуванням надсилати файл ідентичності, що відповідає імені файлу за замовчуванням для кожного протоколу. Для отримання додаткової інформації та довідки див.


Це була моя помилка: "Якщо у вас вже є дистанційне налаштування ...". Дуже дякую!!!
Аллан Андраде

поширена помилка --- це відповідь
Годдард

1

Просто використовуйте ssh-agentта ssh-addкоманди.

# create an agent
ssh-agent

# add your default key
ssh-add ~/.ssh/id_rsa

# add your second key
ssh-add ~/.ssh/<your key name>

Після виконання вищевказаних команд ви можете використовувати обидві клавіші одночасно. Просто введіть

git clone git@github.com:<yourname>/<your-repo>.git

щоб клонувати ваше сховище.

Вам потрібно виконати вищевказану команду після перезавантаження машини.


Поясніть, будь ласка, процес, у тому числі Як я можу створити агент
Шрікрушна

0

Я використовую git версії 2.16, і мені не потрібен жоден фрагмент сценарію, навіть конфігурація або змінені команди.

  • Просто скопіював мій приватний ключ у .ssh / id_rsa
  • встановити дозволи до 600

І git зчитується, щоб ввести автоматично. Я нічого не прошу, і це не кидає помилки. Просто прекрасно працює.


Ви помітили, що питання стосується "системи з декількома приватними ключами в ~/.sshкаталозі"?
Скотт

0

Хоча питання цього не вимагає, я цю відповідь для всіх, хто хоче вирішити ту саму проблему саме для .

Розчин гетлабу

Я спробував використати підхід , але навіть документація на git рекомендує використовувати що- ~/.ssh/configнебудь більше, ніж простий випадок. У моєму випадку я натискаю на сервер - і я хотів це зробити як конкретний користувач - що, звичайно, визначається під час а не ім'ям користувача git. Після реалізації я просто виконую наступне:

~/myrepo> git mycommit -m "Important Stuff"
~/myrepo> git mypush
[proceed to enter passphrase for private key...]

Налаштування

Згадайте місцезнаходження вашого /myfolder/.ssh/my_gitlab_id_rsa в моєму випадку.

Додати запис у ~/.ssh/config:

Host gitlab-delegate
    HostName gitlab.mydomain.com
    User git
    IdentityFile /myfolder/.ssh/my_gitlab_id_rsa
    IdentitiesOnly yes

Додайте у ~/.gitconfig:

mypush = "!f() { \
           path=$(git config --get remote.origin.url | cut -d':' -f2); \
           branch=$(git rev-parse --abbrev-ref HEAD); \
           git remote add gitlab_as_me git@gitlab-delegate:$path && \
           git push gitlab_as_me $branch && \
           git pull origin $branch; \
           git remote remove gitlab_as_me; \
         }; f"

Як бонус, я виконую свої зобов’язання на цьому ж хості, як конкретний користувач із цим :

mycommit = "!f() { \
             git -c "user.name=myname" -c "user.email=myname@mysite.com" commit \"$@\"; \
           }; f"

Пояснення

Все вищезазначене передбачає, що відповідний віддалений є, originі відповідна гілка наразі перевірена. Для довідки я натрапив на кілька пунктів, які потрібно було вирішити:

  • Рішення вимагає створення нового пульта gitlab_as_me, і мені не сподобалося бачити зайвий віддалений в моєму дереві журналів, тому я видаляю його, коли закінчу
  • Для того, щоб створити пульт, необхідно генерувати URL-адресу віддаленого пристрою на ходу - у випадку з gitlab це було досягнуто простим bash
  • Виконуючи поштовх, gitlab_as_meвам слід конкретизувати, яку галузь ви натискаєте
  • Після виконання натискання ваш локальний originвказівник потрібно "оновити", щоб відповідати gitlab_as_me(це git pull origin $branchробить)

0

Коли у вас є кілька облікових записів git і ви хочете отримати інший ключ ssh

Ви повинні виконати той же крок, щоб створити ключ ssh, але будьте впевнені

ssh-keygen -t ed25519 -C "your-email-id@gmail.com" 

Введіть шлях, який ви хочете зберегти (напр .: my-pc / Desktop / .ssh / ed25519)

Додайте відкритий ключ до свого gitlab ( Як додати ключ ssh до gitlab )

Ви повинні новий ідентифікатор ssh за допомогою команди com

ssh-add ~/my-pc/Desktop/.ssh/ed25519

(1) Ви цитуєте когось чи щось? Якщо так, то вкажіть джерело. Якщо ні, будь ласка, не використовуйте форматування цитат. (2) Що таке "ed25519"? …………………………… Будь ласка, не відповідайте на коментарі; відредагуйте  свою відповідь, щоб зробити її більш зрозумілою та повною.
Скотт

0
    # start :: how-to use different ssh identity files

    # create the company identity file
    ssh-keygen -t rsa -b 4096 -C "first.last@corp.com"
    # save private key to ~/.ssh/id_rsa.corp, 
    cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys

    # create your private identify file
    ssh-keygen -t rsa -b 4096 -C "me@gmail.com"
    # save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
    cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys

    # clone company internal repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@git.in.corp.com:corp/project.git

    export git_msg="my commit msg with my corporate identity, explicitly provide author"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@corp.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

    # clone public repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@github.com:acoolprojectowner/coolproject.git

    export git_msg="my commit msg with my personal identity, again author "
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@gmail.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push ; 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

    # stop :: how-to use different ssh identity files
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.