Nenhum TTY presente ao executar comandos sobre SSH no documento aqui

10

Estou tentando executar um comando sobre SSH como este em um documento aqui:

ssh example.com <<END
sudo /etc/init.d/apache2 reload
END

O que normalmente funciona, exceto quando estou tentando executar algo que precisa de entrada, como a senha do sudo. Nesse caso, estou recebendo a seguinte mensagem:

sudo: no tty present and no askpass program specified

Eu sei que posso usar o -tsinalizador no SSH para alocar uma pseudo-tty como esta:

ssh -t example.com "sudo /etc/init.d/apache2 reload"

E funcionará, mas quando eu tentar a mesma coisa com o documento aqui, ele não funcionará e eu receberei o mesmo erro sobre a ausência de tty:

ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END

Alguma idéia de como eu posso fazer isso funcionar?

Além disso, caso você esteja se perguntando por que eu quero que ele funcione com o documento aqui, em vez de apenas passá-lo na mesma linha, é porque os comandos de entrada (pode haver alguns) vêm de um arquivo de configuração lido por um script e eu ouvi-lo evita o problema de escapar dos comandos para as aspas, aspas duplas, etc.

lpfavreau
fonte

Respostas:

6

Use visudopara editar o arquivo sudoers e inserir uma linha abaixo:

Defaults:<user>    !requiretty

Não responde por que usar o ssh -t "something" versus ssh -t <<STOP something STOPnão funciona. Digamos que não estou usando o sudo, mas estou usando o passwd diretamente para meu próprio usuário, ainda não receberei o TTY usando o heredoc.

Tente ssh -t -tforçar a alocação de pseudo-tty, mesmo que stdin não seja um terminal.

quanta
fonte
Obrigado, eu já vi essa correção em outro lugar, mas isso apenas contorna o problema dos comandos que usam o sudo. Ele não responde por que o uso do ssh -t "something" versus ssh -t << STOP algo que STOP não funciona. Digamos que não estou usando o sudo, mas estou usando o passwd diretamente para meu próprio usuário, ainda não receberei o TTY usando o heredoc.
Lpfavreau
Eu atualizei minha resposta.
quanta
1

Por que não simplesmente armazenar o documento aqui em uma variável que será fornecida ssh -tcomo um argumento de comando.

Em uma observação mais geral, use ssh -Tou especifique o shell remoto como um argumento de comando se o stdin do host remoto estiver sendo redirecionado de um heredoc (para impedir a sshtentativa de alocar um pty).

# store heredoc in a variable
heredoc="$(cat <<EOF
who
sudo ls -ld /
logname
EOF
)"

ssh -t localhost "$heredoc"


# avoid: Pseudo-terminal will not be allocated because stdin is not a terminal.
- ssh example.com <<END
+ ssh -T example.com <<END
+ ssh example.com /bin/sh <<END
Chade
fonte