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

У меня есть проект, размещенный на git.debian.org (alioth), и я хотел бы настроить хук post-receive для обновления зеркала репозитория на http://gitorious.org/

Я полагаю, мне придется использовать git push --mirror gitorious

Теперь мне нужно, чтобы Алиот был авторизован в gitorious, чтобы добиться успеха. Как я могу это сделать?

Я полагаю, мне нужно настроить пользователя на gitorious и создать для него ключ ssh. И затем, когда я делаю git push в хуке post-receive, убедитесь, что используется этот ключ ssh.

Я мог бы использовать ~/.ssh/config но проблема в том, что многие пользователи могут нажать alioth, и каждый должен будет войти в систему и настроить ~/.ssh/config, Вместо этого я хотел бы иметь параметр командной строки или переменную среды, чтобы сообщить ssh, какой ключ использовать. Могу ли я сделать это?

Кроме того, у вас есть другие идеи, как зеркальное отражение может быть достигнуто? И возможно ли настроить его наоборот (громкое нажатие на alioth)?

3 ответа

Решение

Ответ можно найти в справочном руководстве git.

GIT_SSH

Если эта переменная окружения установлена, то git fetch и git push будут использовать эту команду вместо ssh, когда им нужно подключиться к удаленной системе. $GIT_SSH Команде будет дано ровно два аргумента: имя пользователя @ хост (или просто хост) из URL-адреса и команда оболочки для выполнения в этой удаленной системе.

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

Обычно проще настроить любые нужные параметры через свой личный .ssh/config файл. Пожалуйста, обратитесь к документации ssh для получения более подробной информации.

Итак, мне нужно написать скрипт-обертку, я пишу это push-gitorious.sh сценарий:

#!/bin/sh


if [ "run" != "$1" ]; then
  exec ssh -i "$GITORIOUS_IDENTITY_FILE" -o "StrictHostKeyChecking no" "$@"
fi

remote=YOUR_SSH_GITORIOUS_URL

echo "Mirroring to $remote"

export GITORIOUS_IDENTITY_FILE="`mktemp /tmp/tmp.XXXXXXXXXX`"
export GIT_SSH="$0"

cat >"$GITORIOUS_IDENTITY_FILE" <<EOF
YOUR SSH PRIVATE KEY

EOF
cat >"$GITORIOUS_IDENTITY_FILE.pub" <<EOF
YOUR SSH PUBLIC KEY

EOF

#echo git push --mirror "$remote"
git push --mirror "$remote"

rm -f "$GITORIOUS_IDENTITY_FILE"
rm -f "$GITORIOUS_IDENTITY_FILE.pub"

exit 0

