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?

Ricket
źródło
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.

bahamat
źródło
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.

Bruce Ediger
źródło
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

Joachim Pfeiffer
źródło
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.

megdimka
źródło
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.

tbc0
źródło