No hay TTY presente al ejecutar comandos sobre SSH en el documento aquí

10

Estoy tratando de ejecutar un comando sobre SSH como este en un documento aquí:

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

Lo que normalmente funciona, excepto cuando estoy tratando de ejecutar algo que necesita entrada, como la contraseña para sudo. En ese caso, recibo el siguiente mensaje:

sudo: no tty present and no askpass program specified

Sé que puedo usar la -tbandera en SSH para asignar un pseudo-tty como este:

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

Y funcionará, pero cuando intento lo mismo con here-document, no funciona y obtendré el mismo error acerca de que no hay tty presente:

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

¿Alguna idea de cómo puedo hacer que esto funcione?

Además, en caso de que se pregunte por qué quiero que funcione con el documento aquí en lugar de simplemente pasarlo en la misma línea, es porque los comandos de entrada (puede haber algunos) provienen de un archivo de configuración leído por un script y he oído que evita el problema de escapar de los comandos para las comillas, comillas dobles, etc.

lpfavreau
fuente

Respuestas:

6

Use visudopara editar el archivo sudoers e inserte una línea a continuación:

Defaults:<user>    !requiretty

No responde por qué usar el ssh -t "something" versus ssh -t <<STOP something STOPno funciona. Digamos que no estoy usando sudo pero estoy usando passwd para mi propio usuario directamente, todavía no obtendré el TTY usando el heredoc.

Intente ssh -t -tforzar la asignación de pseudo-tty incluso si stdin no es un terminal.

quanta
fuente
Gracias, he visto esta solución en otro lugar, pero solo resuelve el problema para los comandos que usan sudo. No responde por qué usar ssh -t "algo" versus ssh -t << DETENER algo DETENER no funciona. Digamos que no estoy usando sudo pero estoy usando passwd para mi propio usuario directamente, todavía no obtendré el TTY usando el heredoc.
lpfavreau
He actualizado mi respuesta.
quanta
1

¿Por qué no simplemente almacenar el documento aquí en una variable que se dará ssh -tcomo argumento de comando?

En una nota más general, use ssh -To especifique el shell remoto como argumento de comando si el stdin del host remoto se redirige desde un heredoc (para evitar que sshintente asignar una 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
Chad
fuente