Não há TTY presente ao executar comandos sobre SSH no aqui-documento

8

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, recebo a seguinte mensagem:

sudo: no tty present and no askpass program specified

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

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

E vai funcionar, mas quando eu tento a mesma coisa com o here-document, ele não funciona e eu vou ter o mesmo erro de não estar presente:

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

Alguma ideia de como posso fazer isso funcionar?

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

    
por lpfavreau 24.09.2011 / 19:38

2 respostas

5

Use visudo para editar o arquivo sudoers e inserir uma linha abaixo:

Defaults:<user>    !requiretty

It doesn't answer why using the ssh -t "something" versus ssh -t <<STOP something STOP doesn't work. Let's say I'm not using sudo but I'm using passwd for my own user directly, I still won't get the TTY using the heredoc.

Teste ssh -t -t para forçar a alocação pseudo-tty mesmo que stdin não seja um terminal.

    
por 24.09.2011 / 19:48
1

Por que não simplesmente armazenar o documento aqui em uma variável que receberá ssh -t como um argumento de comando.

Em uma nota mais geral, use ssh -T ou especifique o shell remoto como um argumento de comando se o stdin do host remoto estiver sendo redirecionado de um heredoc (para evitar que ssh tente alocar um pty). / p>

# 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
    
por 11.02.2014 / 20:34

Tags