помилка скрипта bash stty: стандартний ввід: невідповідний ioctl для пристрою


16

Я використовую тут-документи у bash-скрипті для автоматизації встановлення та налаштування, де потрібно багато разів вводити пароль. Я вводжу пароль один раз, і сценарій передає його різним командам. У більшості випадків підхід із документа тут справляється із цим штрафом. Однак в одному випадку я отримую цю помилку:

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

Зауважте, що це повідомлення про помилку походить від x11vnc -storepassword(не від sudo.)

Моя проблема пов'язана з x11vnc -storepasswdі ось мій код:

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

Що очевидно (з помилки) не працює. Я би вдячний робочим прикладом того, як реалізувати sudo x11vnc -storepasswd ~/.vnc/passwdсценарій.

Якщо це допомагає, підказки виглядають так:

Введіть пароль VNC:
Підтвердьте пароль:
Напишіть пароль на /home/user/.vnc/passwd? [у] / нн

Чи буде використання expectкращого рішення? Якщо так, то як би я використовував це в цьому випадку? (Я ніколи expectраніше не використовував, але я переглянув безліч прикладів з моменту розміщення цього питання, і я не можу expectсамостійно працювати.)

Відповіді:


3

x11vncочікує, що його стандартним входом стане термінал, і він змінює режим терміналу, щоб уникнути повторення пароля під час введення тексту. Якщо стандартний вхід не є терміналом, sttyдзвінки, щоб вимкнути і знову відмовитись, отже, ви побачите попередження.

Очікування справді є рішенням. Спробуйте цей сценарій (неперевірений):

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

Якщо ви можете, скористайтеся методом аутентифікації, відмінним від RFB ( -passwdfileабо SSL-клієнтського сертифіката).


Спасибі. Однак помилка не sudoє, оскільки вона надходить x11vnc -storepassword. Я пробував різні expectпідходи, і не можу, здається, правильно це зробити. Приклад, що використовує expectдля введення пароля для x11vnc -storepassword, буде дуже вдячний. Я оновлю своє питання, щоб уникнути подальшої плутанини.
MountainX-for-Monica

@MountainX Правильно, вибачте, я неправильно прочитав це питання. Ось сценарій очікування (повністю неперевірений).
Жил "ТАК - перестань бути злим"

Дякую. Ваш неперевірений сценарій дав мені кілька додаткових підказок, але в кінцевому підсумку він також не працює без помилок. Помилка просто Enter VNC password: usage: send [args] stringна лінії expect "password:" {send "swordfish" "\r"}. Я не впевнений, як це виправити. Очікування, здається, є дуже прискіпливим інструментом, тому що я без проблем працював цією проблемою годинами.
MountainX-for-Monica

Помилка (вище коментар) надходила, send "swordfish" "\r"і її вирішили send "swordfish\r". Однак рішення все ще не працює. На ~ / .vnc / passwd не записується пароль. Я досі не знаю, чому. Як я вже говорив, я бачив цей результат, незважаючи на те, що намагаюся досі придумати.
MountainX-for-Monica

BTW, ті самі команди, які використовувались у вашому expectрішенні, працюють при ручному введенні. Вони не працюють у цьому expectсценарії або будь-якій його зміні, яку я намагався до цього часу.
MountainX-for-Monica

5

Іншим варіантом уникнення цих попереджувальних повідомлень є виконання x11vncв псевдотерміналі, створеному командою UNIX (див. Використання псевдотерміналів (pty) для управління інтерактивними програмами ). Це можна зробити за допомогою scriptкоманди або таких інструментів, якpdip ("Запрограмований діалог з інтерактивними програмами").

Попереджувальні повідомлення в Mac OS X 10.6.8 про ненадання псевдотерміналу для 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

Рішення за допомогою 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

1

Судо має опцію, -Sяка дозволяє йому читати пароль із 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::::::

Ось приклад сценарію для демонстрації процесу:

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

Ваш сценарій просто повинен зробити щось на кшталт:

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

Це дозволить вам використовувати команди sudo у своєму сценарії без необхідності жорсткого коду.

Крім того, ви можете додати своєму користувачеві або підмножині користувачів можливість запускати x11vnc за допомогою sudo, без пароля, але додавши такий рядок до /etc/sudoers:

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

Або створити vncusersгрупу, додати користувачів до неї та додати /etc/sudoers:

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

Спасибі. Однак помилка не sudoє, оскільки вона надходить x11vnc -storepassword.
MountainX-for-Monica
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.