bash script error stty : 표준 입력 : 장치에 부적절한 ioctl


16

비밀번호가 여러 번 필요한 곳에 설치 및 설정을 자동화하기 위해 bash 스크립트에서 here-documents를 사용하고 있습니다. 암호를 한 번 입력하면 스크립트가 암호를 다양한 명령에 전달합니다. 대부분의 경우 here-document 접근법은이 문제를 처리합니다. 그러나 어떤 경우에는이 오류가 발생합니다.

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에 비밀번호 쓰기? [y] / nn

사용 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 맞습니다. 죄송합니다. 질문을 잘못 읽었습니다. 다음은 expect 스크립트입니다 (완전히 테스트되지 않은).
Gilles 'SO- 악한 중지'

감사합니다. 테스트하지 않은 스크립트는 몇 가지 추가 힌트를 주었지만 궁극적으로는 오류없이 실행되지 않습니다. 오류는 단순히 Enter VNC password: usage: send [args] string라인에 expect "password:" {send "swordfish" "\r"}있습니다. 어떻게 고칠 지 잘 모르겠습니다. 작업 결과없이 몇 시간 동안이 특정 문제를 속이고 있었기 때문에 Expect는 매우 까다로운 도구 인 것 같습니다.
MountainX-for-Monica

오류 (의견 위)가 와서에 send "swordfish" "\r"의해 해결되었습니다 send "swordfish\r". 그러나 솔루션이 여전히 작동하지 않습니다. ~ / .vnc / passwd에 암호가 작성되지 않았습니다. 나는 왜 그런지에 대해서는 여전히 단서가 없다. 내가 말했듯이, 나는 지금까지 생각할 수있는 모든 것을 시도했지만이 결과를 보았습니다.
MountainX-for-Monica

BTW, expect솔루션에 사용 된 것과 동일한 명령 이 수동으로 입력 될 때 작동합니다. 그들은 expect지금까지 시도한 이 스크립트 또는 그 변형 에서 작동하지 않습니다 .
MountainX-for-Monica

5

이러한 경고 메시지를 피하는 또 다른 옵션 x11vnc은 UNIX 명령으로 작성된 의사 터미널에서 실행하는 것 입니다 (pse)를 사용하여 대화식 프로그램 제어 참조 ). ( "대화 형 프로그램과 프로그램 대화")와 script같은 명령 또는 도구를 사용하여 수행 할 수 있습니다 pdip.

대한 의사 단자를 제공하지 않는 맥 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에는 -SSTDIN에서 비밀번호를 읽을 수 있는 옵션 이 있습니다.

[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 명령을 사용할 수 있습니다.

또는 암호없이 sudo를 사용하여 x11vnc를 실행할 수있는 기능 또는 사용자의 하위 집합을 추가 할 수 있습니다 /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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.