एक शब्द में, "नहीं"।
लिनक्स निष्पादन योग्य और स्क्रिप्ट के बीच वास्तव में अंतर नहीं करता है; #!
शुरुआत में एक तरह से गिरी क्या कार्यक्रम इनपुट मूल्यांकन करने के लिए चलाने के लिए बताने के लिए है, लेकिन यह एक ही तरीका है एक स्क्रिप्ट निष्पादित किया जा सकता है।
इसलिए, उदाहरण के लिए, यदि मेरे पास एक स्क्रिप्ट है
$ cat x
#!/bin/sh
echo hello
फिर मैं इसे कमांड से चला सकता हूं
$ ./x
यह कर्नेल को प्रयास करने और उस पर अमल करने का कारण बनेगा, #!
और फिर /bin/sh x
इसके बजाय प्रभावी ढंग से चलाएं ।
हालाँकि मैं इनमें से किसी भी प्रकार को भी चला सकता था :
$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x
या और भी
. ./x
तो भले ही कर्नेल ने exec
परत पर हस्ताक्षर को लागू करने की कोशिश की हो, हम इसे केवल एक पैरामीटर के रूप में स्क्रिप्ट के साथ दुभाषिया चलाकर बाईपास कर सकते हैं।
इसका मतलब है कि हस्ताक्षर कोड को दुभाषिया में ही होना चाहिए। और क्या कोई उपयोगकर्ता हस्ताक्षर प्रवर्तन कोड के बिना किसी शेल की अपनी प्रति को संकलित करने से रोक सकता है ?
इसके मानक समाधान पर हस्ताक्षर का उपयोग नहीं करना है, लेकिन अनिवार्य अभिगम नियंत्रण (मैक) का उपयोग करना है, जैसे कि SELinux
। मैक सिस्टम के साथ आप यह निर्दिष्ट कर सकते हैं कि प्रत्येक उपयोगकर्ता को परतों को चलाने और संक्रमण करने की अनुमति क्या है। इसलिए, उदाहरण के लिए, आप कह सकते हैं "सामान्य उपयोगकर्ता कुछ भी चला सकते हैं लेकिन वेब सर्वर और CGI प्रक्रियाएं केवल /var/httpd
निर्देशिका से सामान एक्सेस कर सकती हैं , बाकी सब अस्वीकार कर दिया गया है"।