Chrome OS में, बैश मेरी स्क्रिप्ट निष्पादित नहीं करेगा। मुझे अपनी स्क्रिप्ट चलाने के लिए बैश कैसे मिलेगा?


16

मेरे पास foo.shमेरी वर्तमान निर्देशिका में एक फ़ाइल है। अगर मैं दौड़ने की कोशिश करूं ./foo.sh, तो मुझे:

-bash: ./foo.sh: /bin/sh: bad interpreter: Permission denied

लेकिन अगर मैं दौड़ता हूं /bin/sh ./foo.shतो यह ठीक चलता है।

मैं इसे कैसे ठीक कर सकता हूं इसलिए मैं बस चला सकता हूं ./foo.shऔर यह स्वचालित रूप से इसे / बिन / श के साथ चलाता है।

संपादित करें: ठीक है, यह क्रोम ओएस है और यह विशेष फ़ोल्डर के साथ मुहिम की जाती है noexec। जाहिर है कि सिर्फ चलाने की क्षमता foils ./foo.sh; लेकिन क्यों? मैं अभी भी sh foo.shउसी चीज़ को प्राप्त करने के लिए क्यों दौड़ सकता हूं ? फिर सुरक्षा क्या noexecदेती है?


1
अस्पष्टता के माध्यम से सुरक्षा
माइकल ड्यूरेंट

अगर आपने "foo.sh" काम किया तो क्या आपने कोशिश की?
डेनियल टेस्टा

@DanieleTesta यह सवाल एक प्राचीन लंबे समय से अतीत का अवशेष है। मैं एक Google Cr-48, पहले क्रोमबुक में से एक का उपयोग कर रहा था, जो क्रोमोस के बहुत शुरुआती (लेकिन स्थिर) संस्करण को चला रहा था। हम तब से एक लंबा सफर तय कर चुके हैं और मुझे नहीं लगता कि यह सवाल नवीनतम क्रोमओएस संस्करणों पर लागू होगा, लेकिन मैंने इसका इस्तेमाल निश्चित रूप से कहने के लिए नहीं किया है। वैसे भी मुझे लगता है कि आपकी भिन्नता भी काम कर गई होगी लेकिन किसी को यह सुनिश्चित करने से पहले परीक्षण करना चाहिए। मैं अभी भी स्पष्ट नहीं हूं कि noexecइसका जादू कैसे काम करता है।
Ricket

जवाबों:


22

noexecझंडा उचित रूप से, स्क्रिप्ट पर लागू होते हैं, क्योंकि है कि "उम्मीद" व्यवहार किया जाएगा होगा।

हालाँकि, सेटिंग noexecकेवल उन लोगों को रोकती है जो यह नहीं जानते कि वे क्या कर रहे हैं। जब आप दौड़ते हैं sh foo.shतो आप वास्तव में shउसके डिफ़ॉल्ट स्थान (शायद /bin) से चल रहे होते हैं, जो कि एक फाइल सिस्टम पर नहीं होता है, जिसके साथ घुड़सवार होता है noexec

तुम भी सीधे noexecबाइनरी फ़ाइलों के लिए लगभग प्राप्त कर सकते ldहैं।

cp /bin/bash $HOME
/lib/ld-2.7.so $HOME/bash

यह बैश चलेगा, भले ही यह एक फाइल सिस्टम पर हो या न हो noexec


5
उल्लेख के लिए +1 ld.so(चतुर)
एम्फ़ैटेमाचिन

मैंने आपके दो आदेशों की कोशिश की; "साझा की गई वस्तु फ़ाइल को नहीं खोल सकता: ऐसी कोई फ़ाइल या निर्देशिका नहीं" - कॉपी किए जाने के कारण लेकिन चलाए जा रहे बैश के कारण। तो फिर मैंने कोशिश की /lib/ld-2.10.1.so $HOME/shऔर यह साझा पुस्तकालयों को लोड करते समय एक और त्रुटि लौटा दी /home/chronos/user/sh: failed to map segment from shared object: Operation not permitted:। मुझे यकीन नहीं है कि आपने जो कहा था, वह असत्य था, या अगर कुछ और हस्तक्षेप कर रहा है। उदाहरण के लिए, / केवल पढ़ने के लिए मुहिम शुरू की है।
Ricket

खैर, मैं कुछ के लिए नहीं कह सकता क्योंकि मेरे पास कोशिश करने के लिए ChromeOS की एक प्रति नहीं है। मुझे पूरा विश्वास है कि यह कुछ संशोधन के साथ काम कर सकता है, लेकिन स्वयं इसे आज़माने में सक्षम हुए बिना मुझे नहीं पता कि यह क्या हो सकता है।
bahamat

ओह ठीक है, मैं यह सोचना चाहूंगा कि यह इसलिए है क्योंकि क्रोम ओएस ठीक से बंद है। यह बहुत सुरक्षित प्रतीत होता है, लेकिन मुझे लगता है कि हम समय के साथ देखेंगे!
Ricket

