GNU/Linux >> Tutoriels Linux >  >> Linux

/usr/bin/ls :/usr/bin/ls :impossible d'exécuter le fichier binaire ?

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

Linux
  1. /usr/bin Vs /usr/local/bin Sous Linux ?

  2. Pourquoi /bin/sh pointe-t-il vers /bin/dash et non /bin/bash ? ?

  3. Supprimé accidentellement /usr/bin/python3.5, impossible de réinstaller ?

  4. /usr/bin/perl :mauvais interpréteur :fichier texte occupé

  5. /usr/bin/ld :impossible de trouver -lpython2.7

Comment réparer '/usr/bin/dirmngr' :aucun fichier ou répertoire de ce type

Comment Linux gère-t-il plusieurs séparateurs de chemins consécutifs (/home////nom d'utilisateur///fichier) ?

Linux – Fusionner /usr/bin et /usr/sbin dans /bin (gnu/linux) ?

Déplacement du contenu de /bin vers /usr/bin, possible d'annuler ?

Obtention de l'erreur :bash :./programme :impossible d'exécuter le fichier binaire :erreur de format Exec

Les sites Web doivent-ils vivre dans /var/ ou /usr/ selon l'utilisation recommandée ?