A sessão SSH nunca fecha ao executar o “apt-get install”

13

Problema

Ao executar apt-get install em uma sessão SSH não interativa, a sessão nunca é fechada. Exemplo:

ssh user@target "sudo apt-get -y install my_package"

O my_package é instalado corretamente, mas a sessão do SSH apenas fica aberta.

Pergunta

Existe algum sinalizador para passar o SSH para que o apt-get funcione?

Informações adicionais

Contexto

A instalação remota é usada para implementação automatizada de um pacote em um servidor de integração. Assim que enviamos algumas alterações de código para um repositório, uma tarefa obtém o código, cria o pacote e o implementa na integração para verificar se tudo funciona bem (no que diz respeito à implantação).

Já tentei & Notas

  • A mesma sessão SSH executando apt-get update fecha de forma limpa. Observe que apt-get update não é interativo, enquanto apt-get install é. Isso pode sugerir que a interatividade é um problema.
  • Um comando como ssh user@target "sudo apt-get install my_package && echo Hello" nunca alcança o echo .
  • debconf reclama que não consegue encontrar um bom frontend (Display, Readline), e ele volta para Teletipo (embora Readline esteja disponível).
  • Em relação ao frontend do debconf, passar -t para forçar o TTY com o SSH não ajuda. Nem DEBIAN_FRONTEND=noninteractive .
  • Tudo foi feito no Ubuntu 12_04 LTS.
por Eric Platon 21.03.2013 / 06:47

3 respostas

5

A seguinte resposta sobre SF fez o seguinte:

ssh falha ao executar o comando remoto quando executado a partir do script bash do cron

O sinalizador -t força uma alocação pseudo-tty, exceto talvez quando não há TTY localmente. Mas passar a bandeira duas vezes, como em -t -t , apenas finge fazê-lo. E isso resolveu o problema.

Veja a documentação do SSH:

-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty.

Agora, por que isso funcionou? Acontece que debconf não reclama mais sobre o frontend nos logs. Então eu acredito que o dobro -t conjuntos (iscas?) debconf conforme necessário, o que permite que apt-get install conclusão encerre a sessão SSH de forma limpa.

    
por 21.03.2013 / 09:08
1

Quando eu olhei, isso pode fazer o trabalho. Chamando qualquer comando deve ser seguido por exit e heredoc. Encontrou a solução, mas não tentou pessoalmente.

ssh user@myremotemachine <<-EOF
free -m
exit
EOF

A resposta original vem daqui: link

    
por 21.03.2013 / 08:45
1

Debian / jessie foi bem sucedido com este comando:

ssh user@host "TERM=READLINE sudo apt-get install --reinstall less && echo done"

Mas talvez você deva pensar em usar ansible para essa e outras tarefas de upcomming link

    
por 07.03.2016 / 09:03