"Sudo: désolé, vous devez avoir un tty pour exécuter sudo" en utilisant sudo dans un script distant

Je veux exécuter une série de commands sudo-élevées sur une machine distante à partir d'un script incorporé. Pour simplifier la question, j'essaie juste d'exécuter sudo id et de me dire que c'est root.

Je rencontre "sudo: désolé, vous devez avoir un tty pour exécuter sudo" quand j'exécute ce script:

#!/bin/bash ssh -t 192.168.1.100<<EOF sudo id EOF 

Mais pas quand je cours ça:

 #!/bin/bash ssh -t 192.168.1.100 sudo id 

Comment get le premier, avec les désignations de fin de file pour un script incorporé pour respecter le tty forcé à l'autre extrémité du SSH?

Avec le premier, il n'y a pas de tty pour ssh car stdin n'est pas connecté au terminal, c'est un file ici. En fait, si j'essaie d'exécuter une command similaire (sur Debian), j'obtiens l'erreur suivante:

Le pseudo-terminal ne sera pas alloué car stdin n'est pas un terminal.

Pour le faire fonctionner, vous pouvez faire quelque chose comme:

 ssh -tt 192.168.1.100 <<EOF sudo -S id password EOF 

Bien que ce n'est pas une bonne idée puisque le mot de passe sera en text clair.

Mettre à jour

Je suis tombé sur une solution facile à ce qui évite d'encoder le mot de passe en text brut, vous pouvez utiliser un programme graphique pour entrer le mot de passe:

 ssh -X 192.168.1.100 <<EOF SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A id EOF 

Bien sûr, le programme ssh-askpass doit être installé à l'location indiqué et vous devez exécuter une session X sur la machine sur laquelle vous travaillez. Il y a quelques variations sur le programme ssh-askpass qui devraient aussi fonctionner (versions Gnome / KDE). Aussi un programme de rlocation sudo graphique comme gksu ou kdesudo devrait faire le travail aussi.