In Chrome OS führt Bash mein Skript nicht aus. Wie bringe ich Bash dazu, mein Skript auszuführen?

16

Ich habe eine foo.shDatei in meinem aktuellen Verzeichnis. Wenn ich versuche zu rennen ./foo.sh, bekomme ich:

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

Aber wenn ich renne /bin/sh ./foo.sh, läuft es gut.

Wie kann ich das beheben, damit ich es einfach ausführen kann ./foo.shund es automatisch mit / bin / sh ausführt?

Bearbeiten: Okay, das ist Chrome OS und dieser bestimmte Ordner wird mit gemountet noexec. Anscheinend vereitelt das die Fähigkeit, einfach zu rennen ./foo.sh; aber warum? Warum kann ich immer noch rennen sh foo.sh, um genau dasselbe zu erreichen? Welche Sicherheit gibt es dann noexec?

Ricket
quelle
1
Sicherheit durch Dunkelheit
Michael Durrant
Hast du versucht, ob ". Foo.sh" funktioniert?
Daniele Testa
@DanieleTesta Diese Frage ist ein altes Relikt aus einer vergangenen Zeit. Ich habe ein Google Cr-48 verwendet, eines der ersten Chromebooks, auf dem eine recht frühe (aber stabile) Version von ChromeOS ausgeführt wurde. Wir haben seitdem einen langen Weg zurückgelegt, und ich glaube nicht, dass diese Frage auf die neuesten ChromeOS-Versionen zutrifft, aber ich habe sie nicht benutzt, um sicherzugehen. Wie auch immer, ich denke, Ihre Variation hätte auch funktioniert, aber man sollte es testen, bevor man sicher sagt. Mir ist immer noch nicht klar, wie genau noexecseine Magie funktioniert.
Ricket

Antworten:

22

Das noexecFlag wird entsprechend auf Skripte angewendet, da dies das "erwartete" Verhalten wäre.

Die Einstellung noexecstoppt jedoch nur Personen, die nicht genug über ihre Aktivitäten wissen. Wenn Sie das sh foo.shProgramm ausführen, wird es sh(wahrscheinlich /bin) von seinem Standardspeicherort ausgeführt, der sich nicht auf einem Dateisystem befindet, mit dem es gemountet ist noexec.

Sie können sich sogar noexecfür reguläre Binärdateien bewegen, indem Sie diese lddirekt aufrufen .

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

Dies führt Bash aus, unabhängig davon, ob es sich um ein Dateisystem handelt, mit dem gemountet wurde oder nicht noexec.

Bahamat
quelle
5
+1 für die Erwähnung ld.so(clever)
Amphetamachine
Ich habe deine beiden Befehle ausprobiert. msgstr "Datei mit gemeinsam genutzten Objekten kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis" - da sh kopiert, aber bash ausgeführt wird. Also habe ich versucht , /lib/ld-2.10.1.so $HOME/shund es wieder einen anderen Fehler beim Laden von Bibliotheken geteilt: /home/chronos/user/sh: failed to map segment from shared object: Operation not permitted. Ich bin nicht sicher, ob das, was Sie gesagt haben, falsch ist oder ob etwas anderes stört. Zum Beispiel ist / schreibgeschützt.
Ricket
Nun, ich konnte es nicht mit Sicherheit sagen, da ich keine Kopie von ChromeOS zum Ausprobieren habe. Ich bin ziemlich zuversichtlich, dass es mit einigen Änderungen funktionieren kann, aber ohne es selbst ausprobieren zu können, weiß ich nicht, was das sein könnte.
Bahamat
Na ja, ich würde gerne glauben, dass Chrome OS ordnungsgemäß gesperrt ist. Es scheint ziemlich sicher zu sein, aber ich denke, wir werden es mit der Zeit sehen!
Ricket
1
Es gibt einen Unterschied zwischen ldund ld.so. ldist ein Linker, der beim Verknüpfen von Objektcode zum Bilden einer Binärdatei beim Kompilieren verwendet wird, während ld.soder Laufzeit-Linker beim Ausführen eines Programms eine ähnliche Aktion ausführt. Der Linker, auf den hier verwiesen wird, ist der Laufzeitlinker.
Kusalananda
5

