Comment puis-je résoudre l'erreur "impossible d'exécuter le fichier binaire"?

80

Lorsque je me connecte à l'aide de SSH, tout ce que je peux voir, c'est ceci ...

-bash: /usr/bin/id: cannot execute binary file
-bash: [: : integer expression expected

Je ne pouvais rien faire ici. Les commandes telles que halt, poweroff, rebootretourneront command not found.

Comment puis-je réparer cela? J'utilise Debian Squeeze Linux

super-utilisateur
la source
7
Qu'as-tu fait à cette machine?
Slhck
1
la dernière chose que j'ai faite a été d'installer logwatch. Rien d'autre.
super
3
PATHest une variable d'environnement qui contient une liste de dossiers dans lesquels le shell recherche des programmes. lspar exemple, fait habituellement référence à /bin/ls, et votre shell le trouve en parcourant les dossiers répertoriés PATHun par un jusqu'à ce qu'il le trouve, ou s'il ne le trouve dans aucun d'entre eux, il abandonne. Je suppose qu'un meilleur point de départ serait, quelle est la sortie de echo $PATH? (edit: la exportcommande est un moyen de définir une variable d’environnement dans bash.)
Darth Android
1
Ah ... je vous ai averti de ne pas éteindre le système: P Pouvez-vous accéder à la console (moniteur physique + clavier connecté)? Essayez de démarrer le système en mode mono-utilisateur (ce qui pourrait être appelé mode de récupération) et voyez si vous pouvez accéder à un shell racine.
Darth Android
2
@ David vous ne verrez aucune sortie après avoir tapé export PATH=/bin:/user/bin:/sbin:/usr/sbin. C'est une commande silencieuse.
Ben Richards

Réponses:

84

Habituellement, ce message d'erreur signifie que Linux ne reconnaît pas le fichier en tant que script shell ou fichier exécutable.

Généralement, le problème est que l'exécution d'un fichier exécutable se fasse sur une architecture incorrecte. Si vous essayez d'exécuter des exécutables x86 sur un processeur ARM, ce message s'affiche.

Avez- /usr/bin/idvous été écrasé, éventuellement?

LawrenceC
la source
15
"si vous essayez d’exécuter des exécutables x86 sur un processeur ARM, ce message s’affiche." C’EST EXACTEMENT ce qui l’a causé. Merci à tous pour vos contributions!
superutilisateur
Il s’est avéré que mon fichier binaire était un fichier exe Windows: P
forzagreen
comment pouvons nous résoudre ceci? Je suis sûr que je reçois le même problème, mais cette réponse ne me dit pas vraiment une solution: /
Newskooler
Pour résoudre ce problème, vous devez utiliser un binaire ARM et non un binaire x86. Si la source est disponible, vous pouvez recompiler / reconstruire sous un système ARM. Si la source n'est pas disponible, vérifiez auprès du fournisseur un binaire ARM. Le JRE officiel de Sun, par exemple, comporte à la fois les versions x86 et "intégrée" ou ARM. Vous devez utiliser la version ARM.
LawrenceC
24

Essayez de l'exécuter en utilisant ./executablefilename au lieu d'utiliser sh executablefilename. Ce n'est pas un script shell après tout.

RidDeBakTiYar
la source
J'ai eu ce problème en essayant d'exécuter kiwix-serve sur mon framboise pi. Je pense que ma solution globale consistait à ajuster les autorisations de fichier (personne ne l’a défini par défaut comme exécutable), puis à l' ./kiwix-serve
exécuter en
9

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

Par exemple, j'ai rencontré cette erreur "impossible d'exécuter le fichier binaire" lors de l'installation de FF.Communicator - un plug-in firefox pour Chrome (je peux donc exécuter les pages utilisant des applets java).

  • objdump montre que le binaire est 64 bits elf64-x86-64
  • Uname montre que ma machine est un i686 32 bits

    $ ./FF.Communicator bash: ./FF.Communicator: impossible d'exécuter le fichier binaire $ uname -mpio i686 i686 GNU / Linux $ objdump -a ./FF.Communicator ./FF.Communicator: format de fichier elf64-x86-64 ./Communicateur

  • objdump sur un binaire de travail sur ma machine montre qu'il est elf32-i386 32 bits

    $ objdump -a / bin / ls / bin / ls: format de fichier elf32-i386

À l'aide de ces outils, vous pouvez vérifier les architectures des machines et des fichiers binaires, pas seulement les architectures intel, mais également les processeurs.

Pour les utilisateurs de Mac OSX, vous pouvez trouver les informations d'architecture d'un fichier spécifique à l'aide de la commande "fichier":

$ file filename_here
Gaoithe
la source
6

Je fais des suppositions folles ici, mais il semble que ce qui suit se passe:

  1. Vous vous connectez sur SSH, ce bashqui vous oblige à exécuter ~/.profileou ~/.bashrcà configurer votre environnement pour vous (c’est normal).
  2. À un moment donné, il tente de s'exécuter /bin/idpour obtenir votre uid, ce qui échoue, ce qui provoque une erreur d'expression entière et met fin au script avant qu'il ne puisse configurer votre fichier $PATH.
  3. Parce que votre $PATHn'est pas défini, bash ne peut exécuter que des commandes avec le chemin complet spécifié.

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

Darth Android
la source
0

Le fichier binaire est constitué d'instructions machine que le processeur peut comprendre. Votre système d'exploitation ne signifie pas que le même exécutable sera exécuté. aller et venir entre le jeu d'instructions du processeur compatible avec fonctionnera généralement bien, si elles ne sont pas compatibles CPU ne sera pas en mesure de comprendre les instructions.

acoh Facha
la source
0

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é tel que vous l'essayez. C'est déjà un fichier binaire et vous essayez d'analyser et de lancer votre $ SHELL.

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

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

De la même façon, vous pouvez utiliser la même méthode ou ce que vous voyez dans l'extrait de code.

Tandis que, pour le reste de vos commandes, toutes ces commandes d’arrêt, d’arrêt, de redémarrage, etc. appartiennent à la racine et ont besoin de réglages de super-utilisateur pour être exécutées et exécutées. Les utilisateurs normaux ne peuvent pas les exécuter. Une autre explication est que ces commandes sont placées dans / sbin / et / usr / sbin, ce qui pourrait ne pas être dans votre variable $ PATH (utilisée pour valider les commandes sous votre garde)

Nasir Mahmood
la source
-1

Vous exécutez une version incorrecte du programme d'installation, par exemple une machine 64 bits, et essayez d'installer la version 32 bits du programme d'installation.

Kwai
la source