एक स्क्रिप्ट में कमांड एक-एक करके, स्वतंत्र रूप से निष्पादित होते हैं। स्क्रिप्ट ही स्क्रिप्ट में सभी आदेशों के जनक के रूप में है, एक और स्वतंत्र प्रक्रिया है और सु कमांड इसे रूट में परिवर्तित नहीं कर सकता है: र कमांड विशेष रूट विशेषाधिकार के साथ एक नई प्रक्रिया बनाता है।
उसके बाद su कमांड पूरी होती है, मूल प्रक्रिया, जो अभी भी उसी उपयोगकर्ता के रूप में चल रही है, बाकी स्क्रिप्ट को निष्पादित करेगी।
आप जो करना चाहते हैं, वह एक रैपर स्क्रिप्ट लिखें। उदाहरण के लिए विशेषाधिकार प्राप्त कमांड मुख्य स्क्रिप्ट में जाते हैं~/main.sh
#!/bin/sh
ls /root
रैपर स्क्रिप्ट मुख्य स्क्रिप्ट को रूट अनुमतियों के साथ कॉल करती है, जैसे
#!/bin/sh
su -c ~/main.sh root
इस प्रक्रिया को लॉन्च करने के लिए, आप रैपर को चलाते हैं, जो उपयोगकर्ता को रूट उपयोगकर्ता पर स्विच करने के बाद मुख्य स्क्रिप्ट लॉन्च करता है।
इस रैपर तकनीक का उपयोग स्क्रिप्ट को अपने आसपास के आवरण में बदलने के लिए किया जा सकता है। मूल रूप से यह देखने के लिए जांचें कि क्या यह रूट के रूप में चल रहा है, यदि नहीं, तो खुद को फिर से लॉन्च करने के लिए "सु" का उपयोग करें।
$ 0 एक स्क्रिप्ट बनाने का एक आसान तरीका है, जो स्वयं को संदर्भित करता है, और whoami कमांड हमें बता सकती है कि हम कौन हैं (क्या हम जड़ हैं?)
तो अंतर्निहित आवरण के साथ मुख्य स्क्रिप्ट बन जाती है
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
निष्पादन के उपयोग पर ध्यान दें। इसका अर्थ है "इस कार्यक्रम को प्रतिस्थापित करें", जो प्रभावी रूप से अपने निष्पादन को समाप्त करता है और नए कार्यक्रम की शुरुआत करता है, जो सु द्वारा शुरू किया गया है, जड़ से, ऊपर से चलाने के लिए। प्रतिस्थापन उदाहरण "रूट" है, इसलिए यह सही पक्ष को निष्पादित नहीं करता है ||
sudo su
मेरी आँखों को चोट पहुँचाता है।