bash script stty: đầu vào tiêu chuẩn: ioctl không phù hợp cho thiết bị


15

Tôi đang sử dụng tài liệu ở đây trong tập lệnh bash để tự động cài đặt và thiết lập trong đó mật khẩu được yêu cầu nhiều lần. Tôi nhập mật khẩu một lần và tập lệnh chuyển nó đến các lệnh khác nhau. Trong hầu hết các trường hợp, cách tiếp cận tài liệu ở đây xử lý tốt điều này. Tuy nhiên, trong một trường hợp tôi gặp lỗi này:

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

Xin lưu ý rằng thông báo lỗi này là từ x11vnc -storepassword(không phải từ sudo.)

Vấn đề của tôi liên quan đến x11vnc -storepasswdvà đây là mã của tôi:

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

Điều đó rõ ràng (từ lỗi) không hoạt động. Tôi sẽ đánh giá cao một ví dụ hoạt động về cách thực hiện sudo x11vnc -storepasswd ~/.vnc/passwdtrong một kịch bản.

Trong trường hợp nó giúp, các lời nhắc trông như thế này:

Nhập mật khẩu VNC:
Xác minh mật khẩu:
Viết mật khẩu vào /home/user/.vnc/passwd? [y] / nn

Sẽ sử dụng expectlà một giải pháp tốt hơn? Nếu vậy, làm thế nào tôi sẽ sử dụng nó trong trường hợp này? (Tôi chưa bao giờ sử dụng expecttrước đây nhưng tôi đã xem xét rất nhiều ví dụ kể từ khi đăng câu hỏi này và tôi không thể expecttự mình làm việc.)

Câu trả lời:


3

x11vnchy vọng đầu vào tiêu chuẩn của nó là một thiết bị đầu cuối và nó thay đổi chế độ thiết bị đầu cuối để tránh lặp lại mật khẩu khi bạn nhập. Khi đầu vào tiêu chuẩn không phải là thiết bị đầu cuối, các sttycuộc gọi để tắt tiếng vang và bật lại không thành công, do đó cảnh báo mà bạn nhìn thấy.

Mong đợi thực sự là một giải pháp. Hãy thử tập lệnh này (chưa được kiểm tra):

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

Ngoài ra, nếu bạn có thể, hãy sử dụng phương thức xác thực khác với RFB ( -passwdfilehoặc chứng chỉ ứng dụng khách SSL).


Cảm ơn. Tuy nhiên, lỗi không đến từ sudonó đến từ x11vnc -storepassword. Tôi đã thử nhiều expectcách tiếp cận khác nhau và dường như tôi không thể hiểu đúng. Một ví dụ sử dụng expectđể nhập mật khẩu x11vnc -storepasswordsẽ được đánh giá rất cao. Tôi sẽ cập nhật câu hỏi của tôi để tránh nhầm lẫn thêm.
MountainX cho Monica Cellio

@MaxX Phải, xin lỗi, tôi đã đọc sai câu hỏi. Đây là một kịch bản mong đợi (hoàn toàn chưa được kiểm tra).
Gilles 'SO- ngừng trở nên xấu xa'

Cảm ơn bạn. Kịch bản chưa được kiểm tra của bạn đã cho tôi một vài manh mối bổ sung, nhưng cuối cùng nó cũng không chạy mà không có lỗi. Lỗi chỉ đơn giản là Enter VNC password: usage: send [args] stringtrên dòng expect "password:" {send "swordfish" "\r"}. Tôi không chắc làm thế nào để khắc phục điều đó. Hy vọng dường như là một công cụ rất kén chọn bởi vì tôi đã đánh lừa vấn đề đặc biệt này trong nhiều giờ mà không có kết quả làm việc nào.
MountainX cho Monica Cellio

Lỗi (nhận xét trên) đã đến từ send "swordfish" "\r"và nó đã được khắc phục bằng send "swordfish\r". Tuy nhiên, giải pháp vẫn không hiệu quả. Không có mật khẩu được ghi vào ~ / .vnc / passwd. Tôi vẫn không biết tại sao. Như tôi đã nói, tôi đã nhìn thấy kết quả này mặc dù đã thử mọi thứ tôi có thể nghĩ cho đến nay.
MountainX cho Monica Cellio

BTW, các lệnh tương tự được sử dụng trong expectgiải pháp của bạn hoạt động khi được nhập thủ công. Chúng không hoạt động trong expectkịch bản này hoặc bất kỳ biến thể nào của nó mà tôi đã thử cho đến nay.
MountainX cho Monica Cellio

5

Một tùy chọn khác để tránh các thông báo cảnh báo đó là thực thi x11vnctrong thiết bị đầu cuối giả được tạo bởi lệnh UNIX (xem Sử dụng thiết bị đầu cuối giả (pty) để điều khiển các chương trình tương tác ). Điều này có thể được thực hiện bằng scriptlệnh hoặc các công cụ như pdip("Đối thoại được lập trình với các chương trình tương tác").

Các thông báo cảnh báo trên Mac OS X 10.6.8 vì không cung cấp thiết bị đầu cuối giả cho 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

Giải pháp sử dụng scriptlệnh:

# 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 có một tùy chọn -Scho phép nó đọc mật khẩu từ 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::::::

Dưới đây là một kịch bản ví dụ để chứng minh quá trình:

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

Kịch bản của bạn, đơn giản chỉ cần làm một cái gì đó như:

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

Điều này sẽ cho phép bạn sử dụng các lệnh sudo trong tập lệnh của mình mà không cần phải mã hóa mật khẩu.

Ngoài ra, bạn có thể thêm người dùng hoặc tập hợp con của người dùng, khả năng chạy x11vnc bằng sudo, không cần mật khẩu, nhưng thêm một dòng như thế này vào /etc/sudoers:

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

Hoặc tạo một vncusersnhóm, thêm người dùng vào nhóm đó và thêm các mục sau vào /etc/sudoers:

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

Cảm ơn. Tuy nhiên, lỗi không đến từ sudonó đến từ x11vnc -storepassword.
MountainX cho Monica Cellio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.