Datei oder Verzeichnis existiert nicht? Aber die Datei existiert!

186

Ich habe ein Spiel heruntergeladen (Shank), aber die Bin-Datei läuft nicht. Der Fehler, der angezeigt wird, wenn ich versuche, die ausführbare Datei zu starten, ist:

bash: ./shank-linux-120720110-1-bin: No such file or directory
Francesco
quelle
2
Vielleicht zuerst "chmod u + x ./shank*bin"?
Agent86
Sollte das auch nicht '.bin' sein anstatt '-bin', vielleicht ist es nur ein Tippfehler
Anake
Danke für Ihre Antwort. Ich habe den Befehl ausgeführt, den Sie als Agent86 bezeichnet haben, aber ich habe das gleiche Ergebnis. Ich habe auch die .deb-Datei heruntergeladen, aber es gibt auch ein Problem. Ich weiß nicht, welches Problem dieses Spiel hat.
Francesco
Bitte überprüfen Sie, ob Sie eine 64-Bit-Installation ausführen (dies ist der häufigste Fall für dieses Problem).
Gilles
Ja, ich bestätige, dass ich auf meinem Laptop eine 64-Bit-Architektur verwende.
Francesco

Antworten:

236

Sie versuchen wahrscheinlich, eine 32-Bit-Binärdatei auf einem 64-Bit-System auszuführen, auf dem keine 32-Bit-Unterstützung installiert ist.

Es gibt drei Fälle, in denen die Meldung "Keine solche Datei oder kein solches Verzeichnis" angezeigt wird:

  • Die Datei existiert nicht. Ich nehme an, Sie haben überprüft, ob die Datei vorhanden ist (möglicherweise, weil die Shell sie vervollständigt).
  • Es gibt eine Datei mit diesem Namen, aber es ist eine baumelnde symbolische Verknüpfung.
  • Die Datei ist vorhanden, und Sie können sie sogar lesen (der Befehl file shank-linux-120720110-1-binzeigt beispielsweise so etwas wie "ELF 32-Bit-LSB-ausführbare Datei ..." an). Wenn Sie jedoch versuchen, sie auszuführen, wird Ihnen mitgeteilt, dass die Datei nicht vorhanden ist.

Die Fehlermeldung in diesem letzten Fall ist zugegebenermaßen verwirrend. Ihnen wird gesagt, dass eine Schlüsselkomponente der Laufzeitumgebung, die zum Ausführen des Programms erforderlich ist, fehlt. Leider hat der Kanal, über den der Fehler gemeldet wird, nur Platz für den Fehlercode und nicht für diese zusätzliche Information, dass es wirklich die Laufzeitumgebung ist, die schuld ist. Wenn Sie die technische Version dieser Erklärung benötigen, lesen Sie die Meldung "Nicht gefunden", wenn Sie eine 32-Bit-Binärdatei auf einem 64-Bit-System ausführen .

Der fileBefehl sagt Ihnen genau, was diese Binärdatei ist. Mit wenigen Ausnahmen können Sie nur eine Binärdatei für die Prozessorarchitektur ausführen, für die Ihre Ubuntu-Version vorgesehen ist. Die Hauptausnahme ist, dass Sie 32-Bit-Binärdateien (x86, auch bekannt als IA32) auf 64-Bit-Systemen (amd64, auch bekannt als x86_64) ausführen können.

In Ubuntu bis 11.04 müssen Sie das ia32-libsPaket installieren , um eine 32-Bit-Binärdatei in einer 64-Bit-Installation auszuführen Installieren Sie ia32-libs. Möglicherweise müssen Sie zusätzliche Bibliotheken installieren (in diesem Fall wird eine explizite Fehlermeldung angezeigt).

Seit 11.10 (oneiric) können Sie Multiarch- Unterstützung installieren ia32-libs, aber Sie können einen differenzierteren Ansatz wählen, der ausreicht, um (plus jede andere erforderliche Bibliothek) zu erhalten.libc6-i386 Installieren Sie libc6-i386

Gilles
quelle
Vielen Dank für eine tolle Antwort, Gilles. Obwohl ich dieses Problem (noch!) Nicht erlebt habe, habe ich Ihre Antwort zur späteren Bezugnahme abgelegt.
Jim C
Vielen Dank für Ihre ausführliche Antwort! Die von mir heruntergeladene Datei ist die einzige in diesem Format (bin). Ich denke, das ist gut für alle Architekturen. Ich habe auch die .deb-Datei für meine Architektur (64-Bit) heruntergeladen, jedoch mit einem anderen Fehler. An diesem Punkt denke ich, dass das Spiel von einigen Fehlern betroffen ist oder ich dieses Spiel nicht installieren kann. Jetzt versuche ich, libc6-i386 herunterzuladen und trotzdem zu installieren. Ich werde wieder schreiben, wenn es wesentliche Änderungen gibt. Danke für deine Zeit.
Francesco
2
@Francesco Bitte poste die Lösung! Es wird wahrscheinlich anderen Leuten helfen, Shank unter Ubuntu laufen zu lassen. Es ist vollkommen in Ordnung, Ihre eigene Frage zu beantworten .
Gilles
1
Mit können Sie lddüberprüfen, ob eine Bibliothek fehlt. ldd kgio_ext.sokönnte libruby.so.2.3 => not foundunter anderem so etwas sagen
EnabrenTane
1
Es gibt anscheinend ein anderes Szenario, in dem sich bash: ...some...path...: No such file or directoryFolgendes zeigen kann: Nach dem Verschieben der ausführbaren Datei. Bash scheint Pfade zu ausführbaren Dateien in $ PATH zwischenzuspeichern; renn hash -rum es zu klären. Siehe: unix.stackexchange.com/a/5610/11352
akavel
53

