क्या स्क्रिप्ट तब भी चल सकती है जब वे निष्पादन योग्य नहीं हैं?


25

मैं उनके साथ निष्पादन योग्य के रूप में सेट किए बिना स्क्रिप्ट (.sh) चला सकता हूं। तो वास्तव में यह कहां मायने रखता है?

जवाबों:


24

मान लें कि आपके पास myscriptनिम्नलिखित युक्त फ़ाइल है :

#!/bin/bash
echo "Hello, World!"

यदि आप इस फ़ाइल को निष्पादन योग्य बनाते हैं और इसे चलाते हैं ./myscript, तो कर्नेल देखेंगे कि पहले दो बाइट्स हैं #!, जिसका अर्थ है कि यह एक स्क्रिप्ट-फ़ाइल है। कर्नेल फिर दुभाषिया के रूप में शेष पंक्ति का उपयोग करेगा, और फ़ाइल को इसके पहले तर्क के रूप में पास करेगा। तो, यह चलता है:

/bin/bash myscript

और बैश फ़ाइल को पढ़ता है और इसमें शामिल कमांड्स को निष्पादित करता है।

इस प्रकार, बैश के लिए (या जो भी आपकी स्क्रिप्ट की व्याख्या करता है) स्क्रिप्ट को "निष्पादित" करने के लिए, इसे केवल फ़ाइल को पढ़ने में सक्षम होना चाहिए।

इसलिए, स्क्रिप्ट के लिए, निष्पादित बिट बस इसे निष्पादित करने के लिए थोड़ा अधिक सुविधाजनक बनाता है। जब तक bash निष्पादन योग्य है, तब तक आप हमेशा स्क्रिप्ट फ़ाइल को तर्क के रूप में चला सकते हैं, या bash को अंतःक्रियात्मक रूप से चला सकते हैं और स्क्रिप्ट लाइन को अपने टर्मिनल में लाइन से पेस्ट कर सकते हैं ताकि कमांड निष्पादित हो सके।


विस्तार से समझाने के लिए धन्यवाद। :) अगर मैंने इसे सही समझा, तो किसी भी यूजर को bash करने के लिए इसे चलाने के लिए बस स्क्रिप्ट की एक्सेस की जरूरत है क्योंकि bash स्क्रिप्ट को इनपुट के रूप में लेगा और इसे केवल पढ़ने की आवश्यकता होगी। मैं उस उपयोगकर्ता के लिए स्क्रिप्ट की पढ़ने की अनुमति लेकर इस व्यवहार को रोक सकता हूं। सही? तो इस निष्पादन योग्य अनुमति का उपयोग कब किया जाता है और वास्तव में मायने रखता है?
20

हां, यदि आप "बैश मायस्क्रिप्ट" का उपयोग करते हैं, तो उपयोगकर्ता को केवल "मायस्क्रिप्ट" के लिए रीड एक्सेस की आवश्यकता होती है (और यदि रास्ते में बैश है तो / बिन / बैश के लिए निष्पादन योग्य है)। हालाँकि, यदि आप अपनी स्क्रिप्ट को निष्पादन योग्य बनाते हैं, तो चीजें थोड़ी भिन्न होती हैं। यह सच है कि कर्नेल के दृष्टिकोण से, यह "/ बिन / बैश मायस्क्रिप्ट" फिर से होगा यदि पहली पंक्ति #! / बिन / बैश है, लेकिन उस बिंदु तक पहुंचने के लिए, पहले आपको स्क्रिप्ट को निष्पादन योग्य के रूप में प्रस्तुत करना होगा। उपयोगकर्ता या समूह। हालाँकि, यह सच है कि यदि कुछ उपयोगकर्ता के लिए स्क्रिप्ट निष्पादन योग्य नहीं है, लेकिन पठनीय है, तो वह अभी भी स्क्रिप्ट को "बैश मायस्क्रिप्ट" के साथ "रन" कर सकता है ....
LGB

@LGB तो यह बहुत बेकार है। अच्छी बात यह है कि उस स्क्रिप्ट के लिए किसी उपयोगकर्ता से पढ़ी गई अनुमति को काट देना चाहिए। सही?
22

@Affame: मैं बेकार के बजाय उपयोगी कहूंगा। नियमित फ़ाइलों पर निष्पादित बिट का उपयोग (और कभी नहीं किया गया था) का उपयोग पहुंच को सीमित करने के लिए किया जाता है। ऐसा लगता है कि आप इससे उम्मीद कर रहे हैं। यदि आपके पास एक द्विआधारी निष्पादन योग्य है, तो आपको इसे चलाने के लिए उस पर अनुमति निष्पादित करनी होगी। हालाँकि, यदि आपने इस तक पहुंच पढ़ ली है, तो आप हमेशा फ़ाइल को अपने स्वयं के होम डायरेक्टरी में कॉपी कर सकते हैं, जिस स्थिति में कॉपी आपके पास होगी, इसलिए आप इसे निष्पादित करने की अनुमति जोड़ सकते हैं ... और इसे चलाएं। निर्देशिकाओं के लिए हालांकि, इसका थोड़ा अलग उद्देश्य है। देखें mywiki.wooledge.org/Permissions
geirha

