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

14

Problema

Ao executar apt-get installem uma sessão SSH não interativa, a sessão nunca fecha. Exemplo:

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

Ele my_packageé instalado corretamente, mas a sessão SSH é aberta.

Questão

Existe algum sinalizador para passar o SSH para começar apt-geta trabalhar?


informação adicional

Contexto

A instalação remota é usada para implantação automatizada de um pacote em um servidor de integração. Assim que enviamos algumas alterações de código para um repositório, um trabalho extrai 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 e anotações

  • A mesma sessão SSH em execução é apt-get updatefechada corretamente. Observe que apt-get updatenão é interativo, ao passo que 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 atinge o echo.
  • debconf reclama que não consegue encontrar um bom front-end (Display, Readline) e recorre ao Teletype (embora o Readline esteja disponível).
  • Em relação ao front-end do debconf, passar -tpara forçar o TTY com SSH não ajuda. Nem DEBIAN_FRONTEND=noninteractive.
  • Tudo foi feito no Ubuntu 12_04 LTS.
Eric Platon
fonte
Se você executar o comando de instalação manualmente (ou seja ssh user@target, os comandos do shell), ele funcionará corretamente?
Anel Ø
O comando de instalação funciona bem quando feito manualmente (levando a pensar que há um problema com os tipos de sessão interativos / sem logon).
quer

Respostas:

6

A seguinte resposta no SF fez o truque:

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

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

Consulte a documentação do SSH:

-t Força a alocação pseudo-tty. Isso pode ser usado para executar programas arbitrários baseados em tela em uma máquina remota, o que pode ser muito útil, por exemplo, ao implementar serviços de menu. Várias opções -t forçam a alocação de tty, mesmo se ssh não tiver tty local.

Agora, por que isso funcionou? Acontece que debconfnão reclama mais sobre o frontend nos logs. Portanto, acredito que os -tconjuntos duplos (iscas?) debconf, Conforme necessário, permitem que a apt-get installconclusão termine a sessão SSH de maneira limpa.

Eric Platon
fonte
Acredito que esta é uma boa resposta, mas não a marcarei imediatamente como está. Primeiro porque me respondi e, segundo, pode haver respostas melhores / mais genéricas. De volta a isso no futuro.
Eric Platon
1

Enquanto eu olhava, isso pode fazer o trabalho. Chamar qualquer comando deve ser seguido por exit e heredoc. Encontrei a solução, mas não tentei pessoalmente.

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

A resposta original vem daqui: http://www.thetechrepo.com/main-articles/529-execute-a-command-remotely-over-ssh-and-then-close-the-connection

koressak
fonte
Obrigado, koressak. Eu acho que isso depende do shell e da distribuição do SO. Acabei de experimentar ssh user@host free -mno meu ambiente de destino e funciona como um encanto. Vou tentar a recomendação a seguir.
quer
Eu apenas tentei uma corrida completa com a abordagem heredoc. Isso não resolveu o problema. A sessão SSH trava da mesma maneira que a apresentada na pergunta. Mais uma vez obrigado pela resposta e pelo ponteiro!
quer
1

No debian / jessie, obtive sucesso com este comando:

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

Mas talvez você deva considerar o uso do ansible para esta e outras tarefas futuras http://docs.ansible.com/ansible/apt_module.html

ThorstenS
fonte
Interessante, boa ideia. Quanto a Ansible, talvez agora. Não sei quando a pergunta veio à mente. Enfim, acredito que é bom saber "o que está acontecendo lá dentro" (c).
precisa