64-Bit-Ubuntu-Multiarch-Systeme

Folgen Sie dieser Antwort nur, wenn die Ausgabe von file file-namezeigt,

file-name: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

Um 32 - Bit ausführbare Datei in einem 64 - Bit Multi-Arch Ubuntu - System läuft, müssen Sie hinzufügen , i386Architektur und auch müssen Sie installieren libc6:i386, libncurses5:i386, libstdc++6:i386diese drei Bibliothekspakete.

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
Avinash Raj
quelle
Ich würde sudo für den letzten Befehl verwenden: das Starten einer 32-Bit-Binärdatei (also offensichtlich nicht von Ihnen oder Ubuntu kompiliert), da sudo riskant sein könnte. (Nun, auch als nicht root, zugegebenermaßen)
alci
was auch immer es zuletzt sein mag, aber es funktioniert.
Avinash Raj
1
Es sollte beachtet werden, dass diese Antwort nicht zutrifft, wenn Sie CentOS oder RedHat verwenden. Wurde aus diesem Grund für ein paar Stunden weggeworfen.
Omikes
1
Auf Kali 2 64 Bit musste ich nur installierenlibselinux1:i386
Aralox
4

Als ich das Deb für 32-Bit installierte, wurde mir klar, dass ich einige Bibliotheken (zusätzlich zu ia32-libs und libc6) vermisse. Ich habe dieses Problem zuerst gelöst, indem ich den folgenden Befehl gab:

sudo apt-get install -f          

Dann habe ich noch einen Fehler bekommen:

Message: SDL_GL_LoadLibrary 
Error: Failed loading libGL.so.1

Offensichtlich wurden diese Bibliotheken ordnungsgemäß installiert. Ohne ins Detail zu gehen, musste ich die Bibliotheken von Hand verknüpfen. Mir wurde dann klar, dass sich durch Synaptic auch folgende Pakete leichter installieren lassen:

libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.

Danach war das nächste Problem der schwarze Bildschirm während des Spielens, den ich löste, indem ich die ausführbare Datei in / Shank / bin durch Folgendes ersetzte: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar .bz2 .

Ich hoffe, es wird jemandem nützlich sein. Wenn Sie weitere Hilfe oder Details benötigen, können Sie mich gerne kontaktieren.

Francesco
quelle
3

Hier ist eine Abschrift, die ein bisschen mehr über die Art des Problems und wie es ab Ubuntu 16.04 behoben werden kann. Beachten Sie, dass, obwohl fileBerichte "dynamisch verknüpft" sind, lddBerichte "keine dynamische ausführbare Datei" sind.

$ ./myprogram
bash: myprogram: No such file or directory

$ file myprogram
myprogram: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped

$ ldd myprogram
    not a dynamic executable

Sobald Sie libc6: i386 installiert haben, verbessern sich die Dinge ...

$ sudo apt-get install libc6:i386 # the initial fix
...

$ ldd myprogram
    linux-gate.so.1 =>  (0xf77fd000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7626000)
    /lib/ld-linux.so.2 (0x56578000)

$ ./myprogram
myprogram: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

Um den Auftrag abzuschließen, müssen Sie möglicherweise nacheinander weitere Bibliotheken identifizieren und installieren ...

$ sudo apt-get install libstdc++6:i386 ## may require various additional libs

$ ./myprogram
... works correctly ...

Ich weiß nicht, ob es eine systematische Möglichkeit gibt, die richtigen zu installierenden Bibliotheken zu identifizieren. Es gibt ein paar Vermutungen, wie die Fehlermeldungen den Paketnamen zugeordnet werden können (das Ausfüllen von Registerkarten hilft).

kein Balken
quelle
ldd(Falsch) meldet "keine dynamische ausführbare Datei".
Nobar
3

Um die Antwort von @Gilles zu erweitern, gibt es mindestens drei Szenarien, die zu diesem Fehler führen:

  1. Die Datei existiert nicht.
  2. Die Datei existiert, ist jedoch eine baumelnde symbolische Verknüpfung.
  3. Die Datei existiert (zB fileBefehl funktioniert), was zu einer rätselhaften Fehlermeldung führt. Dies kann bedeuten, dass ein Problem mit dem Lader vorliegt.

Kategorien von Laderproblemen:

  1. Der Loader einer ausführbaren Datei existiert nicht. Sie können dies mit dem Befehl file überprüfen, um festzustellen, ob der Loader vorhanden ist. Z.B

    file lmgrd
    lmgrd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.18, stripped
    

    Hinweis interpreter /lib64/ld-lsb-x86-64.so.3; Wenn diese Datei nicht vorhanden ist, müssen Sie sie installieren. Für diesen speziellen Loader am 16.04 stellte sich heraus, dass die Antwort lautete sudo apt-get install lsb.

  2. Probleme mit dem Ladeprogramm eines Skripts (siehe diese Antwort ).

  3. Fehlende gemeinsam genutzte Bibliotheken - Verwenden Sie ldd <file-name>diese Option, um nach nicht gefundenen Bibliotheken zu suchen. Weitere Informationen finden Sie in dieser Antwort .

Der nicht vorhandene Loader kann auf einen 32/64-Bit-Konflikt oder einen anderen Grund zurückzuführen sein. Möglicherweise gibt es andere Arten von Loader-Fehlern, die ich nicht kenne.

jtpereyda
quelle
1
In meinem Fall file lmutilhabe ich den Interpreter nicht gezeigt, habe es aber lddgetan, und die Installation hat lsbdas Problem gelöst.
DavidA