GNU/Linux >> Znalost Linux >  >> Linux

/usr/bin/ls:/usr/bin/ls:Nelze spustit binární soubor?

Používám git bash na Windows. Chci spustit ls příkaz s bash . Mohu spustit ls samostatně takto:

$ ls
f1  f2

Nicméně, když to zkusím s bash , dostávám chybu:

$ bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file

Ale když vytvořím svůj skript, funguje to dobře:

$ echo "echo [email protected]" > my.sh && bash my.sh

V čem může být problém?

Přijatá odpověď:

Z podrobného manuálu pro bash(1) :

ARGUMENTY
Pokud po zpracování možnosti zůstanou argumenty a nebyla zadána volba -c ani
-s, předpokládá se, že první argument je
název souboru
obsahující příkazy shellu.

ls obsahují příkazy shellu? Ne, je to binární soubor. bash kvílí o této skutečnosti a selhává.

strace může pomoci ukázat, co se děje:

$ strace -o alog bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file

alog soubor může být trochu chaotický, ale zobrazuje bash hledáte ls v aktuálním pracovním adresáři – bezpečnostní riziko, pokud někdo umístil nezbedné ls soubor někde! — a pak provede PATH hledat:

$ 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

Proč by to mohlo být bezpečnostní riziko, pokud spustíte bash somecmd ze špatného adresáře, kde někdo vytvořil ls (nebo nějaký jiný známý příkaz kvůli chybě ve skriptu):

$ echo "echo rm -rf /" > ls
$ bash ls
rm -rf /
$ 

Linux
  1. Jak opravit „/usr/bin/dirmngr“:Žádný takový soubor nebo adresář

  2. /usr/bin Vs /usr/local/bin Na Linuxu?

  3. Proč /bin/sh ukazuje na /bin/dash a ne /bin/bash?

  1. /usr/bin/perl:špatný interpret:Textový soubor je zaneprázdněn

  2. /usr/bin/ld:nelze najít -lpython2.7

  3. Nainstalujte binární soubory do /bin, /sbin, /usr/bin a /usr/sbin, interakce s --prefix a DESTDIR

  1. Změňte adresář a spusťte soubor jedním příkazem

  2. Jaký je rozdíl mezi #!/usr/bin/env bash a #!/usr/bin/bash?

  3. cmake --version ukazuje na /usr/bin/cmake, zatímco který cmake ukazuje na /usr/local/bin