1
ldऔर के बीच अंतर है ld.soldएक लिंकर है जिसका उपयोग ऑब्जेक्ट कोड को लिंक करने के लिए बाइनरी बनाने के लिए किया जाता है, जबकि ld.soरन-टाइम लिंकर प्रोग्राम को निष्पादित करते समय एक समान क्रिया करता है। यहाँ लिंक करने वाला लिंक रन-टाइम लिंकर है।
कुसलानंद

5

यदि आप MS-DOS 2-बाइट (कैरिज-रिटर्न लाइनफीड) लाइन एंडिंग वाली फ़ाइल को निष्पादित करने का प्रयास करते हैं, तो आपको यह त्रुटि (या बहुत समान संदेश) मिल सकती है।

विम इन दिनों इतना स्मार्ट है, कि यह आपको गाड़ी को 'एम' के रूप में नहीं दिखाता है। तो आप मूर्ख हो सकते हैं यदि आप यह नहीं जांचते हैं कि विम क्या "फ़ाइल प्रारूप" सोचता है और बस ऑन-स्क्रीन-उपस्थिति पर भरोसा करता है।

इस स्थिति में "#! / Bin / sh ^ M" कर्नेल को "/ बिन / श ^ एम" खोजने का प्रयास करने का कारण बनता है, जो यह नहीं कर सकता। बुरा दुभाषिया, वास्तव में।


2

यदि आपके पास USB स्टिक (या अन्य रिमूवेबल मीडिया) से स्क्रिप्ट या प्रोग्राम चलाने का विकल्प है, तो आप इसे अनमाउंट करने का प्रयास कर सकते हैं और इसे मैन्युअल रूप से री-माउंट कर सकते हैं:

  1. USB स्टिक में प्लग करें

  2. के साथ USB स्टिक डिवाइस का पता लगाएं $ mount

  3. इस पर ध्यान दें; चलो मान लेते हैं/dev/sdb1

  4. Unmount USB स्टिक:

    $ cd /media/removable
    
    $ sudo umount mountpoint

अंत में, USB स्टिक को फिर से माउंट करें:

$ sudo mount /dev/sdb1 mountpoint

माउंटपॉइंट के साथ यूएसबी स्टिक का माउंट नाम


1

ChromeOS / ChromiumOS पर सिस्टम सुरक्षा कारणों के लिए कुछ फ़ोल्डर्स चिह्नित हैं noexecऔर आपको या तो नीचे दिए गए कमांड के साथ रिमाउंट करना होगा, या एक वैकल्पिक पथ का उपयोग करना होगा noexec, जो दूसरे उदाहरण की तरह सेट नहीं है ।

इन आदेशों को लगता है आप डेवलपर मोड में कम से कम कर रहे हैं और करने के लिए उपयोग कर सकते है shellसाथ chronos@localhost / $बस और नहीं crosh>और sudo पासवर्ड मालूम है।

sudo mount -i -o remount,exec /home/chronos/user/

अधिक टिकाऊ तरीका जो अपग्रेड से बचना चाहिए क्योंकि Google /usr/localडेवलपर्स के लिए सबसे अधिक सुरक्षित है:

sudo mkdir -p /usr/local/bin/ && sudo chown -R chronos: /usr/local/bin/
cp ${HOME}/Downloads/foo.sh /usr/local/bin/

यहां चीजें डालने का अतिरिक्त लाभ यह है कि यह $PATHपहले से ही है ( echo $PATHइस बात की पुष्टि करने की कोशिश करें) इसलिए आपको स्क्रिप्ट या बायनेरी चलाने के लिए पूर्ण पथ का उपयोग करने की आवश्यकता नहीं है जो उन पर है /usr/local/binऔर chmod +xउन पर चला है।


2
नमस्ते, यूनिक्स एसई पर आपका स्वागत है! ध्यान दें, एकल-आदेश उत्तरों को यहां बहुत अधिक मुख्यालय नहीं माना जाता है। मैं आपको यह समझाने का सुझाव देता हूं कि आप क्या कर रहे हैं और क्यों कर रहे हैं।
पीटर - मोनिका

0

मेरा भी यही सवाल था। मेरी समस्या एसडी कार्ड को लेकर थी। इसने मेरे लिए काम किया, और यह अन्य उत्तरों की तुलना में बहुत सरल है। मैंने इसे Crouton के अंक # 928 से सीखा ।

$ sudo mount -o remount,exec /media/removable/SD\ Card

ध्यान दें कि आपको आरोह बिंदु का उपयोग करना है, न कि उपकरण (/ dev / mmcblk1p1) का। आपके मामले में USB (/ dev / sdb1) के लिए समान बात। केवल माउंट बिंदु अलग है:

$ sudo mount -o remount,exec /media/removable/USB\ Drive

आपको पता होगा कि इसका वांछित प्रभाव था क्योंकि जब आप क्वेरी करते हैं तो "noexec" माउंट विकल्पों से गायब हो जाएगा।

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