18

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

19

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

5 ответ(ов)

9

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

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

Обратите внимание, что опция -o IdentitiesOnly=yes обязательна, чтобы предотвратить стандартное поведение SSH, которое отправляет файл идентификации, соответствующий имени файла по умолчанию для каждого протокола, как упомянуто в предыдущем ответе.

5

Другие предложения по настройке ~/.ssh/config могут показаться излишне сложными. На самом деле, это можно сделать гораздо проще:

Host github.com
  IdentityFile ~/.ssh/github_rsa

Таким образом, вы указываете файл с ключом для подключения к GitHub, и больше ничего не нужно. Это позволяет избежать лишних complication'ов и делает настройку более понятной и удобной.

1

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

Этот скрипт обрабатывает параметры, переданные ему через $1 и $2, и использует заданный SSH-ключ для подключения. Убедитесь, что путь к вашему секретному SSH-ключу указан корректно.

1

Проблема возникает, когда у вас есть разные удалённые репозитории на одном хосте (например, на github.com), и вы хотите взаимодействовать с ними, используя разные SSH-ключи (т.е. разные аккаунты GitHub).

Чтобы это сделать, выполните следующие шаги:

  1. Сначала нужно объявить ваши разные ключи в файле ~/.ssh/config.

    # Ключ для обычных репозиториев на github.com
    Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa
    
    # Ключ для конкретного репозитория на github.com
    Host XXX
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_other_rsa
    

    Таким образом, вы связываете второй ключ с новым удобным именем "XXX" для github.com.

  2. Затем вам нужно изменить удалённый origin вашего конкретного репозитория, чтобы он использовал дружелюбное имя, которое вы только что определили.

    Перейдите в папку вашего локального репозитория в командной строке и отобразите текущий удалённый origin:

    >git remote -v
    origin  [email protected]:myuser/myrepo.git (fetch)
    origin  [email protected]:myuser/myrepo.git (push)
    

    Затем измените origin с помощью команды:

    >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)
    

    Теперь вы можете выполнять команды push, fetch и другие с правильным ключом автоматически.

1

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

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

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

Эта команда устанавливает конкретный SSH-ключ для операций git pull и git push в текущем репозитории.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь