Я пытаюсь настроить в наших репозиториях перехватчик зеркального копирования. Хук выполняет 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
.