Ich habe eine foo.sh
Datei 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.sh
und 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
?
noexec
seine Magie funktioniert.Antworten:
Das
noexec
Flag wird entsprechend auf Skripte angewendet, da dies das "erwartete" Verhalten wäre.Die Einstellung
noexec
stoppt jedoch nur Personen, die nicht genug über ihre Aktivitäten wissen. Wenn Sie dassh foo.sh
Programm ausführen, wird essh
(wahrscheinlich/bin
) von seinem Standardspeicherort ausgeführt, der sich nicht auf einem Dateisystem befindet, mit dem es gemountet istnoexec
.Sie können sich sogar
noexec
für reguläre Binärdateien bewegen, indem Sie dieseld
direkt aufrufen .Dies führt Bash aus, unabhängig davon, ob es sich um ein Dateisystem handelt, mit dem gemountet wurde oder nicht
noexec
.quelle
ld.so
(clever)/lib/ld-2.10.1.so $HOME/sh
und 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.ld
undld.so
.ld
ist ein Linker, der beim Verknüpfen von Objektcode zum Bilden einer Binärdatei beim Kompilieren verwendet wird, währendld.so
der Laufzeit-Linker beim Ausführen eines Programms eine ähnliche Aktion ausführt. Der Linker, auf den hier verwiesen wird, ist der Laufzeitlinker.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.
quelle
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:
USB-Stick einstecken
USB-Stick mit suchen
$ mount
Nimm es zur Kenntnis; Nehmen wir an, es ist
/dev/sdb1
USB-Stick aushängen:
Zum Schluss den USB-Stick neu einbinden:
Mit mountpoint den Mount-Namen des USB-Sticks
quelle
Aus Gründen der Systemsicherheit unter ChromeOS / ChromiumOS sind bestimmte Ordner markiert.
noexec
Sie müssen entweder die Bereitstellung mit dem folgenden Befehl wiederholen oder einen alternativen Pfad verwenden, der nichtnoexec
festgelegt wurde, wie im zweiten Beispiel.Diese Befehle setzen voraus, dass Sie sich mindestens im Entwicklermodus befinden und Zugriff auf das Kennwort
shell
withchronos@localhost / $
und nicht nurcrosh>
and know the sudo haben.Die nachhaltigere Methode, die ein Upgrade überstehen sollte, da Google den größten Teil
/usr/local
für Entwickler reserviert :Der zusätzliche Vorteil des Hinzufügens von Dingen besteht darin, dass sie
$PATH
bereits vorhanden sind (versuchenecho $PATH
Sie 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/bin
undchmod +x
auf denen sie ausgeführt wurden.quelle
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 .
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:
Sie werden wissen, dass der gewünschte Effekt erzielt wurde, da "noexec" bei der Abfrage aus den Einhängeoptionen verschwindet.
quelle