erro do script bash stty: entrada padrão: ioctl inapropriado para o dispositivo

11

Estou usando aqui - documentos em um script bash para automatizar a instalação e configuração onde uma senha é necessária muitas vezes. Eu digitei a senha uma vez e o script a passou para os vários comandos. Na maioria dos casos, a abordagem here-document lida com essa coima. No entanto, em um caso, recebo este erro:

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

Por favor, note que esta mensagem de erro é de x11vnc -storepassword (não de sudo .)

Meu problema está relacionado a x11vnc -storepasswd e aqui está meu código:

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

Isso obviamente (do erro) não funciona. Eu apreciaria um exemplo prático de como implementar sudo x11vnc -storepasswd ~/.vnc/passwd em um script.

Caso isso ajude, os prompts se parecem com isso:

Enter VNC password:
Verify password:
Write password to /home/user/.vnc/passwd? [y]/n n

O uso de expect será uma solução melhor? Se sim, como eu usaria isso nesse caso? (Eu nunca usei expect antes, mas eu observei muitos exemplos desde postar essa pergunta e não consigo fazer com que expect trabalhe sozinho.)

    
por MountainX 11.07.2013 / 17:59

3 respostas

1

x11vnc espera que sua entrada padrão seja um terminal e altera o modo do terminal para evitar ecoar a senha enquanto você digita. Quando a entrada padrão não é um terminal, as chamadas stty desligam e retornam o eco, o aviso que você vê.

A expectativa é de fato uma solução. Experimente este script (não testado):

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

Como alternativa, se puder, use um método de autenticação diferente de RFB ( -passwdfile ou um certificado de cliente SSL).

    
por 12.07.2013 / 00:59
4

Outra opção para evitar essas mensagens de aviso é executar x11vnc em um pseudo-terminal criado por um comando UNIX (veja Usando pseudo-terminais (pty) para controlar programas interativos ). Isso pode ser feito com o comando script ou com ferramentas como pdip ("Diálogo Programado com Programas Interativos").

As mensagens de aviso no Mac OS X 10.6.8 por não fornecer um 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

Soluções usando o comando script :

# 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
    
por 03.02.2014 / 20:18
1

O Sudo tem uma opção -S que permite ler a senha do 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::::::

Aqui está um script de exemplo para demonstrar o 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

Seu script simplesmente precisa fazer algo como:

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

Isso permitiria que você usasse comandos sudo em seu script sem ter que codificar uma senha.

Como alternativa, você pode adicionar ao seu usuário, ou a um subconjunto de usuários, a capacidade de executar o x11vnc com o sudo, sem uma senha, mas adicionando uma linha como essa a /etc/sudoers :

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

Ou crie um grupo vncusers , adicione usuários a esse grupo e adicione o seguinte a /etc/sudoers :

%vncusers    ALL=(root) NOPASSWD: /path/to/x11vnc
    
por 11.07.2013 / 22:56