Назад | Перейти на главную страницу

Как использовать git-push --mirror с git-shell в SSH?

Я пытаюсь настроить в наших репозиториях перехватчик зеркального копирования. Хук выполняет git push --mirror backup@server:path/foo.git. Однако он не заявляет:

fatal: What do you think I am? A shell?
fatal: The remote end hung up unexpectedly

Мой .ssh/authorized_keys файл имеет следующую запись:

command="/path/to/git-shell" ssh-rsa ....

# no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
# these are all set i just removed them for brevity.

Я пробовал разные комбинации, но документация по git-shell чрезвычайно скудна. Я не уверен, в чем проблема. Я надеюсь, что кто-то здесь может указать мне правильное направление. Что вызывает эту ошибку? У меня создалось впечатление, что git-shell предназначен для использования с push / pull. Ясно, что я что-то упускаю, но понятия не имею, что это такое.

Путь на сервере резервного копирования - к настроенному голому репозиторию.

Думаю, проблема в том, что вы настроили команду в authorized_keys файл, но man sshdВ разделе о формате файла authorized_keys четко сказано:

command = "команда"
Указывает, что команда выполняется всякий раз, когда этот ключ используется для аутентификации. Команда, предоставленная пользователем (если есть), игнорируется. (…)

Это означает, что всякий раз, когда git-upload-pack попытки связаться git-receive-pack (посредством ssh команда, включая призыв к git-receive-pack, он будет сдавлен в пользу команды, указанной в .ssh/authorized_keys.
git-shell может принимать и принимает входящие сообщения, связанные с git, но поскольку параметры из git-upload-pack был сжат до нуля, первый предполагает, что кто-то пытается открыть обычный терминал, и отключает его. Это объясняется в man git-shell:

название
git-shell - ограниченная оболочка входа для доступа по SSH только Git
синопсис
git shell [-c]
описание
Оболочка входа для учетных записей SSH, обеспечивающая ограниченный доступ к Git. Когда указан -c, программа выполняется не интерактивно; может быть одним из git receive-pack, git upload-pack, git upload-archive, cvs server или командой в COMMAND_DIR. (…)

Я бы посоветовал (если вы еще этого не сделали) создать отдельную учетную запись пользователя для git в одиночку, и пусть эта учетная запись содержит соответствующие открытые ключи в <git-home>/.ssh/authorized_keys. Кроме того, не забудьте удалить принудительную команду из рассматриваемых открытых ключей.
Кроме того, я рекомендую вам настроить gitучетная запись пользователя для использования git-shell в качестве оболочки по умолчанию, изменив /etc/passwd вот так:

From "git:*:1000:1000:git systems account:/home/git:/bin/sh"
To "git:*:1000:1000:git systems account:/home/git:/usr/local/bin/git-shell"

Если git-shell установлен в другом месте, кроме /usr/local/bin, which git-shell подскажет вам точный путь.

Надеюсь, поможет ;-)

Возможно, посмотрите здесь:

http://joey.kitenet.net/blog/entry/locking_down_ssh_authorized_keys/

Эта страница предлагает

command="perl -e 'exec qw(git-shell -c), $ENV{SSH_ORIGINAL_COMMAND}'"

переслать SSH_ORIGINAL_COMMAND к git-shell. Это работает на моей стороне.

Запишите полный ответ, но вы можете получить некоторые подсказки из установка gitolite mirror-shell, где gl-mirror-shell сценарий на самом деле звонит git shell.