Problema
Ao executar apt-get install
em 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-get
a 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 update
fechada corretamente. Observe queapt-get update
não é interativo, ao passo queapt-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 oecho
. 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
-t
para forçar o TTY com SSH não ajuda. NemDEBIAN_FRONTEND=noninteractive
. - Tudo foi feito no Ubuntu 12_04 LTS.
ssh user@target
, os comandos do shell), ele funcionará corretamente?Respostas:
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
-t
bandeira 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.Consulte a documentação do SSH:
Agora, por que isso funcionou? Acontece que
debconf
não reclama mais sobre o frontend nos logs. Portanto, acredito que os-t
conjuntos duplos (iscas?)debconf
, Conforme necessário, permitem que aapt-get install
conclusão termine a sessão SSH de maneira limpa.fonte
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.
A resposta original vem daqui: http://www.thetechrepo.com/main-articles/529-execute-a-command-remotely-over-ssh-and-then-close-the-connection
fonte
ssh user@host free -m
no meu ambiente de destino e funciona como um encanto. Vou tentar a recomendação a seguir.No debian / jessie, obtive sucesso com este comando:
Mas talvez você deva considerar o uso do ansible para esta e outras tarefas futuras http://docs.ansible.com/ansible/apt_module.html
fonte