błąd skryptu bash stty: standardowe wejście: niewłaściwy ioctl dla urządzenia


16

Korzystam z dokumentów tutaj w skrypcie bash, aby zautomatyzować instalację i konfigurację, w której hasło jest wymagane wiele razy. Podaję hasło raz, a skrypt przekazuje je do różnych poleceń. W większości przypadków podejście oparte na dokumencie obsługuje tę grzywnę. Jednak w jednym przypadku pojawia się ten błąd:

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

Zauważ, że ten komunikat o błędzie pochodzi z x11vnc -storepassword(nie z sudo).

Mój problem dotyczy x11vnc -storepasswdi oto mój kod:

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

To oczywiście (z błędu) nie działa. Byłbym wdzięczny za działający przykład implementacji sudo x11vnc -storepasswd ~/.vnc/passwdw skrypcie.

W razie potrzeby monity wyglądają następująco:

Wprowadź hasło VNC:
Potwierdź hasło:
Zapisać hasło do /home/user/.vnc/passwd? [y] / nn

Czy używanie expectbędzie lepszym rozwiązaniem? Jeśli tak, jak miałbym go użyć w tym przypadku? (Nigdy wcześniej nie korzystałem, expectale od czasu zamieszczenia tego pytania sprawdziłem wiele przykładów i nie mogę expectsamodzielnie pracować).

Odpowiedzi:


3

x11vncoczekuje, że jego standardowym wejściem będzie terminal i zmieni tryb terminalu, aby uniknąć echa hasła podczas pisania. Gdy standardowe wejście nie jest terminalem, sttywywołania, aby wyłączyć echo i włączyć ponownie, kończą się niepowodzeniem, stąd ostrzeżenie, które widzisz.

Oczekiwanie jest rzeczywiście rozwiązaniem. Wypróbuj ten skrypt (niesprawdzony):

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

Alternatywnie, jeśli możesz, użyj metody uwierzytelniania innej niż RFB ( -passwdfilelub certyfikat klienta SSL).


Dzięki. Jednak błąd nie pochodzi z sudoniego pochodzi x11vnc -storepassword. Próbowałem różnych expectpodejść i wydaje mi się, że nie potrafię tego zrobić poprawnie. Byłby bardzo wdzięczny przykład użycia expecthasła do x11vnc -storepassword. Zaktualizuję moje pytanie, aby uniknąć dalszych nieporozumień.
MountainX-for-Monica,

@MountainX Racja, przepraszam, źle przeczytałem pytanie. Oto skrypt oczekiwania (całkowicie niesprawdzony).
Gilles „SO- przestań być zły”

Dziękuję Ci. Twój nieprzetestowany skrypt dał mi kilka dodatkowych wskazówek, ale ostatecznie nie działa bez błędów. Błąd jest po prostu Enter VNC password: usage: send [args] stringna linii expect "password:" {send "swordfish" "\r"}. Nie jestem pewien, jak to naprawić. Spodziewaj się, że wydaje się być bardzo wybrednym narzędziem, ponieważ oszukuję ten konkretny problem od wielu godzin, nie osiągając jeszcze wyników.
MountainX-for-Monica,

Błąd (powyżej komentarza) pochodził send "swordfish" "\r"i został rozwiązany przez send "swordfish\r". Jednak rozwiązanie nadal nie działa. Żadne hasło nie jest zapisywane do ~ / .vnc / passwd. Nadal nie mam pojęcia, dlaczego. Jak powiedziałem, widziałem ten wynik, pomimo próbowania wszystkiego, co do tej pory myślę.
MountainX-for-Monica,

BTW, te same polecenia użyte w expectrozwiązaniu działają po ręcznym wprowadzeniu. Nie działają one w tym expectskrypcie ani w żadnej jego odmianie, której do tej pory próbowałem.
MountainX-for-Monica,

5

Inną opcją uniknięcia tych komunikatów ostrzegawczych jest wykonanie x11vncw pseudo-terminalu utworzonym przez komendę UNIX (patrz Używanie pseudo-terminali (pty) do sterowania programami interaktywnymi ). Można tego dokonać za pomocą scriptpolecenia lub narzędzi, takich jak pdip(„Programowany dialog z programami interaktywnymi”).

Komunikaty ostrzegawcze w systemie Mac OS X 10.6.8 z powodu braku pseudo-terminala dla 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

Rozwiązania wykorzystujące scriptpolecenie:

# 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 ma opcję, -Sktóra pozwala odczytać passwd ze 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::::::

Oto przykładowy skrypt pokazujący proces:

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

Twój skrypt musiałby po prostu zrobić coś takiego:

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

Umożliwiłoby to użycie poleceń sudo w skrypcie bez konieczności kodowania hasła.

Alternatywnie możesz dodać użytkownika lub podzbiór użytkowników, możliwość uruchamiania x11vnc z sudo, bez hasła, ale dodając taką linię do /etc/sudoers:

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

Lub utwórz vncusersgrupę, dodaj użytkowników do tej grupy i dodaj następujące elementy do /etc/sudoers:

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

Dzięki. Jednak błąd nie pochodzi z sudoniego pochodzi x11vnc -storepassword.
MountainX-for-Monica,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.