J'utilise git bash
sur Windows. Je veux exécuter ls
commande avec bash
. Je peux exécuter ls
séparément comme ceci :
$ ls
f1 f2
Cependant, lorsque j'essaie avec bash
, j'obtiens l'erreur :
$ bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
Mais si je crée mon script ça marche bien :
$ echo "echo [email protected]" > my.sh && bash my.sh
Quel peut être le problème ?
Réponse acceptée :
Du bon manuel pour bash(1)
:
ARGUMENTS
S'il reste des arguments après le traitement des options, et que ni l'option -c ni l'option
-s n'ont été fournies, le premier argument est supposé être le
nom d'un fichier contenant des commandes shell.
Est-ce que ls
contient des commandes shell ? Non, c'est un fichier binaire. bash
crie à propos de ce fait et échoue.
Une strace
peut aider à montrer ce qui se passe :
$ strace -o alog bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
Le alog
le fichier peut devenir un peu désordonné, mais affiche bash
à la recherche de ls
dans le répertoire de travail courant—un risque de sécurité si quelqu'un a placé un vilain ls
fichier quelque part ! - puis fait un PATH
rechercher :
$ 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
Pourquoi cela pourrait être un risque de sécurité, si vous exécutez bash somecmd
du mauvais répertoire où quelqu'un a créé un ls
(ou une autre commande connue due à un bogue dans un script) :
$ echo "echo rm -rf /" > ls
$ bash ls
rm -rf /
$