Existe um comando git-shell
para este cenário. Veja man git-shell
para detalhes.
Veja como configurá-lo:
chsh -s /usr/bin/git-shell username
Supondo que haja um ~username/testrepo/.git/
, um clone do git funcionará bem:
git clone username@host:testrepo
Cloning into 'testrepo'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
Checking connectivity... done.
Após um ssh username@host
, você verá
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
e a conexão será encerrada.
É possível criar um diretório ~username/git-shell-commands/
com scripts nele, mas não consegui fazer isso funcionar junto com git clone
, porque um script é sempre executado, produzindo saída, corrompendo ações do repositório git . Então, é melhor nem criar esse diretório.
Aqui está outra maneira (com base no que o GitLab faz). Faça um único usuário git
possuindo todos os repositórios. Ele terá todas as chaves do host em ~git/.ssh/authorized_keys
. Cada uma das linhas é prefixada com opções, assim.
command="~/bin/gitshell.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB34234234.....
Não podemos usar gitlab-shell
aqui, por isso usamos um script personalizado ~git/bin/gitshell.sh
:
#!/bin/sh
exec git-shell -c "$SSH_ORIGINAL_COMMAND"
Essa abordagem não exige chsh
, pois o comando em authorized_keys
tem precedência.