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

15

Estou usando documentos aqui em um script bash para automatizar a instalação e a configuração em que uma senha é necessária várias vezes. Eu digito a senha uma vez e o script a transmite aos vários comandos. Na maioria dos casos, a abordagem do documento aqui lida com isso. 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

Observe que esta mensagem de erro é de x11vnc -storepassword(não desudo .)

Meu problema está relacionado x11vnc -storepasswde aqui está o meu código:

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

Isso obviamente (do erro) não funciona. Eu apreciaria um exemplo de trabalho de como implementarsudo x11vnc -storepasswd ~/.vnc/passwd em um script.

Caso isso ajude, os prompts ficam assim:

Digite a senha do VNC:
Verifique a senha:
Escreva a senha em /home/user/.vnc/passwd? [y] / nn

Usar expectserá uma solução melhor? Se sim, como eu o usaria neste caso? (Eu nunca usei expectantes, mas observei muitos exemplos desde a publicação desta pergunta e não consigo expecttrabalhar por conta própria.)

MountainX-for-Monica
fonte

Respostas:

3

x11vncespera que sua entrada padrão seja um terminal e altera o modo do terminal para evitar repetir a senha enquanto você digita. Quando a entrada padrão não é um terminal, ostty chamadas para desativar e reativar o eco falham, daí o aviso que você vê.

Esperar é realmente 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 você puder, use um método de autenticação diferente de RFB ( -passwdfileou um certificado de cliente SSL).

Gilles 'SO- parar de ser mau'
fonte
Obrigado. No entanto, o erro não está vindo sudo, está vindo x11vnc -storepassword. Eu tenho tentado várias expectabordagens e não consigo acertar. Um exemplo usando expectpara digitar uma senha x11vnc -storepasswordseria muito apreciado. Vou atualizar minha pergunta para evitar mais confusão.
MountainX-para-Monica
@ MountainX Certo, desculpe, eu interpretei mal a pergunta. Aqui está um script esperado (completamente não testado).
Gilles 'SO- stop be evil'
Obrigado. Seu script não testado me deu algumas dicas adicionais, mas, em última análise, também não é executado sem erros. O erro está simplesmente Enter VNC password: usage: send [args] stringna linha expect "password:" {send "swordfish" "\r"}. Não sei como consertar isso. Esperar parece ser uma ferramenta muito exigente, porque eu tenho brincado com esse problema em particular por horas sem resultados de trabalho ainda.
MountainX-for-Monica
O erro (comentário acima) veio send "swordfish" "\r"e foi resolvido por send "swordfish\r". No entanto, a solução ainda não funciona. Nenhuma senha é gravada em ~ / .vnc / passwd. Ainda estou sem noção do porquê. Como eu disse, tenho visto esse resultado apesar de tentar tudo o que consigo pensar até agora.
MountainX-for-Monica
BTW, os mesmos comandos usados ​​na sua expectsolução funcionam quando inseridos manualmente. Eles não funcionam neste expectscript ou em nenhuma variação dele que eu tentei até agora.
MountainX-para-Monica
5

Outra opção para evitar essas mensagens de aviso é executar x11vncem um pseudo-terminal criado por um comando UNIX (consulte Usando pseudo-terminais (pty) para controlar programas interativos ). Isso pode ser feito com o scriptcomando ou 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 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
fonte
1

O Sudo tem uma opção -Sque 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 exemplo de script 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 precisaria simplesmente 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 no seu script sem precisar codificar uma senha.

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

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

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

%vncusers    ALL=(root) NOPASSWD: /path/to/x11vnc
Tim Kennedy
fonte
Obrigado. No entanto, o erro não está vindo sudo, está vindo x11vnc -storepassword.
MountainX-para-Monica