GNU/Linux >> LINUX-Kenntnisse >  >> Linux

/usr/bin/ls:/usr/bin/ls:Binärdatei kann nicht ausgeführt werden?

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 enthält Shell-Befehle.

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 /
$ 

Linux
  1. So beheben Sie „/usr/bin/dirmngr“:Keine solche Datei oder kein solches Verzeichnis

  2. /usr/bin vs. /usr/local/bin Unter Linux?

  3. Linux – Zusammenführen von /usr/bin und /usr/sbin in /bin (gnu/linux)?

  4. /usr/bin/python3.5 versehentlich gelöscht, Neuinstallation nicht möglich?

  5. /usr/bin/perl:schlechter Interpreter:Textdatei beschäftigt

Installieren Sie Binärdateien in /bin, /sbin, /usr/bin und /usr/sbin, Interaktionen mit --prefix und DESTDIR

Berechtigung für Composer in /usr/local/bin/ verweigert

cmake --version zeigt auf /usr/bin/cmake, während cmake auf /usr/local/bin zeigt

Unterschied zwischen /bin und /usr/bin

/bin Inhalt nach /usr/bin verschoben, rückgängig machen möglich?

Sollten Websites gemäß der empfohlenen Verwendung in /var/ oder /usr/ leben?