Solução possível :
Como eu estava digitando a pergunta, eu encontrei uma solução. Mas parece-me que deve haver uma solução mais simples e mais segura para esse problema. O que eu fiz foi alterar o valor de 'command' no arquivo authorized_keys para:
command="~/somescript.sh"
E 'somescript.sh' contém:
#!/bin/bash
ALLOW=(
'/home/<user>/repository1.git'
'/home/<user>/repository2.git'
)
case $SSH_ORIGINAL_COMMAND in
"git-receive-pack"*|"git-upload-pack"*|"git-upload-archive"*)
GITPATH=$(echo $SSH_ORIGINAL_COMMAND | sed -r "s:.*'([^']*)'.*::g")
ALLOWED="false"
for ((i=0; i < ${#ALLOW[@]}; i++)); do
if [ "${ALLOW[$i]}" == "$GITPATH" ]; then
ALLOWED="true"; break;
fi
done
if [ "$ALLOWED" == "true" ]; then
eval "git-shell -c \"$SSH_ORIGINAL_COMMAND\""
else
echo "[ERROR] ACCESS DENIED" >&2
exit 1
fi
;;
*)
echo "[ERROR] Only git commands are allowed!" >&2
exit 1
;;
esac
No script, estou aproveitando o fato de que os comandos git clone, git push e git pull produzem no lado REMOTE:
git-upload-pack '<path>/<to>/<repository>', or
git-receive-pack '<path>/<to>/<repository>'
Eu especifico repositórios na variável ALLOW que podem ser acessados através da chave ssh que usa o script, e simplesmente os compara com o caminho especificado no comando git emitido (variável GITPATH). Há um risco de segurança, quando vários comandos git são emitidos em uma linha. Se o comando contiver pelo menos uma menção de um repositório permitido, ele executará o comando inteiro. Alguma sugestão sobre melhoria?