बैश स्क्रिप्ट त्रुटि स्ट्टी: मानक इनपुट: डिवाइस के लिए अनुचित 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 सही है, क्षमा करें, मैं इस प्रश्न को गलत समझूंगा। यहाँ एक उम्मीद की स्क्रिप्ट (पूरी तरह से अप्रयुक्त) है।
गिल्स एसओ- बुराई को रोकना '

धन्यवाद। आपकी अप्रमाणित स्क्रिप्ट ने मुझे कुछ अतिरिक्त सुराग दिए, लेकिन अंततः यह भी त्रुटियों के बिना नहीं चलता है। त्रुटि बस Enter VNC password: usage: send [args] stringलाइन पर है expect "password:" {send "swordfish" "\r"}। मुझे यकीन नहीं है कि इसे कैसे ठीक किया जाए। उम्मीद करना एक बहुत ही अच्छा लगने वाला उपकरण है क्योंकि मैं इस विशेष समस्या के साथ घंटों तक बिना किसी नतीजे के बेवकूफ बना रहा हूं।
माउंटेनएक्स-फॉर-मोनिका

त्रुटि (ऊपर टिप्पणी) से आ रही थी send "swordfish" "\r"और इसे हल किया गया था send "swordfish\r"। हालाँकि, समाधान अभी भी काम नहीं करता है। कोई पासवर्ड ~ / .vnc / passwd को नहीं लिखा गया है। मैं अभी भी क्‍लूलेस हूं क्‍यों। जैसा कि मैंने कहा, मैं इस परिणाम को सब कुछ करने के बावजूद देख रहा हूं जो मैं अब तक सोच सकता हूं।
माउंटेनएक्स-फॉर-मोनिका

BTW, expectमैन्युअल रूप से दर्ज किए जाने पर आपके समाधान कार्य में उपयोग की जाने वाली समान कमांड । वे इस expectलिपि या इसके किसी भी रूपांतर में काम नहीं करते हैं जो मैंने अब तक करने की कोशिश की है।
माउंटेनएक्स-फॉर-मोनिका

5

उन चेतावनी संदेशों से बचने के लिए एक अन्य विकल्प x11vncUNIX कमांड द्वारा बनाए गए छद्म टर्मिनल में निष्पादित करना है (देखें इंटरैक्टिव प्रोग्राम को नियंत्रित करने के लिए छद्म टर्मिनलों का उपयोग करना )। यह scriptकमांड या टूल के साथ किया जा सकता है जैसे pdip("इंटरएक्टिव प्रोग्राम्स के साथ प्रोग्रामड डायलॉग")।

मैक ओएस एक्स 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

सूडो के पास एक विकल्प -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

धन्यवाद। हालाँकि, इसमें से त्रुटि नहीं आ sudoरही है x11vnc -storepassword
माउंटेनएक्स-फॉर-मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.