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.
Má 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 /
$