W Chrome OS Bash nie wykonuje mojego skryptu. Jak sprawić, by Bash uruchomił mój skrypt?


16

Mam foo.shplik w bieżącym katalogu. Jeśli spróbuję uruchomić ./foo.sh, otrzymam:

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

Ale jeśli biegnę, /bin/sh ./foo.shto działa dobrze.

Jak mogę to naprawić, abym mógł po prostu uruchomić, ./foo.sha to automatycznie uruchomi to z / bin / sh?

Edycja: OK, to jest system operacyjny Chrome i ten konkretny folder jest zamontowany noexec. Najwyraźniej ogranicza to zdolność do biegania ./foo.sh; ale dlaczego Dlaczego wciąż mogę biegać, sh foo.shaby osiągnąć dokładnie to samo? Jakie zatem noexecdaje bezpieczeństwo?


1
bezpieczeństwo przez zaciemnienie
— Michael Durrant

Czy próbowałeś uruchomić „.foo.sh”?
— Daniele Testa

@DanieleTesta To pytanie jest starożytną reliktem z przeszłości. Korzystałem z Google Cr-48, jednego z pierwszych Chromebooków, z dość wczesną (ale stabilną) wersją ChromeOS. Od tego czasu przeszliśmy długą drogę i nie sądzę, aby to pytanie dotyczyło najnowszych wersji ChromeOS, ale nie użyłem tego, by powiedzieć na pewno. W każdym razie myślę, że Twoja odmiana również by zadziałała, ale należy to przetestować, zanim na pewno to powiesz. Nadal nie jestem pewien, jak dokładnie noexecdziała jego magia.
— Ricket

Odpowiedzi:


22

noexecFlaga będzie odpowiednio zastosować do skryptów, bo to byłoby „oczekuje” zachowania.

Jednak ustawienie noexeczatrzymuje tylko osoby, które nie wiedzą wystarczająco dużo o tym, co robią. Po uruchomieniu sh foo.shfaktycznie biegniesz shz domyślnej lokalizacji (prawdopodobnie /bin), która nie jest zainstalowana w systemie plików noexec.

Możesz nawet obejść noexeczwykłe pliki binarne, wywołując ldbezpośrednio.

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

Spowoduje to uruchomienie bash, niezależnie od tego, czy jest on podłączony do systemu plików noexec.


5
+1 za wzmiankę ld.so(sprytnie)
— amfetamachina

Próbowałem twoich dwóch poleceń; „nie można otworzyć pliku obiektu współdzielonego: brak takiego pliku lub katalogu” - ze względu na kopiowanie sh, ale uruchamianie bash. Więc próbowałem /lib/ld-2.10.1.so $HOME/shi powrócił kolejny błąd podczas ładowania biblioteki współdzielone: /home/chronos/user/sh: failed to map segment from shared object: Operation not permitted. Nie jestem pewien, czy to, co powiedziałeś, było nieprawdą, czy też coś innego wtrąca się. Na przykład / jest montowany jako tylko do odczytu.
— Ricket

Nie mogę powiedzieć tego na pewno, ponieważ nie mam kopii ChromeOS do wypróbowania. Jestem całkiem pewien, że może działać z pewnymi modyfikacjami, ale bez możliwości wypróbowania go sam nie wiem, co to może być.
— bahamat

No cóż, chciałbym pomyśleć, że to dlatego, że system operacyjny Chrome jest poprawnie zamknięty. To wydaje się być dość bezpieczne, ale myślę, że zobaczymy z czasem!
— Ricket

1
Istnieje różnica między ldi ld.so. ldto linker używany do łączenia kodu obiektowego w celu utworzenia pliku binarnego podczas kompilacji, podczas gdy ld.solinker w czasie wykonywania wykonuje podobną akcję podczas wykonywania programu. Linker, o którym tu mowa, jest linkerem wykonawczym.
— Kusalananda

5

Możesz również otrzymać ten błąd (lub bardzo, bardzo podobny komunikat), jeśli spróbujesz wykonać plik z 2-bajtowymi zakończeniami linii MS-DOS (powrót wiersza karetki).

Vim jest obecnie tak sprytny, że niekoniecznie pokazuje ci zwrot karetki jako „^ M”. Możesz dać się oszukać, jeśli nie sprawdzisz, co Vim uważa za „format pliku”, i po prostu polegaj na wyglądzie na ekranie.

W tym przypadku „#! / Bin / sh ^ M” powoduje, że jądro próbuje znaleźć „/ bin / sh ^ M”, czego nie może. Rzeczywiście zły tłumacz.


2

Jeśli masz opcję uruchomienia skryptu lub programu z pamięci USB (lub innego nośnika wymiennego), możesz spróbować odmontować i ręcznie zainstalować go ponownie:

  1. Podłącz pamięć USB

  2. Znajdź urządzenie pamięci USB za pomocą $ mount

  3. Zanotuj to; załóżmy, że tak/dev/sdb1

  4. Odłącz pamięć USB:

    $ cd /media/removable
    
    $ sudo umount mountpoint

Na koniec ponownie zainstaluj pamięć USB:

$ sudo mount /dev/sdb1 mountpoint

Z punktem montowania nazwa montowania pamięci USB


1

Ze względów bezpieczeństwa systemu w ChromeOS / ChromiumOS niektóre foldery są zaznaczone noexeci musisz albo ponownie zainstalować je za pomocą poniższego polecenia, albo użyj alternatywnej ścieżki, która nie została noexecustawiona, jak w drugim przykładzie.

Polecenia te zakładają jesteś przynajmniej w trybie dewelopera i mieć dostęp do shellz chronos@localhost / $, a nie tylko crosh>i znać hasło sudo.

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

Bardziej zrównoważona metoda, która powinna przetrwać aktualizację, ponieważ Google rezerwuje większość /usr/localdla programistów:

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

Dodatkową zaletą oddanie rzeczy tutaj jest to, że w $PATHjuż (spróbuj echo $PATHto potwierdzić), dzięki czemu nie trzeba używać pełnej ścieżki, aby uruchomić skrypty lub pliki binarne, które są w /usr/local/bini mieli chmod +xuruchamiać na nich.


2
Cześć, witamy na Unix SE! Uwaga: odpowiedzi jednego polecenia nie są tutaj uważane za bardzo kwatery główne. Sugeruję wyjaśnić, co robisz i dlaczego.
— peterh - Przywróć Monikę

0

Miałem to samo pytanie. Mój problem dotyczył karty SD. To działało dla mnie i jest znacznie prostsze niż inne odpowiedzi tutaj. Nauczyłem się tego z numeru Crouton nr 928 .

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

Zauważ, że musisz użyć punktu montowania, a nie urządzenia (/ dev / mmcblk1p1). To samo dotyczy USB (/ dev / sdb1) w twoim przypadku. Tylko punkt montowania jest inny:

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

Dowiesz się, że przyniosło to pożądany efekt, ponieważ „noexec” zniknie z opcji montowania podczas zapytania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.