Wie kann ich den Fehler beheben, dass eine Binärdatei nicht ausgeführt werden kann?

80

Wenn ich mich mit SSH anmelde, sehe ich nur Folgendes ...

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

Ich konnte hier nichts machen. Befehle wie halt, poweroff, rebootzurückkehren wird command not found.

Wie kann ich das beheben? Ich benutze Debian Squeeze Linux

Superuser
quelle
7
Was hast du mit dieser Maschine gemacht?
Slhck
1
das allerletzte was ich gemacht habe war logwatch zu installieren. Nichts anderes.
Superuser
3
PATHist eine Umgebungsvariable, die eine Liste von Ordnern enthält, die die Shell nach Programmen durchsucht. lsB. bezieht sich normalerweise auf /bin/ls, und Ihre Shell findet es, indem sie die Ordner PATHnacheinander durchsucht, bis sie es findet, oder wenn sie es in keinem von ihnen findet, gibt sie es auf. Ich nehme an, ein besserer Ausgangspunkt wäre, was ist die Ausgabe von echo $PATH? (Bearbeiten: Der exportBefehl ist eine Möglichkeit, eine Umgebungsvariable in Bash zu definieren.)
Darth Android
1
Ah ... Ich habe Sie gewarnt, das System nicht herunterzufahren: P Können Sie auf die Konsole zugreifen (physischer Monitor + angeschlossene Tastatur)? Versuchen Sie, das System im Einzelbenutzermodus zu starten (möglicherweise als Wiederherstellungsmodus bezeichnet), und prüfen Sie, ob Sie eine Root-Shell erreichen können.
Darth Android
2
@ David Sie werden keine Ausgabe nach der Eingabe sehen export PATH=/bin:/user/bin:/sbin:/usr/sbin. Es ist ein stiller Befehl.
Ben Richards

Antworten:

84

Normalerweise bedeutet diese Fehlermeldung, dass Linux die Datei nicht als Shell-Skript oder als ausführbare Datei erkennt.

In der Regel wird eine ausführbare Datei auf der falschen Architektur ausgeführt. Wenn Sie versuchen, x86-ausführbare Dateien auf einer ARM-CPU auszuführen, wird diese Meldung angezeigt.

Wurde /usr/bin/idmöglicherweise überschrieben?

LawrenceC
quelle
15
"Wenn Sie versuchen, x86-Programme auf einer ARM-CPU auszuführen, wird diese Meldung angezeigt." Genau das hat es verursacht. Vielen Dank an alle für Ihre Beiträge!
Superuser
Es stellte sich heraus meine binäre Windows EXE - Datei war: P
forzagreen
Wie können wir das lösen? Ich bin sicher, ich bekomme das gleiche Problem, aber diese Antwort sagt mir nicht wirklich eine Lösung: /
Newskooler
Zum Auflösen müssen Sie eine ARM-Binärdatei und keine x86-Binärdatei verwenden. Wenn die Quelle verfügbar ist, können Sie sie unter einem ARM-System neu kompilieren / erstellen. Wenn die Quelle nicht verfügbar ist, erkundigen Sie sich beim Hersteller nach einer ARM-Binärdatei. Die offizielle JRE von Sun hat beispielsweise sowohl x86- als auch "embedded" - oder ARM-Versionen. Sie müssen die ARM-Version verwenden.
LawrenceC
24

Versuchen Sie, es mit ./executablefilename anstelle von sh executablefilename auszuführen. Es ist schließlich kein Shell-Skript.

RidDeBakTiYar
quelle
Ich hatte dieses Problem, als ich versuchte, Kiwix-Serve auf meinem Himbeer-Pi auszuführen. Meiner Meinung nach bestand meine Gesamtlösung darin, die Dateiberechtigungen anzupassen (standardmäßig war sie für niemanden ausführbar) und sie dann ./kiwix-serve
cchapman
9

Das Problem besteht darin, eine Binärdatei für eine andere Prozessorarchitektur auszuführen. Sie können objdump (from binutils) verwenden, um die Architektur von Binärdateien zu überprüfen. Sie können uname verwenden, um die Architektur eines Computers zu überprüfen.

