I think the problem lies in the fact that you've set up a command in the
authorized_keys file, but
man sshd's section on the authorized_keys file format clearly states:
Specifies that the command is executed whenever this key is used for authentication. The command supplied by the user (if any) is ignored. (…)
This means that whenever
git-upload-pack attempts to contact
git-receive-pack (by way of an
ssh command including the call for
git-receive-pack, it will be squashed in favour of the command specified in
git-shell can and does accept inbound git-related communications, but because the paramaters from
git-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 in
git-shell - Restricted login shell for Git-only SSH access
git shell [-c ]
A login shell for SSH accounts to provide restricted Git access. When
-c is given, the program executes non-interactively;
can be one of git receive-pack, git upload-pack, git
upload-archive, cvs server, or a command in COMMAND_DIR.(…)
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 use
git-shell as it's default shell by modifying
/etc/passwd like so:
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 is installed some place other than
which git-shell will tell you the exact path to follow.
Hope it helps ;-)