erreur de script bash stty: entrée standard: ioctl inapproprié pour le périphérique

16

J'utilise ici des documents dans un script bash pour automatiser l'installation et la configuration où un mot de passe est requis plusieurs fois. J'entre une fois le mot de passe et le script le passe aux différentes commandes. Dans la plupart des cas, l'approche ici-document gère cette amende. Cependant, dans un cas, j'obtiens cette erreur:

Enter VNC password: stty: standard input: Inappropriate ioctl for device
Verify password:    
stty: standard input: Inappropriate ioctl for device

Veuillez noter que ce message d'erreur vient de x11vnc -storepassword(pas de sudo.)

Mon problème est lié à x11vnc -storepasswdet voici mon code:

sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC
password
password
y
ENDDOC

Cela évidemment (de l'erreur) ne fonctionne pas. J'apprécierais un exemple de travail de mise sudo x11vnc -storepasswd ~/.vnc/passwden œuvre dans un script.

Au cas où cela aiderait, les invites ressemblent à ceci:

Entrez le mot de passe VNC:
Vérifiez le mot de passe:
Écrivez le mot de passe dans /home/user/.vnc/passwd? [y] / nn

L'utilisation expectsera-t-elle une meilleure solution? Si oui, comment l'utiliser dans ce cas? (Je n'ai jamais utilisé expectauparavant, mais j'ai examiné de nombreux exemples depuis la publication de cette question et je ne peux pas expecttravailler seul.)

MountainX-for-Monica
la source

Réponses:

3

x11vncs'attend à ce que son entrée standard soit un terminal, et il modifie le mode du terminal pour éviter de faire écho au mot de passe lors de la frappe. Lorsque l'entrée standard n'est pas un terminal, les sttyappels pour désactiver l'écho et le réactiver échouent, d'où l'avertissement que vous voyez.

Attendre est en effet une solution. Essayez ce script (non testé):

#!/usr/bin/expect -f
spawn x11vnc -storepasswd ~/.vnc/passwd
expect "password:" {send "swordfish" "\r"}
expect "password:" {send "swordfish" "\r"}
expect "Write*\?" {send "y\r"}

Sinon, si vous le pouvez, utilisez une méthode d'authentification autre que RFB ( -passwdfileou un certificat client SSL).

Gilles 'SO- arrête d'être méchant'
la source
Merci. Cependant, l'erreur ne vient pas, sudoelle vient x11vnc -storepassword. J'ai essayé différentes expectapproches et je n'arrive pas à faire les choses correctement. Un exemple d'utilisation expectde la saisie d'un mot de passe x11vnc -storepasswordserait grandement apprécié. Je mettrai à jour ma question pour éviter toute confusion supplémentaire.
MountainX-for-Monica
@MountainX Oui, désolé, j'ai mal lu la question. Voici un script attendu (complètement non testé).
Gilles 'SO- arrête d'être méchant'
Je vous remercie. Votre script non testé m'a donné quelques indices supplémentaires, mais finalement il ne fonctionne pas sans erreurs. L'erreur est simplement Enter VNC password: usage: send [args] stringsur la ligne expect "password:" {send "swordfish" "\r"}. Je ne sais pas comment résoudre ce problème. Attendre semble être un outil très difficile, car je tromper avec ce problème particulier pendant des heures sans résultats de travail pour le moment.
MountainX-for-Monica
L'erreur (commentaire ci-dessus) venait send "swordfish" "\r"et elle a été résolue par send "swordfish\r". Cependant, la solution ne fonctionne toujours pas. Aucun mot de passe n'est écrit dans ~ / .vnc / passwd. Je ne sais toujours pas pourquoi. Comme je l'ai dit, j'ai vu ce résultat malgré tout ce que je peux penser jusqu'à présent.
MountainX-for-Monica
BTW, les mêmes commandes utilisées dans votre expectsolution fonctionnent lorsqu'elles sont entrées manuellement. Ils ne fonctionnent pas dans ce expectscript ou toute variante de celui-ci que j'ai essayé jusqu'à présent.
MountainX-for-Monica
5

Une autre option pour éviter ces messages d'avertissement consiste à s'exécuter x11vncdans un pseudo-terminal créé par une commande UNIX (voir Utilisation de pseudo-terminaux (pty) pour contrôler des programmes interactifs ). Cela peut être fait avec la scriptcommande ou des outils tels que pdip("Dialogue programmé avec des programmes interactifs").

Les messages d'avertissement sur Mac OS X 10.6.8 pour ne pas fournir de pseudo-terminal pour x11vnc:

# x11vnc 0.9.14
sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC
password
password
y
ENDDOC

# Enter VNC password: stty: stdin isn't a terminal
#
# Verify password:    
# stty: stdin isn't a terminal
# Write password to ~/.vnc/passwd?  [y]/n Password written to: ~/.vnc/passwd

Solutions utilisant la scriptcommande:

# GNU script command
sudo script -q -c 'x11vnc -storepasswd ~/.vnc/passwd' <<ENDDOC /dev/null
password
password
y
ENDDOC

# ... or ...
printf '%s\n' 'password' 'password' 'y' | 
   sudo script -q -c 'x11vnc -storepasswd ~/.vnc/passwd' /dev/null


# FreeBSD script command
sudo script -q /dev/null x11vnc -storepasswd ~/.vnc/passwd <<ENDDOC
password
password
y
ENDDOC
Kalou
la source
1

Sudo a une option -Squi lui permet de lire le mot de passe depuis STDIN.

[user@evil ~]$ tail -1 /etc/shadow
tail: cannot open `/etc/shadow' for reading: Permission denied
[user@evil ~]$ echo 'P@ssW3rd!' | sudo -S tail -1 /etc/shadow
nfsnobody:!!:15891::::::

Voici un exemple de script pour illustrer le processus:

#!/bin/bash

function hr {
    perl -e 'print "-" x 80, "\n";'
}

hr
read -p "Please enter your sudo password: " -s sudopasswd
echo

hr
echo "-sudo run: tail -1 /etc/shadow"
tail -1 /etc/shadow

hr
echo "+sudo run: tail -1 /etc/shadow"
echo "$sudopasswd" | sudo -S tail -1 /etc/shadow

hr
echo "-sudo run: ls -la /root/"
ls -la /root/

hr
echo "+sudo run: ls -la /root/"
echo "$sudopasswd" | sudo -S ls -la /root/

hr

Votre script aurait simplement besoin de faire quelque chose comme:

read -p "Please enter your sudo password: " -s sudopasswd
echo "$sudopasswd" | sudo -S x11vnc -storepasswd ~/.vnc/passwd 

Cela vous permettrait d'utiliser les commandes sudo dans votre script sans avoir à coder en dur un mot de passe.

Alternativement, vous pouvez ajouter à votre utilisateur, ou à un sous-ensemble d'utilisateurs, la possibilité d'exécuter x11vnc avec sudo, sans mot de passe, mais en ajoutant une ligne comme celle-ci à /etc/sudoers:

user    ALL=(root) NOPASSWD: /path/to/x11vnc

Ou créez un vncusersgroupe, ajoutez des utilisateurs à ce groupe et ajoutez ce qui suit à /etc/sudoers:

%vncusers    ALL=(root) NOPASSWD: /path/to/x11vnc
Tim Kennedy
la source
Merci. Cependant, l'erreur ne vient pas, sudoelle vient x11vnc -storepassword.
MountainX-for-Monica