किसी अन्य उपयोगकर्ता के रूप में su'ed करते समय 'स्क्रिप्ट' को रीडायरेक्ट करने के लिए / dev / null / 'स्क्रीन' को काम करने की अनुमति क्यों देता है?


36

मुझे एक विशेष लंबी चलने वाली स्क्रिप्ट को चलाने के लिए एक उपयोगकर्ता पर मुकदमा दायर किया गया था। मैं स्क्रीन का उपयोग करना चाहता था, लेकिन मुझे त्रुटि संदेश मिला "आपका टर्मिनल नहीं खोल सकता / dev / pts / 4 '- कृपया जांचें।"

इसलिए मैं चारों ओर घूम गया और एक मंच पोस्ट पर आया जिसे चलाने का निर्देश दिया $ script '/dev/null/'। मैंने ऐसा किया और फिर मैं स्क्रीन कर सकता था।

यह काम क्यों करता है? Su क्या है जो स्क्रीन su'ed उपयोगकर्ता के रूप में नहीं चल सकता है? पुन: निर्देशन 'स्क्रिप्ट' को / dev / null में क्यों करता है जिसे अन्यथा रोका जाता है? कहीं मूल उपयोगकर्ता के रूप में लॉग लिखने के लिए स्क्रिप्ट का उपयोग कर रहा है?


2
क्लीनर suएक स्क्रीन सत्र के भीतर से चलाया जाएगा ।
Justarobert

@justarobert नहीं यदि आप चाहते हैं कि कई उपयोगकर्ता सेवा / बैच-स्क्रिप्ट-चल रहे खाते के लिए उसी स्क्रीन से जुड़ सकें।
एशले

जवाबों:


40

ठीक है, तकनीकी रूप से आप यहां कुछ भी पुनर्निर्देशित नहीं कर रहे हैं।

script /dev/nullसिर्फ कॉल scriptकरने से पूरे टाइपस्क्रिप्ट को सहेजा जाता है /dev/nullजिसमें व्यवहार का मतलब है कि सामग्री को छोड़ देना।

कार्यान्वयन के man scriptलिए विस्तृत जानकारी और उपयोग -लिनेक्स-एनजी पैकेज देखें ( misc-utils/script.c)।

इसका screenवास्तव में कोई लेना-देना नहीं है । यह काम क्यों शुरू हो रहा है script, आपके लिए छद्म टर्मिनल बनाने का साइड इफेक्ट है /dev/pts/X। इस तरह से आपको इसे स्वयं करने की आवश्यकता नहीं है, और स्क्रीन पर अनुमति के मुद्दे नहीं होंगे - यदि आप suउपयोगकर्ता A से उपयोगकर्ता B तक , तो सीधे screenआपको आमंत्रित करके उपयोगकर्ता A के छद्म टर्मिनल पर कब्ज़ा करने की कोशिश करते हैं । जब तक आप रूट नहीं करेंगे यह सफल नहीं होगा । इसलिए आपको त्रुटि संदेश दिखाई देता है।


6

अपनी टर्मिनल विंडो पर सीधे आउटपुट के लिए, रनिंग प्रोग्राम को आपके कंट्रोलिंग टर्मिनल पर लिखने में सक्षम होना चाहिए। यदि आप एक xterm या ssh या किसी अन्य वर्चुअल कनेक्शन का उपयोग कर रहे हैं (जैसा कि वास्तविक लाइव कनेक्टेड टर्मिनल के विपरीत है) तो आपका कंट्रोलिंग टर्मिनल एक छद्म ट्टी (pty) है।

जब आप लॉग ऑन करते हैं तो केवल आपके लिए ही आपकी अनुमति की अनुमति होती है, अन्यथा अन्य उपयोगकर्ता आपके डिस्प्ले पर स्क्रिबल कर सकते हैं (या इसे पढ़ सकते हैं)। इस प्रकार जब आप किसी अन्य उपयोगकर्ता पर मुकदमा करते हैं (और वह उपयोगकर्ता रूट नहीं है), तो उस उपयोगकर्ता के पास अंतर्निहित pty तक पहुँच नहीं है।

हालाँकि, अधिक जटिल I / O जैसे कि स्क्रीन को आपके संपूर्ण स्क्रीन को नियंत्रित करने के जादू का काम करने के लिए पेंटी तक सीधे पहुंच की आवश्यकता होती है। जब आप कमांड चलाने वाले व्यक्ति के साथ समस्याओं के लिए नियंत्रित टर्मिनल तक उचित पहुंच नहीं रखते हैं।

स्क्रिप्ट को / dev / null में रीडायरेक्ट करने से स्क्रीन नियंत्रित टर्मिनल पर लिखने का प्रयास नहीं करती है, इसलिए यह अनुमति की समस्या से नहीं टकराती है।


2
तो मैं कैसे देख पा रहा हूं कि क्या स्क्रीन लिखता है अगर यह / dev / null पर जाता है? मुझे पूरा यकीन है कि मुझे गलत समझा गया है और यह वास्तव में / देव / अशक्त नहीं है, लेकिन यह कहां जाता है?
उपयोगकर्ता 63623

"यह", जिसका अर्थ है स्क्रीन आउटपुट, पर नहीं जाता है /dev/null। पहला: स्क्रिप्ट आपके सत्र को रिकॉर्ड करती है (मैनपेज देखें), और आपको इसकी बिल्कुल भी आवश्यकता नहीं है: ताकि यह / dev / null पर जाए। लेकिन इसका कोई साइड-इफ़ेक्ट नहीं है: यह एक छद्म टर्मिनल बनाता है, और अब आप इसका उपयोग कर रहे हैं, और स्क्रीन इस oneSee @ karol-piczak के awer में लिख सकते हैं।
नन्ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.