ใน Chrome OS Bash จะไม่รันสคริปต์ของฉัน ฉันจะให้ Bash ใช้งานสคริปต์ได้อย่างไร


16

ฉันมีfoo.shไฟล์ในไดเรกทอรีปัจจุบันของฉัน ถ้าฉันพยายามวิ่ง./foo.shฉันจะได้:

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

แต่ถ้าฉันวิ่ง/bin/sh ./foo.shแล้วก็วิ่งได้ดี

ฉันจะแก้ไขได้อย่างไรเพื่อที่ฉันจะสามารถเรียกใช้./foo.shและมันรันโดยอัตโนมัติด้วย / bin / sh?

แก้ไข: เอาล่ะนี่คือ Chrome OS noexecและโฟลเดอร์นี้โดยเฉพาะอย่างยิ่งคือการติดตั้งด้วย เห็นได้ชัดว่าเกียดความสามารถในการทำงานเพียง./foo.sh; แต่ทำไม เหตุใดฉันจึงยังสามารถวิ่งsh foo.shเพื่อบรรลุสิ่งเดียวกันได้ ความปลอดภัยอะไรให้แล้วnoexec?


1
การรักษาความปลอดภัยผ่านความสับสน
Michael Durrant

คุณลองใช้งาน ". ​​foo.sh" แล้วหรือยัง
Daniele Testa

@DanieleTesta คำถามนี้เป็นของโบราณที่ผ่านมานาน ฉันใช้ Google Cr-48 ซึ่งเป็นหนึ่งใน chromebooks รุ่นแรกที่ใช้ ChromeOS รุ่นแรก (แต่เสถียร) พวกเรามาไกลแล้วและฉันไม่คิดว่าคำถามนี้จะใช้กับ ChromeOS รุ่นล่าสุด แต่ฉันไม่ได้ใช้มันเพื่อพูดอย่างแน่นอน อย่างไรก็ตามฉันคิดว่ารูปแบบของคุณก็ใช้ได้เหมือนกัน แต่ก็ควรทดสอบก่อนว่าแน่นอน ฉันยังไม่ชัดเจนว่าnoexecเวทมนตร์ของมันทำงานอย่างไร
Ricket

คำตอบ:


22

การnoexecตั้งค่าสถานะจะใช้กับสคริปต์อย่างเหมาะสมเพราะนั่นจะเป็นพฤติกรรมที่ "คาดหวัง"

อย่างไรก็ตามการตั้งค่าnoexecจะหยุดคนที่ไม่รู้จักพอเกี่ยวกับสิ่งที่พวกเขาทำ เมื่อคุณเรียกsh foo.shคุณกำลังใช้งานจริงshจากสถานที่เริ่มต้น (อาจจะ/bin) noexecซึ่งไม่ได้อยู่ในระบบแฟ้มติดกับ

คุณสามารถแม้กระทั่งรับรอบnoexecสำหรับไฟล์ไบนารีปกติโดยเรียกใช้ldโดยตรง

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

สิ่งนี้จะรัน 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

โอ้ดีฉันต้องการที่จะคิดว่ามันเป็นเพราะ Chrome OS ถูกล็อคลงอย่างถูกต้อง ดูเหมือนว่าจะปลอดภัย แต่ฉันคิดว่าเราจะได้เห็นเมื่อเวลาผ่านไป!
Ricket

1
มีความแตกต่างระหว่างและld เป็นตัวเชื่อมโยงที่ใช้ในการเชื่อมโยงรหัสวัตถุในรูปแบบไบนารีเมื่อรวบรวมในขณะที่เป็นตัวเชื่อมโยงเวลาทำงานที่มีการดำเนินการที่คล้ายกันเมื่อรันโปรแกรม ตัวลิงก์ที่อ้างถึงที่นี่คือตัวลิงก์รันไทม์ ld.soldld.so
Kusalananda

5

นอกจากนี้คุณยังสามารถรับข้อผิดพลาดนี้ (หรือข้อความที่คล้ายกันมาก) ถ้าคุณพยายามเรียกใช้ไฟล์ที่มีจุดสิ้นสุดบรรทัด MS-DOS 2-byte (carriage-return linefeed)

Vim เป็นคนฉลาดมากในทุกวันนี้ซึ่งมันไม่จำเป็นต้องแสดงให้คุณเห็นว่าการขึ้นบรรทัดใหม่เป็น '^ M' ดังนั้นคุณสามารถถูกหลอกได้ถ้าคุณไม่ตรวจสอบสิ่งที่ Vim คิดว่า "รูปแบบไฟล์" นั้นเป็นเพียงแค่พึ่งพาลักษณะที่ปรากฏบนหน้าจอ

ในกรณีนี้ "#! / bin / sh ^ M" ทำให้เคอร์เนลพยายามค้นหา "/ bin / sh ^ M" ซึ่งไม่สามารถทำได้ ล่ามที่ไม่ดีแน่นอน


2

หากคุณมีตัวเลือกในการเรียกใช้สคริปต์หรือโปรแกรมจากแท่ง USB (หรือสื่อที่ถอดได้อื่น ๆ ) คุณสามารถลองถอนติดตั้งและติดตั้งใหม่ด้วยตนเอง:

  1. เสียบปลั๊ก USB

  2. ค้นหาอุปกรณ์ USB stick ด้วย $ mount

  3. จดไว้ สมมติว่ามันเป็น/dev/sdb1

  4. ถอนติด USB Stick:

    $ cd /media/removable
    
    $ sudo umount mountpoint

สุดท้ายติด USB stick อีกครั้ง:

$ sudo mount /dev/sdb1 mountpoint

ด้วยจุดเมานท์ชื่อเมาท์ของ USB stick


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
สวัสดียินดีต้อนรับสู่ Unix SE! หมายเหตุคำตอบคำสั่งเดียวไม่ถือว่าเป็น HQ ที่นี่ ฉันขอแนะนำให้อธิบายสิ่งที่คุณกำลังทำและทำไม
peterh - Reinstate Monica

0

ฉันมีคำถามเดียวกัน ปัญหาของฉันคือกับการ์ด SD สิ่งนี้ใช้ได้สำหรับฉันและมันง่ายกว่าคำตอบอื่น ๆ ที่นี่ ผมได้เรียนรู้ได้จากCrouton รุ่น #

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

โปรดทราบว่าคุณต้องใช้จุดเชื่อมต่อไม่ใช่อุปกรณ์ (/ dev / mmcblk1p1) สิ่งเดียวกันสำหรับ USB (/ dev / sdb1) ในกรณีของคุณ เฉพาะจุดเชื่อมต่อเท่านั้นจะแตกต่างกัน:

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

คุณจะรู้ว่ามันมีเอฟเฟกต์ที่ต้องการเพราะ "noexec" จะหายไปจากตัวเลือกการเมานท์เมื่อคุณค้นหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.