Sie können diesen Fehler (oder eine sehr sehr ähnliche Meldung) auch erhalten, wenn Sie versuchen, eine Datei mit MS-DOS-Zeilenenden von 2 Byte (Zeilenvorschub mit Wagenrücklauf) auszuführen.

Vim ist heutzutage so schlau, dass es Ihnen nicht unbedingt den Wagenrücklauf als '^ M' anzeigt. Sie können sich also täuschen lassen, wenn Sie nicht überprüfen, was Vim als "Dateiformat" ansieht, und sich einfach auf die Bildschirmdarstellung verlassen.

In diesem Fall versucht der Kernel mit "#! / Bin / sh ^ M", "/ bin / sh ^ M" zu finden, was er nicht kann. In der Tat ein schlechter Dolmetscher.

Bruce Ediger
quelle
2

Wenn Sie die Option haben, das Skript oder Programm von einem USB-Stick (oder einem anderen Wechseldatenträger) auszuführen, können Sie versuchen, die Bereitstellung aufzuheben und es manuell erneut bereitzustellen:

  1. USB-Stick einstecken

  2. USB-Stick mit suchen $ mount

  3. Nimm es zur Kenntnis; Nehmen wir an, es ist/dev/sdb1

  4. USB-Stick aushängen:

    $ cd /media/removable
    
    $ sudo umount mountpoint

Zum Schluss den USB-Stick neu einbinden:

$ sudo mount /dev/sdb1 mountpoint

Mit mountpoint den Mount-Namen des USB-Sticks

Joachim Pfeiffer
quelle
1

Aus Gründen der Systemsicherheit unter ChromeOS / ChromiumOS sind bestimmte Ordner markiert. noexecSie müssen entweder die Bereitstellung mit dem folgenden Befehl wiederholen oder einen alternativen Pfad verwenden, der nicht noexecfestgelegt wurde, wie im zweiten Beispiel.

Diese Befehle setzen voraus, dass Sie sich mindestens im Entwicklermodus befinden und Zugriff auf das Kennwort shellwith chronos@localhost / $und nicht nur crosh>and know the sudo haben.

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

Die nachhaltigere Methode, die ein Upgrade überstehen sollte, da Google den größten Teil /usr/localfür Entwickler reserviert :

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

Der zusätzliche Vorteil des Hinzufügens von Dingen besteht darin, dass sie $PATHbereits vorhanden sind (versuchen echo $PATHSie dies zu bestätigen), sodass Sie nicht den vollständigen Pfad zum Ausführen von Skripten oder Binärdateien verwenden müssen, die vorhanden sind /usr/local/binund chmod +xauf denen sie ausgeführt wurden.

Megdimka
quelle
2
Hallo, willkommen auf der Unix SE! Beachten Sie, dass Einzelbefehlsantworten hier nicht als Hauptquartier angesehen werden. Ich schlage vor zu erklären, was machst du und warum.
Peterh - Wiedereinsetzung von Monica
0

Ich hatte die gleiche frage Mein Problem war mit der SD-Karte. Das hat bei mir funktioniert, und es ist viel einfacher als die anderen Antworten hier. Ich habe es aus der Crouton-Ausgabe 928 gelernt .

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

Beachten Sie, dass Sie den Einhängepunkt verwenden müssen, nicht das Gerät (/ dev / mmcblk1p1). Dasselbe gilt für USB (/ dev / sdb1) in Ihrem Fall. Nur der Mountpunkt ist anders:

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

Sie werden wissen, dass der gewünschte Effekt erzielt wurde, da "noexec" bei der Abfrage aus den Einhängeoptionen verschwindet.

tbc0
quelle