Как указать, какой 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"