web-dev-qa-db-de.com

Wie kann ich den Fehler "Binärdatei kann nicht ausgeführt werden" beheben?

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, reboot geben command not found zurück.

Wie kann ich das beheben? Ich benutze Debian Squeeze Linux

76
superuser

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/id möglicherweise überschrieben?

80
LawrenceC

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

23
RidDeBakTiYar

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.

z.B. Ich habe bei der Installation von FF.Communicator, einem Firefox-Plugin für Chrome, den Fehler "Binärdatei kann nicht ausgeführt werden" festgestellt (damit ich Seiten ausführen kann, die Java-Applets verwenden).

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

    $ ./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 32-Bit ist elf32-i386

    $ 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
9
gaoithe

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

  1. Sie melden sich über SSH an und lösen bash aus, um Ihren ~/.profile oder ~/.bashrc auszuführen und Ihre Umgebung für Sie einzurichten (dies ist normal).
  2. Irgendwann wird versucht, /bin/id auszuführen, um Ihre UID abzurufen. Dies schlägt fehl und führt zu einem Fehler beim Ausdruck ganzer Zahlen. Das Skript wird beendet, bevor der $PATH eingerichtet werden kann.
  3. Da Ihr $PATH nicht festgelegt ist, kann bash nur Befehle mit dem angegebenen vollständigen Pfad ausführen.

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

5
Darth Android

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 Prozessorbefehlssatz, der mit kompatibel ist, funktioniert normalerweise gut, wenn sie nicht kompatibel sind, kann die CPU die Befehle nicht verstehen.

0
acoh Facha

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, die $ 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 die erforderliche Operation 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. Möglicherweise befindet sie sich nicht in Ihrer $ PATH-Variablen (mit der Befehle in Ihrer Aufbewahrung überprüft werden).

0
Nasir Mahmood