Конечно, вы должны заполнить закрытый ключ (открытый ключ включен в скрипт только для справки. Вам также необходимо заполнить URL-адрес.

В крюк после получения вы должны поместить:

path/to/push-gitorious.sh run

Опция запуска важна, иначе она будет запускать ssh напрямую.

Предупреждение: проверка подлинности удаленного хоста не производится. Вы можете удалить эту опцию из командной строки ssh и настроить known_hosts если хотите. В этом случае я не думаю, что это важно.

Я знаю два метода, так что вы можете указать любой ключевой файл, который вы хотите использовать для сайта git, в командной строке git. Вам не нужно жестко кодировать этот ключевой файл в конфигурационном файле или скрипте. Вы просто поставляете это прямо в командной строке git.

Способ 1: использовать переменную среды GIT_SSH

Использование будет таким в командной строке:

$ PKEY=~/.ssh/keyfile.pem git clone git@github.com:me/repo.git

Чтобы использовать эту команду, вам необходимо выполнить некоторые предварительные настройки. Сначала создайте сценарий оболочки со следующим содержимым:

#!/bin/sh
if [ -z "$PKEY" ]; then
    # if PKEY is not specified, run ssh using default keyfile
    ssh "$@"
else
    ssh -i "$PKEY" "$@"
fi

Затем экспортируйте и установите переменную GIT_SSH со значением, равным расположению сценария оболочки выше.

$ export GIT_SSH=~/ssh-git.sh

где ~/ssh-git.sh - имя файла сценария оболочки выше.

Сценарий должен быть исполняемым, поэтому выполните команду chmod:

$ chmod +x ~/ssh-git.sh

Теперь вы можете запустить эту команду с любым файлом ключей, который вы решите использовать:

$ PKEY=~/.ssh/keyfile1.pem git clone git@github.com:me/repo.git

Чтобы использовать другой файл ключей для другого хоста:

$ PKEY=~/.ssh/keyfile2.pem git clone git@myothersite.com:other/repo.git

Это поддерживает любой ключевой файл, который вы хотите использовать. Каждый раз, когда вам нужно запустить git с файлом ключа, который вы хотите использовать, просто укажите его в переменной PKEY. Вы можете забыть все остальное, если GIT_SSH был предварительно настроен.

Обратите внимание на переменную PKEY. Вы можете использовать любое имя, если оно совпадает с тем, которое используется в сценарии оболочки, на который указывает GIT_SSH.

Способ 2: использовать скрипт-обертку

Использование скрипта-обёртки будет примерно таким:

$ git.sh -i ~/.ssh/keyfile.pem clone git@github.com:me/repo.git

Это использование интуитивно понятно, так как похоже на запуск ssh с опцией -i.

Это не требует предварительной настройки сценария оболочки и GIT_SSH. Вам нужно только загрузить и запустить этот скрипт-скрипт с помощью команды git.

Вы можете получить копию этого сценария оболочки здесь: http://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command/

Более простой альтернативой, которая не включает никаких внешних скриптов, является использование псевдонима SSH. Я знаю, что оригинальный постер просил не менять ~/.ssh/config, но я подозреваю, что здесь есть недоразумение.

Локальный пользователь на сервере - это не то же самое, что человек, выполняющий фиксацию, и он может отличаться от пользователя, выполняющего "git push".

  • на сервере программное обеспечение хостинга может запускаться от одного пользователя (обычно это "git")
  • личность человека, выполняющего фиксацию, является только бизнесом git (для добавления к метаданным фиксации), не имеет значения для сервера и не подлежит аутентификации на сервере
  • идентификатор 'git push'-er является релевантным и устанавливается в системах, на которых на сервере работает программное обеспечение хостинга git, на основе ключа ssh

По этой причине в системе, выполняющей push, можно принудительно установить конкретную идентификацию даже для той же локальной учетной записи и того же удаленного сервера, даже в пределах одного и того же репозитория git, используя псевдоним ssh, следуя методу, описанному ниже.

Предположим, у вас на сервере gitorious.org есть ваша обычная учетная запись, назовем ее "разработчик". Вы не хотите автоматически использовать учетную запись "разработчика" [1], поэтому вы создаете еще одну великолепную учетную запись для синхронизации, назовем ее "роботом".

Для автоматизации будет использоваться только учетная запись "робот":

Шаг 1: Добавьте "робота" в проект Gitorius, к которому нужно подтолкнуть.

Шаг 2: На локальной машине создайте ключ без пароля (это будет связано с учетной записью робота на gitorious).

ssh-keygen -f ~/.ssh/id_rsa_robot

Шаг 3: загрузите открытый ключ ~/.ssh/id_rsa_robot.pub на gitorious в учетной записи "робота".

Шаг 4. URI git SSH на gitorious имеют формат git @gitorious.org: prj_or_user / subproject.git. В вашем файле ~ /.ssh / config добавьте следующие строки:

host robot.gitorious.org
        HostName gitorious.org
        IdentityFile ~/.ssh/id_rsa_robot
        IdentitiesOnly "yes"

Это убедится, что:

  • всякий раз, когда вы используете имя хоста "robot.gitorious.org", оно будет подключаться к gitorious.org (опция HostName),
  • он будет использовать пароль без пароля для аутентификации в качестве робота на gitorius.org (опция IdentiFile) и
  • даже если у вас запущен агент ssh, он будет игнорировать ключ по умолчанию и использовать пароль без пароля (IdentiesOnly "yes").

Шаг 5: Предполагая, что URI SSH на gitorious для вашего проекта - "git@gitorious.org:project/project.git", в локальном репозитории определите новый удаленный "autopush" со слегка измененным именем хоста:

git remote add autopush git@robot.gitorious.org:project/project.git

Настройка завершена, теперь попробуйте нажать на gitorious с помощью пульта 'autopush'.

git push autopush master

Если все прошло хорошо и есть изменения, которые нужно нажать, вы должны увидеть, что вы успешно переведены на "gitorious.org" как "робот"

[1] Для автоматической отправки необходимо создать пароль без пароля для учетной записи, но присоединение его к учетной записи "разработчика" означает, что автоматизированное задание может распространяться на любой из проектов, в которых "разработчик" участвует в разработке.

Я обычно устанавливаю GIT_SSH_COMMAND Переменная env для переключения между разными ключами ssh:

export GIT_SSH_COMMAND="ssh -i ~/.ssh/ssh_private_key_name"
Другие вопросы по тегам