Ich habe zB diesen Fehler "kann keine Binärdatei ausführen" festgestellt, als ich FF.Communicator - ein Firefox-Plugin für Chrome - installiert habe (damit ich Seiten ausführen kann, die Java-Applets verwenden).

  • objdump zeigt, dass die Binärdatei 64-Bit elf64-x86-64 ist
  • uname zeigt an, dass mein Rechner ein 32-Bit- i686 ist

    $ ./FF.Communicator bash: ./FF.Communicator: Binärdatei $ uname -mpio i686 i686 i386 GNU / Linux $ objdump -a ./FF.Communicator ./FF.Communicator: Dateiformat elf64-x86-64 kann nicht ausgeführt werden ./FF.Communicator

  • objdump auf einer funktionierenden Binärdatei auf meinem Computer zeigt, dass es sich um 32-Bit- elf32-i386 handelt

    $ objdump -a / bin / ls / bin / ls: Dateiformat elf32-i386

Mit diesen Tools können Sie Architekturen von Maschinen und Binärdateien überprüfen - nicht nur Intel-Architekturen, sondern alle Prozessoren.

Für Mac OS X-Benutzer können Sie die Architekturinformationen einer bestimmten Datei mit dem Befehl "file" ermitteln:

$ file filename_here
Gaoithe
quelle
6

Ich mache hier einige wilde Vermutungen, aber es sieht so aus, als ob Folgendes passiert:

  1. Sie melden sich über SSH bashan und starten , um Ihre Umgebung auszuführen ~/.profileoder ~/.bashrceinzurichten (dies ist normal).
  2. Irgendwann versucht es auszuführen /bin/id, um Ihre UID abzurufen, was fehlschlägt, einen Fehler beim Ausdruck ganzer Zahlen verursacht und das Skript beendet, bevor es Ihre einrichten kann $PATH.
  3. Da your $PATHnicht gesetzt ist, kann bash nur Befehle mit dem angegebenen vollständigen Pfad ausführen.

Verwenden Sie diese Option export PATH=/bin:/usr/bin:/sbin:/usr/sbin, um das $PATHProblem zu beheben , bis Sie die Grundursache für das Fehlschlagen von / bin / id beheben können.

Darth Android
quelle
0

Die Binärdatei besteht aus Maschinenanweisungen, die der Prozessor verstehen kann. Ihr Betriebssystem bedeutet nicht, dass dieselbe ausführbare Datei ausgeführt wird. Das Hin- und Herbewegen zwischen dem mit kompatiblen Prozessorbefehlssatz funktioniert normalerweise gut, wenn sie nicht kompatibel sind, kann die CPU die Befehle nicht verstehen.

acoh Facha
quelle
0

Dies bedeutet, dass Sie versuchen, eine Binärdatei mit Ihrem Bash-Skript auszuführen, das nicht so ausgeführt werden soll, wie Sie es möchten. Es ist bereits eine Binärdatei und Sie versuchen, $ SHELL zu analysieren und auszuführen.

in einem sehr einfachen Beispiel, wenn Sie versuchen, den Befehl "w" auszuführen, wie

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

In ähnlicher Weise könnten Sie die gleiche Methode anwenden oder wie es aus Ihrem Code-Snippet aussieht.

Während für die verbleibenden Befehle Alle diese Befehle zum Anhalten, Herunterfahren, Neustarten usw. die root-Befehle sind und Super-User-Prilveges benötigen, um den erforderlichen Vorgang auszuführen und auszuführen. Normale Benutzer können sie nicht ausführen. Eine andere Erklärung ist, dass diese Befehle unter / sbin / und / usr / sbin abgelegt sind. Diese befinden sich möglicherweise nicht in Ihrer $ PATH-Variablen (mit der Befehle in Ihrer Aufbewahrung überprüft werden).

Nasir Mahmood
quelle
-1

Sie führen eine falsche Version des Installationsprogramms aus, z. B. einen 64-Bit-Computer, und versuchen, die 32-Bit-Version des Installationsprogramms zu installieren.

kwai
quelle