ошибка 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к работе самостоятельно.)

MountainX-для-Моника
источник

Ответы:

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
Кстати, те же команды, которые используются в вашем 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

У Sudo есть опция -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