I am attempting to setup a mirror-to-backup hook in our repositories. The hook is executing a git push --mirror backup@server:path/foo.git
. However it fails stating:
fatal: What do you think I am? A shell?
fatal: The remote end hung up unexpectedly
My .ssh/authorized_keys
file has the following entry:
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.
I've tried various combinations but the git-shell documentation is exceedingly sparse. I'm not sure what the problem is I'm hoping someone here could point me in the right direction. What is causing this error? I was under the impression that git-shell was intended to be used with push/pull. Clearly, I must be missing something but I haven't a clue what it is.
The path on the backup server is to a set up bare repository.
I think the problem lies in the fact that you've set up a command in the
authorized_keys
file, butman sshd
's section on the authorized_keys file format clearly states:This means that whenever
git-upload-pack
attempts to contactgit-receive-pack
(by way of anssh
command including the call forgit-receive-pack
, it will be squashed in favour of the command specified in.ssh/authorized_keys
.git-shell
can and does accept inbound git-related communications, but because the paramaters fromgit-upload-pack
got squashed to null, the former is assuming that someone is trying to open an ordinary terminal, and cuts it off. This is explained inman git-shell
:My advice would be (assuming you haven't done so already) to create a seperate user account for
git
alone, and have that account carry the appropriate public keys in<git-home>/.ssh/authorized_keys
. Also, don't forget to remove the forced command from the public key(s) in question.In addition, I recommend you set up
git
's user account to usegit-shell
as it's default shell by modifying/etc/passwd
like so:If
git-shell
is installed some place other than/usr/local/bin
,which git-shell
will tell you the exact path to follow.Hope it helps ;-)
Note a complete answer, but you can take some clues from the gitolite mirror-shell setup, where a
gl-mirror-shell
script is actually callinggit shell
.Perhaps have a look here:
http://joey.kitenet.net/blog/entry/locking_down_ssh_authorized_keys/
This page suggests
command="perl -e 'exec qw(git-shell -c), $ENV{SSH_ORIGINAL_COMMAND}'"
to forward
SSH_ORIGINAL_COMMAND
togit-shell
. It works at my side.