क्या chmod 000 / dev / stdin टर्मिनल को हमेशा के लिए निष्क्रिय कर देगा?


12

मैं यूनिक्स द टेक्स्टबुक (अध्याय 8, # 16, पृष्ठ 207) से प्रश्नों के माध्यम से काम कर रहा हूं :

chmodकमांड लाइन दें जो वही कार्य करें जो कमांड mesg nऔर mesg yकमांड करते हैं। (संकेत: आपके टर्मिनल सहित हर हार्डवेयर डिवाइस में /devडायरेक्टरी में एक संबद्ध फ़ाइल है ।)

मेरा मानना ​​है कि उत्तर है:

mesg n = chmod 770 /dev/stdout

mesg y = chmod 777 /dev/stdout

लेकिन मैं सोच रहा था कि क्या होगा यदि आप उपयोग करते हैं chmod 000 /dev/stdin?

क्या आप टर्मिनल में प्रवेश करने के आदेशों से बच गए हैं?


2
यह समझना महत्वपूर्ण है कि किसी फ़ाइल को खोलने पर अनुमतियाँ ही जाँची जाती हैं। इसलिए, कोई फर्क नहीं पड़ता कि आपके शेल का मानक इनपुट क्या होता है, इसकी अनुमतियों को बदलने से आप कमांड दर्ज करने से बाहर नहीं रहेंगे, क्योंकि शेल और टर्मिनल एमुलेटर या ssh या जो भी पहले से ही संचार चैनल खोल चुके हैं। mesg nप्रभावित करने के लिए भविष्य अनुमतियों का उपयोग कर सकते हैं writeरों सिर्फ इसलिए write नहीं है पहले से ही टर्मिनल खोला हुआ है।
zwol

जवाबों:


20

नहीं, /dev/stdinऔर /dev/stdoutगलत उपकरण हैं। ये टर्मिनल डिवाइस नहीं हैं, वे क्रमशः मानक इनपुट और मानक आउटपुट के लिए उपनाम हैं। मानक इनपुट और मानक आउटपुट, परिभाषा के अनुसार, फ़ाइल डिस्क्रिप्टर हैं जो एप्लिकेशन के खुले होने की उम्मीद करते हैं और उनका पारंपरिक अर्थ होता है (फाइल डिस्क्रिप्टर 0 और 1 क्रमशः, वहाँ भी 2 है जो मानक त्रुटि है)। जब एप्लिकेशन को किसी फ़ाइल नाम की आवश्यकता होती है, जैसे डिवाइस /dev/stdinऔर /dev/stdoutउपयोगी होते हैं, लेकिन एप्लिकेशन का उपयोगकर्ता यह चाहता है कि वह कुछ फ़ाइल खोलने के बजाय किसी विशेष फ़ाइल डिस्क्रिप्टर तक पहुंच सके। यूनिक्स संस्करण के आधार पर, वे डिवाइस फ़ाइल भी नहीं हो सकते हैं; उदाहरण के लिए, लिनक्स पर, वे प्रतीकात्मक लिंक हैं/proc/self/fd/0 और दोस्त, और ये बदले में "मैजिक" प्रतीकात्मक लिंक होते हैं जो भी प्रक्रिया उस फ़ाइल डिस्क्रिप्टर पर पहले से ही खुली है।

की अनुमतियों को बदलने /dev/stdinऔर /dev/stdoutकेवल तब ही बदल जाएगा जब इन फ़ाइल नामों का स्पष्ट रूप से उपयोग किया जाता है। यह टर्मिनल से संबंधित किसी भी चीज को प्रभावित नहीं करता है, और यह मानक इनपुट और मानक आउटपुट के सामान्य उपयोग को प्रभावित नहीं करता है, क्योंकि अनुमतियाँ केवल तब ही बात करती हैं जब एक विशेष फ़ाइल नाम खोलते हैं।

mesgप्रक्रिया के नियंत्रण टर्मिनल की अनुमतियों को बदलने के लिए क्या करना है । एक टर्मिनल में चल रहे एप्लिकेशन के लिए, टर्मिनल मानक इनपुट, मानक ouput और मानक त्रुटि (फ़ाइल डिस्क्रिप्टर 0, 1 और 2) पर खुला है। ttyटर्मिनल डिवाइस क्या है यह देखने के लिए आप कमांड का उपयोग कर सकते हैं । mesg nके बराबर है chmod g-w "$(tty)"और mesg yइसके बराबर है chmod g+w "$(tty)"


2
ttyनियंत्रण टर्मिनल की रिपोर्ट नहीं करता है, लेकिन यदि कोई हो तो स्टैण्ड पर खुला टर्मिनल। तो लिनक्स पर जहां / dev / stdin कोई डिवाइस नहीं है, लेकिन / dev / stdin पर खुलने वाली फ़ाइल के लिए एक विशेष सिमलिंक, chmot "$(tty)"कमोबेश उसी तरह होगा जैसे chmod /dev/stdin(यदि stdin एक tty डिवाइस है, और इसके मोड को बदलने का प्रयास करेगा not a ttyवर्तमान निर्देशिका में एक फ़ाइल अन्यथा)। /dev/$(ps -o tty= -p "$$")नियंत्रण टर्मिनल के लिए देखें ।
स्टीफन चेजलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.