Aucun TTY présent lors de l'exécution de commandes sur SSH dans le document here-document


10

J'essaie d'exécuter une commande sur SSH comme ceci dans un document ici:

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

Ce qui fonctionne normalement, sauf lorsque j'essaie d'exécuter quelque chose qui nécessite une entrée, comme le mot de passe pour sudo. Dans ce cas, je reçois le message suivant:

sudo: no tty present and no askpass program specified

Je sais que je peux utiliser l' -tindicateur sur SSH pour allouer un pseudo-tty comme celui-ci:

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

Et ça va marcher, mais quand j'essaye la même chose avec here-document, ça ne marche pas et j'obtiendrai la même erreur à propos de l'absence de tty:

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

Une idée de comment je peux faire fonctionner ça?

De plus, au cas où vous vous demanderiez pourquoi je veux qu'il fonctionne avec le document ici au lieu de simplement le passer sur la même ligne, c'est parce que les commandes d'entrée (il peut y en avoir quelques-unes) proviennent d'un fichier de configuration lu par un script et j'ai entendu dire que cela évitait la peine d'échapper aux commandes pour les guillemets, les guillemets doubles, etc.

Réponses:


6

Utilisez visudopour modifier le fichier sudoers et insérez une ligne ci-dessous:

Defaults:<user>    !requiretty

Cela ne répond pas pourquoi l'utilisation de ssh -t "something" versus ssh -t <<STOP something STOPne fonctionne pas. Disons que je n'utilise pas sudo mais que j'utilise directement passwd pour mon propre utilisateur, je n'obtiendrai toujours pas le TTY en utilisant heredoc.

Essayez ssh -t -tde forcer l'allocation de pseudo-tty même si stdin n'est pas un terminal.


Merci, j'ai vu ce correctif ailleurs, mais cela ne fait que contourner le problème pour les commandes qui utilisent sudo. Il ne répond pas pourquoi utiliser le ssh -t "quelque chose" contre ssh -t << STOP quelque chose STOP ne fonctionne pas. Disons que je n'utilise pas sudo mais que j'utilise directement passwd pour mon propre utilisateur, je n'obtiendrai toujours pas le TTY en utilisant heredoc.
lpfavreau

J'ai mis à jour ma réponse.
quanta

1

Pourquoi ne pas simplement stocker le document ici dans une variable qui sera donnée ssh -tcomme argument de commande.

De manière plus générale, utilisez ssh -Tou spécifiez le shell distant comme argument de commande si le stdin de l'hôte distant est redirigé depuis un hérédoc (pour éviter sshd'essayer d'allouer un 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.