비밀번호가 여러 번 필요한 곳에 설치 및 설정을 자동화하기 위해 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
스스로 일할 수는 없습니다 .)
답변
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 클라이언트 인증서)을 사용하십시오.
답변
이러한 경고 메시지를 피하는 또 다른 옵션 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
답변
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 명령을 사용할 수 있습니다.
또는 암호없이 sudo를 사용하여 x11vnc를 실행할 수있는 기능 또는 사용자의 하위 집합을 추가 할 수 있습니다 /etc/sudoers
.
user ALL=(root) NOPASSWD: /path/to/x11vnc
또는 vncusers
그룹을 작성하고 해당 그룹에 사용자를 추가 한 후 다음을 추가하십시오 /etc/sudoers
.
%vncusers ALL=(root) NOPASSWD: /path/to/x11vnc