Ich verwende git bash
unter Windows. Ich möchte ls
ausführen Befehl mit bash
. Ich kann ls
ausführen separat so:
$ ls
f1 f2
Wenn ich es jedoch mit bash
versuche , erhalte ich den Fehler:
$ bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
Aber wenn ich mein Skript erstelle, funktioniert es gut:
$ echo "echo [email protected]" > my.sh && bash my.sh
Was kann das Problem sein?
Akzeptierte Antwort:
Aus dem feinen Handbuch für bash(1)
:
ARGUMENTE
Wenn Argumente nach der Optionsverarbeitung verbleiben und weder die Option -c noch die Option
-s angegeben wurde, wird angenommen, dass das erste Argument der
Name einer Datei
Hat ls
enthalten Shell-Befehle? Nein, es ist eine Binärdatei. bash
krächzt über diese Tatsache und scheitert.
Eine strace
kann helfen zu zeigen, was vor sich geht:
$ strace -o alog bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
Der alog
Datei kann etwas chaotisch werden, zeigt aber bash
Suche nach ls
im aktuellen Arbeitsverzeichnis – ein Sicherheitsrisiko, wenn jemand ein ungezogenes ls
platziert hat Datei irgendwo! – und macht dann einen PATH
Suche:
$ grep ls alog
execve("/usr/bin/bash", ["bash", "ls"], [/* 43 vars */]) = 0
open("ls", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/ls", 0x7fff349810f0) = -1 ENOENT (No such file or directory)
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", X_OK) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", R_OK) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", X_OK) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", R_OK) = 0
open("/usr/bin/ls", O_RDONLY) = 3
Warum dies ein Sicherheitsrisiko darstellen könnte, wenn Sie bash somecmd
ausführen aus dem falschen Verzeichnis, in dem jemand ein ls
erstellt hat (oder ein anderer bekannter Befehl aufgrund eines Fehlers in einem Skript):
$ echo "echo rm -rf /" > ls
$ bash ls
rm -rf /
$