bash script stty: input standard: ioctl non appropriato per il dispositivo


15

Sto usando qui-documenti in uno script bash per automatizzare l'installazione e la configurazione in cui è richiesta una password molte volte. Inserisco la password una volta e lo script la passa ai vari comandi. Nella maggior parte dei casi, l'approccio del documento qui gestisce questa multa. Tuttavia, in un caso ottengo questo errore:

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

Si noti che questo messaggio di errore proviene da x11vnc -storepassword(non da sudo.)

Il mio problema è correlato x11vnc -storepasswded ecco il mio codice:

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

Ovviamente (dall'errore) non funziona. Gradirei un esempio funzionante di come implementare sudo x11vnc -storepasswd ~/.vnc/passwdin uno script.

Nel caso in cui sia d'aiuto, le istruzioni appaiono così:

Inserisci la password VNC:
Verifica password:
Scrivi password in /home/user/.vnc/passwd? [y] / nn

L'uso expectsarà una soluzione migliore? Se è così, come lo userei in questo caso? (Non ho mai usato expectprima ma ho guardato molti esempi da quando ho pubblicato questa domanda e non riesco expecta lavorare da solo.)

Risposte:


3

x11vncsi aspetta che il suo input standard sia un terminale e cambia la modalità del terminale per evitare l'eco della password durante la digitazione. Quando l'input standard non è un terminale, le sttychiamate per spegnere e riaccendere l'eco falliscono, quindi l'avviso che vedi.

Aspettarsi è davvero una soluzione. Prova questo script (non testato):

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

In alternativa, se possibile, utilizzare un metodo di autenticazione diverso da RFB ( -passwdfileo un certificato client SSL).


Grazie. Tuttavia, l'errore non proviene da sudoesso viene x11vnc -storepassword. Ho provato vari expectapprocci e non riesco a farlo bene. Un esempio che utilizza expectper inserire una password per x11vnc -storepasswordsarebbe molto apprezzato. Aggiornerò la mia domanda per evitare ulteriore confusione.
MountainX-for-Monica,

@MountainX Giusto, scusa, ho letto male la domanda. Ecco uno script di attesa (completamente non testato).
Gilles 'SO- smetti di essere malvagio' l'

Grazie. Il tuo script non testato mi ha dato alcuni indizi aggiuntivi, ma alla fine non funziona anche senza errori. L'errore è semplicemente Enter VNC password: usage: send [args] stringsulla linea expect "password:" {send "swordfish" "\r"}. Non sono sicuro di come risolverlo. Aspettarsi sembra essere uno strumento molto esigente perché sto prendendo in giro questo problema particolare per ore senza risultati di lavoro ancora.
MountainX-for-Monica,

L'errore (sopra il commento) proveniva send "swordfish" "\r"ed è stato risolto da send "swordfish\r". Tuttavia, la soluzione continua a non funzionare. Nessuna password è scritta in ~ / .vnc / passwd. Sono ancora all'oscuro del perché. Come ho detto, ho visto questo risultato nonostante abbia provato tutto ciò a cui riesco a pensare finora.
MountainX-for-Monica,

A proposito, gli stessi comandi utilizzati nella expectsoluzione funzionano quando immessi manualmente. Non funzionano in questo expectscript o in qualsiasi variante che ho provato finora.
MountainX-for-Monica,

5

Un'altra opzione per evitare questi messaggi di avviso è eseguire x11vncin uno pseudo-terminale creato da un comando UNIX (consultare Uso di pseudo-terminali (pty) per controllare i programmi interattivi ). Questo può essere fatto con il scriptcomando o strumenti come pdip("Dialogo programmato con programmi interattivi").

I messaggi di avviso su Mac OS X 10.6.8 per non fornire uno pseudo-terminale per 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

Soluzioni che utilizzano il scriptcomando:

# 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

1

Sudo ha un'opzione -Sche gli consente di leggere il passwd da 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::::::

Ecco uno script di esempio per dimostrare il processo:

#!/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

La tua sceneggiatura dovrebbe semplicemente fare qualcosa del tipo:

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

Ciò ti consentirebbe di utilizzare i comandi sudo nel tuo script senza dover codificare una password.

In alternativa, potresti aggiungere il tuo utente, o un sottoinsieme di utenti, la possibilità di eseguire x11vnc con sudo, senza password, ma aggiungendo una linea come questa a /etc/sudoers:

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

Oppure crea un vncusersgruppo, aggiungi utenti a quel gruppo e aggiungi quanto segue a /etc/sudoers:

%vncusers    ALL=(root) NOPASSWD: /path/to/x11vnc

Grazie. Tuttavia, l'errore non proviene da sudoesso vienex11vnc -storepassword .
MountainX-for-Monica,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.