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:
command="command"
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 .ssh/authorized_keys
.
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 man git-shell
:
name
git-shell - Restricted login shell for Git-only SSH access
synopsis
git shell [-c ]
description
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"
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 ;-)