ข้อผิดพลาดสคริปต์ bash stty: อินพุตมาตรฐาน: ioctl ที่ไม่เหมาะสมสำหรับอุปกรณ์


16

ฉันใช้เอกสารที่นี่ในสคริปต์ทุบตีเพื่อทำการติดตั้งและตั้งค่าอัตโนมัติซึ่งต้องใช้รหัสผ่านหลายครั้ง ฉันป้อนรหัสผ่านหนึ่งครั้งและสคริปต์จะส่งไปยังคำสั่งต่างๆ ในกรณีส่วนใหญ่วิธีการที่นี่เอกสารจัดการปรับนี้ อย่างไรก็ตามในกรณีหนึ่งฉันได้รับข้อผิดพลาดนี้:

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 ถูกต้องขอโทษฉันผิดคำถาม นี่คือสคริปต์คาดหวัง (ยังไม่ทดลองทั้งหมด)
Gilles 'หยุดความชั่วร้าย'

ขอขอบคุณ. สคริปต์ที่ยังไม่ผ่านการทดสอบของคุณให้เบาะแสเพิ่มเติมกับฉันเล็กน้อย แต่ในที่สุดสคริปต์จะไม่ทำงานโดยไม่มีข้อผิดพลาด ข้อผิดพลาดเป็นเพียงบนเส้นEnter VNC password: usage: send [args] string expect "password:" {send "swordfish" "\r"}ฉันไม่แน่ใจว่าจะแก้ไขได้อย่างไร คาดว่าน่าจะเป็นเครื่องมือที่พิถีพิถันมากเพราะฉันได้รับการหลอกกับปัญหานี้เป็นเวลาหลายชั่วโมงโดยไม่มีผลการทำงาน
MountainX-for-Monica

ข้อผิดพลาด (เหนือ comment) มาจากและมันก็แก้ไขได้โดยการ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

Sudo มีตัวเลือก-Sที่อนุญาตให้อ่าน passwd จาก 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.