error de script bash stty: entrada estándar: ioctl inapropiado para dispositivo

16

Estoy usando documentos aquí en un script bash para automatizar la instalación y configuración donde se requiere una contraseña muchas veces. Ingreso la contraseña una vez y la secuencia de comandos la pasa a los diversos comandos. En la mayoría de los casos, el enfoque de documento aquí maneja esta multa. Sin embargo, en un caso me sale este error:

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

Tenga en cuenta que este mensaje de error es de x11vnc -storepassword(no de sudo).

Mi problema está relacionado x11vnc -storepasswdy aquí está mi código:

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

Eso obviamente (del error) no funciona. Agradecería un ejemplo práctico de cómo implementar sudo x11vnc -storepasswd ~/.vnc/passwden un script.

En caso de que ayude, las indicaciones se verán así:

Ingrese la contraseña de VNC:
Verifique la contraseña: ¿
Escriba la contraseña en /home/user/.vnc/passwd? [y] / nn

¿Será el uso expectuna mejor solución? Si es así, ¿cómo lo usaría en este caso? (Nunca lo he usado expectantes, pero he visto muchos ejemplos desde que publiqué esta pregunta y no puedo expecttrabajar por mi cuenta).

MountainX-for-Monica
fuente

Respuestas:

3

x11vncespera que su entrada estándar sea un terminal, y cambia el modo del terminal para evitar hacer eco de la contraseña mientras escribe. Cuando la entrada estándar no es un terminal, sttyfallan las llamadas para desactivar y volver a activar el eco, de ahí la advertencia que ve.

Esperar es de hecho una solución. Pruebe este script (no probado):

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

Alternativamente, si puede, use un método de autenticación que no sea RFB ( -passwdfileo un certificado de cliente SSL).

Gilles 'SO- deja de ser malvado'
fuente
Gracias. Sin embargo, el error no proviene sudo, proviene x11vnc -storepassword. He estado probando varios expectenfoques y parece que no puedo hacerlo bien. Un ejemplo de usar expectpara ingresar una contraseña para x11vnc -storepasswordsería muy apreciado. Actualizaré mi pregunta para evitar más confusión.
MountainX-for-Monica
@MountainX Correcto, lo siento, leí mal la pregunta. Aquí hay un script de espera (completamente no probado).
Gilles 'SO- deja de ser malvado'
Gracias. Su secuencia de comandos no probada me dio algunas pistas adicionales, pero finalmente no se ejecuta sin errores. El error está simplemente Enter VNC password: usage: send [args] stringen la línea expect "password:" {send "swordfish" "\r"}. No estoy seguro de cómo solucionar eso. Esperar parece ser una herramienta muy exigente porque he estado engañando con este problema en particular durante horas sin resultados de trabajo todavía.
MountainX-for-Monica
El error (comentario anterior) provenía send "swordfish" "\r"y fue resuelto por send "swordfish\r". Sin embargo, la solución aún no funciona. No se escribe ninguna contraseña en ~ / .vnc / passwd. Todavía no tengo idea de por qué. Como dije, he estado viendo este resultado a pesar de intentar todo lo que puedo pensar hasta ahora.
MountainX-for-Monica
Por cierto, los mismos comandos utilizados en su expectsolución funcionan cuando se ingresan manualmente. No funcionan en este expectscript ni en ninguna variación que haya probado hasta ahora.
MountainX-for-Monica
5

Otra opción para evitar esos mensajes de advertencia es ejecutar x11vncen un pseudo-terminal creado por un comando UNIX (consulte Uso de pseudo-terminales (pty) para controlar programas interactivos ). Esto se puede hacer con el scriptcomando o herramientas como pdip("Diálogo programado con programas interactivos").

Los mensajes de advertencia en Mac OS X 10.6.8 por no proporcionar un pseudo terminal para 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

Soluciones usando el 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
kalou
fuente
1

Sudo tiene una opción -Sque le permite leer el passwd de 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::::::

Aquí hay un script de ejemplo para demostrar el proceso:

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

Su script, simplemente necesitaría hacer algo como:

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

Esto le permitiría usar comandos sudo en su script sin tener que codificar una contraseña.

Alternativamente, puede agregar a su usuario, o un subconjunto de usuarios, la capacidad de ejecutar x11vnc con sudo, sin una contraseña, pero agregando una línea como esta para /etc/sudoers:

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

O cree un vncusersgrupo, agregue usuarios a ese grupo y agregue lo siguiente a /etc/sudoers:

%vncusers    ALL=(root) NOPASSWD: /path/to/x11vnc
Tim Kennedy
fuente
Gracias. Sin embargo, el error no proviene sudo, proviene x11vnc -storepassword.
MountainX-for-Monica