जवाबों:
मान लें कि आपके पास myscript
निम्नलिखित युक्त फ़ाइल है :
#!/bin/bash
echo "Hello, World!"
यदि आप इस फ़ाइल को निष्पादन योग्य बनाते हैं और इसे चलाते हैं ./myscript
, तो कर्नेल देखेंगे कि पहले दो बाइट्स हैं #!
, जिसका अर्थ है कि यह एक स्क्रिप्ट-फ़ाइल है। कर्नेल फिर दुभाषिया के रूप में शेष पंक्ति का उपयोग करेगा, और फ़ाइल को इसके पहले तर्क के रूप में पास करेगा। तो, यह चलता है:
/bin/bash myscript
और बैश फ़ाइल को पढ़ता है और इसमें शामिल कमांड्स को निष्पादित करता है।
इस प्रकार, बैश के लिए (या जो भी आपकी स्क्रिप्ट की व्याख्या करता है) स्क्रिप्ट को "निष्पादित" करने के लिए, इसे केवल फ़ाइल को पढ़ने में सक्षम होना चाहिए।
इसलिए, स्क्रिप्ट के लिए, निष्पादित बिट बस इसे निष्पादित करने के लिए थोड़ा अधिक सुविधाजनक बनाता है। जब तक bash निष्पादन योग्य है, तब तक आप हमेशा स्क्रिप्ट फ़ाइल को तर्क के रूप में चला सकते हैं, या bash को अंतःक्रियात्मक रूप से चला सकते हैं और स्क्रिप्ट लाइन को अपने टर्मिनल में लाइन से पेस्ट कर सकते हैं ताकि कमांड निष्पादित हो सके।
सुनिश्चित करें कि आप "शेल स्क्रिप्ट का उपयोग करके" शेल स्क्रिप्ट का उपयोग करके "शेल स्क्रिप्ट को निष्पादित नहीं कर रहे हैं" भ्रमित नहीं कर रहे हैं।
यह फ़ाइल अनुमतियों से प्रभावित नहीं होगा file.sh
:
sh file.sh
आप निष्पादित कर रहे हैं sh
(जो प्रोग्राम को हल करता है /bin/sh
), जो file.sh
कोड को पढ़ता है और निष्पादित करता है।
यदि आप वास्तव में स्वयं स्क्रिप्ट निष्पादित करते हैं, तो फ़ाइल अनुमतियों पर प्रभाव पड़ेगा :
./file.sh
ध्यान दें कि फ़ाइल अनुमतियां गैर-लिनक्स फाइल सिस्टम द्वारा समर्थित नहीं हैं, जैसे कि एफएटी। इसलिए यदि आप चलाते हैं chmod -x file.sh
, तब भी फ़ाइल के पास पूर्व अनुमति होगी।
फ़ाइल सिस्टम द्वारा निष्पादित अनुमति लागू है। लेकिन प्रोग्राम फ़ाइल सामग्री को पढ़कर कोड को "निष्पादित" भी कर सकते हैं, जो "निष्पादित" पर फाइल सिस्टम अनुमतियों को बायपास करता है।
bash
) को कॉल करके निष्पादित कर सकते हैं - ब्लॉक करने के लिए कि आपको उनकी read
अनुमति भी लेनी होगी ।
If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basis
लेकिन निष्पादन योग्य अनुमति की जांच करके विभिन्न उपयोगकर्ताओं को अनुमति कैसे दी जाती है? और मुझे आपकी दूसरी बात मिल गई। आपका मतलब है कि स्क्रिप्ट की उनकी पढ़ने की अनुमति को हटा दें ताकि वे इसे बैश के माध्यम से भी संसाधित न कर सकें। सही?
sudo chmod g+x myfile.sh
फ़ाइल के समूह के लिए निष्पादन अनुमतियों को जोड़ने के लिए टर्मिनल में कुछ कहते हैं । फ़ाइल अनुमतियाँ ट्यूटोरियल देखें । एक साथ कई उपयोगकर्ताओं के लिए अनुमतियों को प्रबंधित करने के लिए, आप समूहों का उपयोग करेंगे, उदाहरण के लिए प्रबंध समूह देखें ।
इस तरह से मत सोचो। क्या मैं इस फ़ाइल को निष्पादित कर सकता हूं? इस तरह से सोचें कि: कौन इस फ़ाइल को निष्पादित कर सकता है?
यदि कंप्यूटर आपका है और फ़ाइल आपकी है तो मुझे यकीन है कि आप इसे निष्पादित कर सकते हैं। आप chmod और chown जैसे कमांड में आगे देखना चाह सकते हैं , और फ़ाइल की अनुमति दे सकते हैं।
मुझे आशा है कि वह मदद करेंगे।
यदि फ़ाइल निष्पादन योग्य नहीं है, तो exec
लिनक्स कर्नेल का syscall विफल रहता EACCES
है
जब आप कर सकते हैं sh myprog.sh
(जो कि सिर्फ फाइलों को पढ़ता है और व्याख्या करता है), प्रोग्राम को चलाने की कोशिश ./myprog.sh
नहीं कर सकता क्योंकि यह काम नहीं करता है, जब से आप इसे करते हैं:
exec
सिस्टम कॉल ऑन का उपयोग करता है./myprog.sh
exec
लिनक्स कर्नेल के सिस्टम कॉल द्वारा समझाया जाता है: /programming/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on -इस-पहले-रेखा एक-pyt / 40938801 # 40938801इसके साथ सत्यापित किया जा सकता है main.c
:
#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[] = {"myprog", NULL};
char *envp[] = {NULL};
int ret;
ret = execve("myprog.sh", argv, envp);
perror("execve");
printf("%d\n", errno);
printf("%d\n", EACCES);
}
और myprog.sh
:
#!/bin/sh
echo worked
यदि myprog.sh
निष्पादन योग्य नहीं है, तो इसके main
साथ विफल होता है:
execve: Permission denied
13
13
Ubuntu 17.10 में परीक्षण किया गया gcc -std=c99
।
POSIX 7 में उल्लेख है कि:
Fexecve () को छोड़कर निष्पादन कार्य, विफल हो जाएगा यदि:
[EACCES] नई प्रक्रिया छवि फ़ाइल के पथ उपसर्ग में सूचीबद्ध निर्देशिका के लिए खोज अनुमति से इनकार किया जाता है, या नई प्रक्रिया छवि फ़ाइल निष्पादन अनुमति से इनकार करती है।
इसके अलावा औचित्य यहां पाया जा सकता है: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-supercuous-or-whats-the