120 votes

Comment puis-je résoudre l'erreur "cannot execute binary file"?

Quand je me connecte en utilisant SSH, tout ce que je peux voir est ceci...

-bash: /usr/bin/id: impossible d'exécuter le fichier binaire
-bash: [: : expression entière attendue

Je ne pouvais rien faire ici. Des commandes telles que halt, poweroff, reboot renverront command not found.

Comment puis-je résoudre ce problème? J'utilise Debian Squeeze Linux

17 votes

Que avez-vous fait à cette machine?

1 votes

La toute dernière chose que j'ai faite a été d'installer logwatch. Rien d'autre.

0 votes

Pouvez-vous export PATH=/bin:/usr/bin:/sbin:/usr/sbin ? La shell peut-elle trouver halt/poweroff/reboot ensuite ? (Notez, je vous conseillerais de ne pas éteindre le système à moins de savoir que vous pouvez le redémarrer, ou d'avoir accepté que vous pourriez devoir démarrer à partir d'un live-CD et tout réparer manuellement)

118voto

LawrenceC Points 70381

Généralement, ce message d'erreur signifie que Linux ne reconnaît pas le fichier comme un script shell ou comme un fichier exécutable.

Typiquement, la cause est l'exécution d'un exécutable sur une mauvaise architecture - si vous essayez d'exécuter des exécutables x86 sur un processeur ARM, ce message apparaît.

Est-ce que /usr/bin/id a été écrasé, peut-être?

25 votes

"si vous essayez d'exécuter des fichiers exécutables x86 sur un CPU ARM, ce message apparaît." C'était EXACTEMENT ce qui l'a causé. Merci à tous pour vos contributions!

0 votes

Il s'est avéré que mon fichier binaire était un fichier exe Windows :P

2 votes

Comment pouvons-nous résoudre cela? Je suis sûr(e) d'avoir le même problème, mais cette réponse ne me donne pas vraiment de solution : /

41voto

sharvey Points 1698

Essayez de l'exécuter en utilisant ./nomdufichierexecutable au lieu d'utiliser sh nomdufichierexecutable. Après tout, ce n'est pas un script shell.

0 votes

J'ai eu ce problème en essayant d'exécuter kiwix-serve sur mon raspberry pi. Ma solution globale a été, je crois, d'ajuster les autorisations du fichier (il n'était pas défini comme exécutable par défaut) puis de l'exécuter avec ./kiwix-serve

16voto

gaoithe Points 481

Le problème est d'exécuter un binaire pour une architecture de processeur différente. Vous pouvez utiliser objdump (de binutils) pour vérifier l'architecture des binaires. Vous pouvez utiliser uname pour vérifier l'architecture d'une machine.

par exemple, j'ai rencontré cette erreur "cannot execute binary file" lors de l'installation de FF.Communicator - un plugin firefox pour chrome (afin de pouvoir exécuter des pages utilisant des applets java).

  • objdump montre que le binaire est en 64 bits elf64-x86-64

  • uname montre que ma machine est en 32 bits i686

    $ ./FF.Communicator 
    bash: ./FF.Communicator: cannot execute binary file
    $ uname -mpio
    i686 i686 i386 GNU/Linux
    $ objdump -a ./FF.Communicator 
    ./FF.Communicator:     file format elf64-x86-64
    ./FF.Communicator
  • objdump sur un binaire fonctionnel sur ma machine montre qu'il est en 32 bits elf32-i386

    $ objdump -a /bin/ls
    /bin/ls:     file format elf32-i386

En utilisant ces outils, vous pouvez vérifier les architectures des machines et des binaires - pas seulement les architectures Intel mais n'importe quel processeur.

Pour les utilisateurs de Mac OSX, vous pouvez obtenir les informations sur l'architecture d'un fichier spécifique en utilisant la commande "file" :

$ file nom_du_fichier

7voto

Darth Android Points 36975

Je fais quelques suppositions sauvages ici, mais il semble que ce qui suit se passe:

  1. Vous vous connectez via SSH, déclenchant bash pour exécuter votre ~/.profile ou ~/.bashrc pour configurer votre environnement pour vous (c'est normal).
  2. À un moment donné, il tente d'exécuter /bin/id pour obtenir votre uid, ce qui échoue, provoquant une erreur d'expression entière, et terminant le script avant qu'il ne puisse configurer votre $PATH.
  3. Parce que votre $PATH n'est pas défini, bash ne peut exécuter que des commandes avec le chemin complet spécifié.

Utilisez export PATH=/bin:/usr/bin:/sbin:/usr/sbin pour résoudre le problème de $PATH jusqu'à ce que vous puissiez résoudre la cause première de l'échec de /bin/id.

5voto

Nasir Mahmood Points 31

Cela signifie que vous essayez d'exécuter un fichier binaire à l'aide de votre script bash qui n'est pas destiné à être exécuté comme vous essayez de le faire. Il s'agit déjà d'un fichier binaire et vous essayez que votre $SHELL l'analyse et l'exécute.

dans un exemple très simple, si vous essayez d'exécuter la commande `w' comme

$ bash w
/usr/bin/w: /usr/bin/w: ne peut pas exécuter le fichier binaire

de même, vous pourriez être confronté au même problème ou comme il apparaît dans votre extrait de code.

Cependant, pour le reste de vos commandes, toutes ces commandes halt, shutdown, reboot, etc. sont des commandes appartenant à la racine et nécessitent des privilèges de super-utilisateur pour s'exécuter et effectuer l'opération requise. les utilisateurs normaux ne peuvent pas les exécuter une autre explication est que ces commandes sont placées dans /sbin/ et /usr/sbin, qui pourraient ne pas être dans votre variable $PATH (qui est utilisée pour valider les commandes à votre disposition)

0 votes

Eh bien, ceci est une explication très possible sur l'environnement docker/podman/container lors de l'utilisation de CMD, merci

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X