1
अगर मुझे सही दुभाषिया नहीं पता है तो मुझे / बिन / बैश के बजाय क्या उपयोग करना चाहिए? क्या कोई कमांड है जो स्क्रिप्ट को शेबांग लाइन के अनुसार चलाती है?
ऐवर

16

सुनिश्चित करें कि आप "शेल स्क्रिप्ट का उपयोग करके" शेल स्क्रिप्ट का उपयोग करके "शेल स्क्रिप्ट को निष्पादित नहीं कर रहे हैं" भ्रमित नहीं कर रहे हैं।

यह फ़ाइल अनुमतियों से प्रभावित नहीं होगा file.sh:

sh file.sh

आप निष्पादित कर रहे हैं sh(जो प्रोग्राम को हल करता है /bin/sh), जो file.shकोड को पढ़ता है और निष्पादित करता है।

यदि आप वास्तव में स्वयं स्क्रिप्ट निष्पादित करते हैं, तो फ़ाइल अनुमतियों पर प्रभाव पड़ेगा :

./file.sh

ध्यान दें कि फ़ाइल अनुमतियां गैर-लिनक्स फाइल सिस्टम द्वारा समर्थित नहीं हैं, जैसे कि एफएटी। इसलिए यदि आप चलाते हैं chmod -x file.sh, तब भी फ़ाइल के पास पूर्व अनुमति होगी।

फ़ाइल सिस्टम द्वारा निष्पादित अनुमति लागू है। लेकिन प्रोग्राम फ़ाइल सामग्री को पढ़कर कोड को "निष्पादित" भी कर सकते हैं, जो "निष्पादित" पर फाइल सिस्टम अनुमतियों को बायपास करता है।


मैं आपकी बात समझता हूं। लेकिन फिर यह समूह या दुनिया या दोनों के लिए है?
एशफैम

@Affame यदि आप निष्पादन योग्य अनुमति सेट करते हैं, तो स्क्रिप्ट को सीधे उन उपयोगकर्ताओं द्वारा चलाया जा सकता है जिनके पास वह अनुमति है - चाहे वे किसी समूह, विश्व या स्वामी के आधार पर हों। लेकिन अनुमति के बिना भी लोग इसे निष्पादित करने के लिए एक अलग कार्यक्रम (जैसे bash) को कॉल करके निष्पादित कर सकते हैं - ब्लॉक करने के लिए कि आपको उनकी readअनुमति भी लेनी होगी ।
jg-faustus

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लेकिन निष्पादन योग्य अनुमति की जांच करके विभिन्न उपयोगकर्ताओं को अनुमति कैसे दी जाती है? और मुझे आपकी दूसरी बात मिल गई। आपका मतलब है कि स्क्रिप्ट की उनकी पढ़ने की अनुमति को हटा दें ताकि वे इसे बैश के माध्यम से भी संसाधित न कर सकें। सही?
19

@Ashfame रीड अनुमति बिंदु पर, हाँ। कैसे, आप sudo chmod g+x myfile.shफ़ाइल के समूह के लिए निष्पादन अनुमतियों को जोड़ने के लिए टर्मिनल में कुछ कहते हैं । फ़ाइल अनुमतियाँ ट्यूटोरियल देखें । एक साथ कई उपयोगकर्ताओं के लिए अनुमतियों को प्रबंधित करने के लिए, आप समूहों का उपयोग करेंगे, उदाहरण के लिए प्रबंध समूह देखें
jg-faustus

जब हम GUI में निष्पादन योग्य अनुमति को जोड़ते थे, तो इसका मतलब किसके लिए था? मालिक / समूह / दुनिया?
21

1

इस तरह से मत सोचो। क्या मैं इस फ़ाइल को निष्पादित कर सकता हूं? इस तरह से सोचें कि: कौन इस फ़ाइल को निष्पादित कर सकता है?

यदि कंप्यूटर आपका है और फ़ाइल आपकी है तो मुझे यकीन है कि आप इसे निष्पादित कर सकते हैं। आप chmod और chown जैसे कमांड में आगे देखना चाह सकते हैं , और फ़ाइल की अनुमति दे सकते हैं।

मुझे आशा है कि वह मदद करेंगे।


हां मैं उनके बारे में जानता हूं। इसका मतलब है, मैं (स्वामी) हमेशा इसे निष्पादित कर सकता हूं। सही? फिर निष्पादन योग्य के रूप में एक फ़ाइल सेट करना समूह या दुनिया या दोनों के लिए है?
Ashfame

1

यदि फ़ाइल निष्पादन योग्य नहीं है, तो 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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.