Trong Chrome OS, Bash sẽ không thực thi tập lệnh của tôi. Làm thế nào để tôi có được Bash để chạy kịch bản của tôi?


16

Tôi có một foo.shtập tin trong thư mục hiện tại của tôi. Nếu tôi cố chạy ./foo.sh, tôi nhận được:

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

Nhưng nếu tôi chạy /bin/sh ./foo.shthì nó chạy tốt.

Làm cách nào tôi có thể sửa lỗi này để tôi có thể chạy ./foo.shvà nó tự động chạy với / bin / sh?

Chỉnh sửa: Được rồi, đây là Chrome OS và thư mục cụ thể này được gắn kết noexec. Rõ ràng là cho phép khả năng chạy ./foo.sh; nhưng tại sao Tại sao tôi vẫn có thể chạy sh foo.shđể đạt được điều tương tự? Những gì bảo mật, sau đó, không noexeccung cấp?


1
bảo mật thông qua che khuất
Michael Durrant

Bạn đã thử nếu chạy ". Foo.sh" chưa?
Daniele Testa

@DanieleTesta Câu hỏi này là một di tích cổ từ thời xa xưa. Tôi đang sử dụng Google Cr-48, một trong những chromebook đầu tiên, chạy phiên bản ChromeOS khá sớm (nhưng ổn định). Chúng tôi đã đi một chặng đường dài kể từ đó và tôi không nghĩ câu hỏi này sẽ áp dụng cho các phiên bản ChromeOS mới nhất, nhưng tôi không sử dụng nó để nói chắc chắn. Dù sao, tôi nghĩ rằng biến thể của bạn cũng sẽ có tác dụng nhưng người ta nên kiểm tra nó trước khi nói chắc chắn. Tôi vẫn chưa rõ chính xác làm thế nào noexechoạt động ma thuật của nó.
Ricket

Câu trả lời:


22

Các noexeccờ một cách thích hợp sẽ áp dụng cho các kịch bản, bởi vì đó sẽ là "dự kiến" hành vi.

Tuy nhiên, cài đặt noexecchỉ ngăn những người không biết đủ về những gì họ đang làm. Khi bạn chạy, sh foo.shbạn thực sự đang chạy shtừ vị trí mặc định của nó (có thể /bin) không nằm trên hệ thống tệp được gắn với noexec.

Bạn thậm chí có thể nhận được xung quanh noexeccho các tệp nhị phân thông thường bằng cách gọi ldtrực tiếp.

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

Điều này sẽ chạy bash, bất kể nó có trên hệ thống tập tin được gắn kết hay không noexec.


5
+1 để đề cập ld.so(thông minh)
amphetamachine

Tôi đã thử hai lệnh của bạn; "Không thể mở tệp đối tượng được chia sẻ: Không có tệp hoặc thư mục như vậy" - do sh được sao chép nhưng bash đang được chạy. Vì vậy, sau đó tôi đã thử /lib/ld-2.10.1.so $HOME/shvà nó trả về một lỗi khác trong khi tải các thư viện chia sẻ : /home/chronos/user/sh: failed to map segment from shared object: Operation not permitted. Tôi không chắc những gì bạn nói là không đúng sự thật, hoặc nếu có điều gì khác đang can thiệp. Ví dụ: / được gắn dưới dạng chỉ đọc.
Ricket

Chà, tôi không thể nói chắc chắn vì tôi không có bản sao ChromeOS để thử. Tôi khá tự tin rằng nó có thể hoạt động với một số sửa đổi nhưng không thể tự mình thử nó, tôi không biết đó có thể là gì.
bahamat

Ồ, tôi muốn nghĩ rằng đó là vì Chrome OS đã bị khóa đúng cách. Nó có vẻ khá an toàn nhưng tôi đoán chúng ta sẽ thấy theo thời gian!
Ricket

1
Có một sự khác biệt giữa ldld.so. ldlà một trình liên kết được sử dụng trong liên kết mã đối tượng để tạo thành nhị phân khi biên dịch, trong khi đó ld.solà trình liên kết thời gian chạy thực hiện một hành động tương tự khi thực hiện một chương trình. Trình liên kết được đề cập ở đây là trình liên kết thời gian chạy.
Kusalananda

5

Bạn cũng có thể gặp lỗi này (hoặc một thông báo rất, rất giống nhau) nếu bạn cố thực thi một tệp với các kết thúc dòng MS-DOS 2 byte (car car-return linefeed).

Vim ngày nay rất thông minh, đến nỗi nó không cần thiết cho bạn thấy cỗ xe trở về là '^ M'. Vì vậy, bạn có thể bị lừa nếu bạn không kiểm tra xem Vim nghĩ "định dạng tệp" là gì và chỉ dựa vào giao diện trên màn hình.

Trong trường hợp này, "#! / Bin / sh ^ M" khiến kernel cố gắng tìm "/ bin / sh ^ M", điều này không thể. Thông dịch viên xấu, thực sự.


2

Nếu bạn có tùy chọn để chạy tập lệnh hoặc chương trình từ thẻ nhớ USB (hoặc phương tiện di động khác), bạn có thể thử ngắt kết nối và lắp lại thủ công:

  1. Cắm USB

  2. Tìm thiết bị dính USB với $ mount

  3. Hãy lưu ý về nó; giả sử nó là/dev/sdb1

  4. Thanh kết nối USB:

    $ cd /media/removable
    
    $ sudo umount mountpoint

Cuối cùng, gắn lại thanh USB:

$ sudo mount /dev/sdb1 mountpoint

Với điểm gắn kết, tên gắn kết của thanh USB


1

Vì lý do bảo mật hệ thống trên ChromeOS / ChromiumOS, một số thư mục nhất định được đánh dấu noexecvà bạn cần phải truy cập lại bằng lệnh bên dưới hoặc sử dụng đường dẫn thay thế chưa được noexecđặt, như ví dụ thứ hai.

Những lệnh này giả sử bạn là ít nhất là trong chế độ nhà phát triển và có thể truy cập shellvới chronos@localhost / $và không chỉ crosh>và biết mật khẩu sudo.

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

Phương pháp bền vững hơn nên tồn tại trong quá trình nâng cấp vì Google dành phần lớn /usr/localcho các nhà phát triển:

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

Lợi ích bổ sung của việc đặt mọi thứ ở đây là nó $PATHđã có sẵn (cố gắng echo $PATHxác nhận điều này) vì vậy bạn không cần phải sử dụng đường dẫn đầy đủ để chạy các tập lệnh hoặc tệp nhị phân đang chạy /usr/local/binvà đã chmod +xchạy trên chúng.


2
Xin chào, chào mừng bạn đến với Unix SE! Lưu ý, câu trả lời đơn không được coi là rất HQ ở đây. Tôi đề nghị giải thích, bạn đang làm gì và tại sao.
peterh - Phục hồi Monica

0

Tôi đã có cùng một câu hỏi. Vấn đề của tôi là với thẻ SD. Điều này làm việc cho tôi, và nó đơn giản hơn nhiều so với các câu trả lời khác ở đây. Tôi đã học được nó từ vấn đề Crouton # 928 .

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

Lưu ý rằng bạn phải sử dụng điểm gắn kết, không phải thiết bị (/ dev / mmcblk1p1). Điều tương tự cho USB (/ dev / sdb1) trong trường hợp của bạn. Chỉ có điểm gắn kết là khác nhau:

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

Bạn sẽ biết nó có hiệu ứng mong muốn vì "noexec" sẽ biến mất khỏi các tùy chọn gắn kết khi bạn truy vấn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.