Bash do Servidor Git e SSH

1

Eu quero usar o Git sobre SSH com meu Linode VPS rodando o Ubuntu 10.04 LTS.

As instruções parecem bem fáceis, na verdade, dado que eu já tinha configurado minha chave SSH, etc.

Tudo o que eu tinha que fazer era instruir meu repositório local para enviar para o servidor

ssh://[email protected]:22/~/mygits/proj1.git

Problema é quando eu faço git push origin master ele apenas fica parado, sem atividade de rede, sem erros, depois de alguns minutos eu mato com Ctrl-C. Eu mandei ao longo do tempo ontem tentar diagnosticar o problema. Então, no servidor eu configurei um novo usuário matt2 e copiei authorized_keys para matt2 e tentei empurrar para [email protected]:22 e viola funcionou.

Quais são as diferenças entre matt e matt2? Bem matt tem isso em seu .bash_profile para garantir que um agente ssh esteja rodando (preciso disso funcionar bastante):

# Start/Reuse SSH Agent - restart or re-use an existing agent
SSH_AGENT_CACHE=/tmp/ssh_agent_eval_'whoami'
if [ -s "${SSH_AGENT_CACHE}" ]
then
    echo "Reusing existing ssh-agent"
    eval 'cat "${SSH_AGENT_CACHE}"'
    # Check that agent still exists
    kill -0 "${SSH_AGENT_PID}" 2>-
    if [ $? -eq 1 ]
    then
        echo "ssh-agent pid ${SSH_AGENT_PID} no longer running"
        # Looks like the SSH-Agent has died, it'll be restarted below
        rm -f "${SSH_AGENT_CACHE}"
    fi
fi

if [ ! -f "${SSH_AGENT_CACHE}" ]
then
    echo "Starting new ssh-agent"
    touch "${SSH_AGENT_CACHE}"
    chmod 600 "${SSH_AGENT_CACHE}"
    ssh-agent >> "${SSH_AGENT_CACHE}"
    chmod 400 "${SSH_AGENT_CACHE}"
    eval 'cat "${SSH_AGENT_CACHE}"'
    ssh-add

Portanto, parece que meu .bash_profile está em conflito com o funcionamento do git sobre SSH. Alguma sugestão de soluções alternativas?

Eu não quero usar duas contas de usuário, e quero manter meu .bash_profile. Seria bom se eu pudesse editar o .bash_profile e envolver a funcionalidade em torno de if [ $connectingWith != "git-client" ] , mas duvido que tal coisa exista?

Pensamentos?

    
por Mâtt Frëëman 08.03.2011 / 04:44

2 respostas

2

Tenho certeza de que o problema é que seu .bashrc está ecoando. Nunca imprima nada de .bashrc quando não estiver sendo executado em um terminal, pois isso quebrará os programas que usam o ssh para ações automatizadas (rsync, git,…).

Na verdade, você não deve fazer nada de .bashrc se não estiver sendo executado em um terminal. Coloque isso no começo do arquivo:

if ! [ -t 1 ]; then return; fi

O arquivo .bashrc é destinado a shells interativos. Há um capricho no bash que faz com que ele carregue esse arquivo para todos os logins do rsh e do ssh, independentemente de serem interativos. Isso é ocasionalmente útil porque permite definir variáveis de ambiente para uma sessão ssh não interativa, mas isso é completamente diferente da configuração interativa (prompt, atalhos de teclado, aliases e assim por diante). Em geral, .bashrc pode ser duas seções não relacionadas:

if [ -t 1 ]; then
  # Stuff for interactive bash shells (defined here as shells running in a terminal).
  # Prompt, key bindings, aliases, terminal settings, …
  # It's ok to print things to the terminal here (e.g. to set the terminal title).
else
  # Environment variables for ssh sessions.
  # Do not print anything here.
fi

Nota: para um login ssh interativo, se bash for seu shell de login, ele lê .bash_profile , mas não .bashrc . Você desejará obter .bashrc no seu .bash_profile (se o shell for interativo).

    
por 07.05.2011 / 15:20
0

Por favor, ignore. Havia algo no .bashrc que estava causando problemas. Eu não vi isso, pois isso não foi executado quando o SSH entrou.

    
por 08.03.2011 / 05:09