Estou enfrentando problemas com um sistema que estou mantendo via SSH. Quando testo comandos que requerem um TTY, eles funcionam, provavelmente por causa da sessão SSH. Em algumas circunstâncias pouco claras, não há TTY disponível e comandos como sudo
falha devido a
(sudo: sorry, you must have a tty to run sudo)
Eles são bem-sucedidos no shell SSH, o que dificulta o rastreamento de problemas antes que ocorram. Como esse é um problema recorrente, estou procurando uma maneira de testar alterações em scripts em um shell que não forneça um TTY.
Estou usando Ubuntu 19.04, CentOS 6 e Debian 9 com bash e ksh.
O tty não é fornecido por um shell (o relacionamento é o oposto). O tty é fornecido por um emulador de terminal. Os programas podem se "desconectar" do terminal em duas partes (depende do que o programa testado realmente verifica)
Feche stdin/stdout/stderr (que normalmente apontam para o terminal); por exemplo, você pode redirecionar a entrada de /dev/null e enviar a saída para um arquivo ou através de um pipe:
Chame setsid() para desconectar do terminal de controle (que, de outra forma, permaneceria acessível por meio de /dev/tty e tornaria o programa sujeito ao controle de trabalho do shell). De um shell, você pode usar a ferramenta de mesmo nome:
Combinando esses dois, acho que você poderia executar seu script de teste assim:
(Sim, os parênteses são intencionais – eles evitam que a
setsid
ferramenta tenha que bifurcar e ir inesperadamente "para o fundo".)