Como eu uso o git-push --mirror com o git-shell no SSH?

3

Estou tentando configurar um gancho de espelhamento para backup em nossos repositórios. O gancho está executando um git push --mirror backup@server:path/foo.git . No entanto, não informa:

fatal: What do you think I am? A shell?
fatal: The remote end hung up unexpectedly

Meu arquivo .ssh/authorized_keys tem a seguinte entrada:

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.

Eu tentei várias combinações, mas a documentação do git-shell é extremamente escassa. Não sei qual é o problema. Espero que alguém aqui possa me apontar na direção certa. O que está causando esse erro? Fiquei com a impressão de que a git-shell era destinada a ser usada com push / pull. Claramente, devo estar perdendo alguma coisa, mas não tenho a menor ideia do que é.

O caminho no servidor de backup é para um repositório vazio configurado.

    
por Danny 09.05.2011 / 23:05

3 respostas

2

Acho que o problema está no fato de você ter configurado um comando no arquivo authorized_keys , mas a seção man sshd no formato do arquivo authorized_keys diz claramente:

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. (…)

Isso significa que sempre que git-upload-pack tentar entrar em contato com git-receive-pack (por meio de um comando ssh incluindo a chamada para git-receive-pack , ele será esmagado em favor do comando especificado em .ssh/authorized_keys .
git-shell pode e aceita comunicações relacionadas ao git de entrada, mas como os parâmetros de git-upload-pack foram esmagados para nulos, o primeiro está assumindo que alguém está tentando abrir um terminal comum e o interrompe. 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.(…)

Meu conselho seria (supondo que você não tenha feito isso) para criar uma conta de usuário separada para git sozinho e fazer com que essa conta tenha as chaves públicas apropriadas em <git-home>/.ssh/authorized_keys . Além disso, não se esqueça de remover o comando forçado da (s) chave (s) pública (s) em questão.
Além disso, recomendo que você configure a conta de usuário git para usar git-shell como shell padrão, modificando /etc/passwd da seguinte forma:

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"

Se git-shell estiver instalado em algum lugar diferente de /usr/local/bin , which git-shell informará o caminho exato a seguir.

Espero que ajude; -)

    
por 29.10.2012 / 21:15
0

Anote uma resposta completa, mas você pode obter algumas dicas da configuração da shell do espelho da gitolite , onde um script gl-mirror-shell está realmente chamando git shell .

    
por 09.05.2011 / 23:33
0

Talvez tenha uma olhada aqui:

link

Esta página sugere

command="perl -e 'exec qw(git-shell -c), $ENV{SSH_ORIGINAL_COMMAND}'"

para encaminhar SSH_ORIGINAL_COMMAND para git-shell . Ele trabalha ao meu lado.

    
por 06.01.2012 / 20:35