¿El fichero o directorio no existe? ¡Pero el archivo existe!

186

He descargado un juego (Shank) pero el archivo bin no se ejecuta. El error que se muestra cuando intento iniciar el ejecutable es:

bash: ./shank-linux-120720110-1-bin: No such file or directory
Francesco
fuente
2
¿Quizás "chmod u + x ./shank*bin" primero?
agent86
tampoco debería ser '.bin' en lugar de '-bin', tal vez sea solo un error tipográfico
Anake
Gracias por su respuesta. Hice el comando que dijiste Agent86 pero tengo el mismo resultado. También descargué el archivo .deb pero también hay un problema. No sé qué problema tiene este juego.
Francesco
Confirme si está ejecutando una instalación de 64 bits (ese es el caso más común para este problema).
Gilles
Sí, confirmo que estoy usando una arquitectura de 64 bits en mi computadora portátil.
Francesco

Respuestas:

236

Probablemente esté intentando ejecutar un binario de 32 bits en un sistema de 64 bits que no tiene instalado soporte de 32 bits.

Hay tres casos en los que puede obtener el mensaje "No existe tal archivo o directorio":

  • El archivo no existe. Supongo que has comprobado que el archivo existe (tal vez porque el shell lo completa).
  • Hay un archivo con ese nombre, pero es un enlace simbólico que cuelga.
  • El archivo existe e incluso puede leerlo (por ejemplo, el comando file shank-linux-120720110-1-binmuestra algo así como "ELF ejecutable LSB de 32 bits ...") y, sin embargo, cuando intenta ejecutarlo, le dicen que el archivo no existe.

El mensaje de error en este último caso es ciertamente confuso. Lo que le dice es que falta un componente clave del entorno de tiempo de ejecución necesario para ejecutar el programa. Desafortunadamente, el canal a través del cual se informa el error solo tiene espacio para el código de error y no para esta información adicional de que realmente es el entorno de tiempo de ejecución el culpable. Si desea la versión técnica de esta explicación, lea Obtener el mensaje "No encontrado" cuando ejecute un binario de 32 bits en un sistema de 64 bits .

El filecomando le dirá exactamente qué es este binario. Con algunas excepciones, solo puede ejecutar un binario para la arquitectura del procesador para el que es su versión de Ubuntu. La principal excepción es que puede ejecutar binarios de 32 bits (x86, también conocido como IA32) en sistemas de 64 bits (amd64, también conocido como x86_64).

En Ubuntu hasta 11.04, para ejecutar un binario de 32 bits en una instalación de 64 bits, debe instalar el ia32-libspaquete Instalar ia32-libs . Es posible que deba instalar bibliotecas adicionales (si lo hace, recibirá un mensaje de error explícito).

Desde que 11.10 ( oneiric ) introdujo el soporte multiarch , aún puede instalar ia32-libs, pero puede elegir un enfoque más detallado, es suficiente para obtener (además de cualquier otra biblioteca necesaria).libc6-i386 Instalar libc6-i386

Gilles
fuente
Gracias por una gran respuesta, Gilles. Si bien no he experimentado este problema (¡todavía!), He archivado su respuesta para referencia futura.
Jim C
¡Gracias por tu respuesta exhaustiva! El contenedor de archivos que descargué fue el único disponible en este formato (bin). Así que creo que es bueno para todas las arquitecturas. También he descargado el archivo .deb para mi arquitectura (64 bits) pero con un error diferente. En este punto, creo que el juego está afectado por algunos errores o no puedo instalarlo. Ahora trato de descargar libc6-i386 y todavía trato de instalarlo. Escribiré nuevamente si hay cambios significativos. Gracias por tu tiempo.
Francesco
2
@Francesco ¡Por favor publique la solución! Es probable que ayude a otras personas que intentan ejecutar Shank en Ubuntu. Está perfectamente bien responder tu propia pregunta .
Gilles
1
Puede usar lddpara verificar si le falta una biblioteca. ldd kgio_ext.sopodría decir algo como libruby.so.2.3 => not foundentre otros
EnabrenTane
1
Aparentemente hay otro escenario cuando bash: ...some...path...: No such file or directorypuede aparecer: después de mover el archivo ejecutable. Bash parece almacenar en caché las rutas a los ejecutables que se encuentran en $ PATH; corre hash -rpara despejarlo. Ver: unix.stackexchange.com/a/5610/11352
akavel
53

Sistemas Ubuntu Multiarch de 64 bits

Sigue esta respuesta solo si la salida de los file file-nameshows,

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

Para ejecutar el archivo ejecutable de 32 bits en un sistema Ubuntu múltiples arquitecturas de 64 bits, hay que añadir i386la arquitectura y también hay que instalar libc6:i386, libncurses5:i386, libstdc++6:i386estos tres paquetes de bibliotecas.

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
Avinash Raj
fuente
Usaría sudo para el último comando: iniciar un binario de 32 bits (obviamente no compilado por usted o Ubuntu) ya que sudo podría ser arriesgado. (bueno, incluso como no root, es cierto)
alci
lo que sea que sea al final pero funciona.
Avinash Raj
1
Debe tenerse en cuenta que si está usando CentOS o RedHat, esta respuesta no se aplica. Fue expulsado por unas horas debido a esto.
omikes
1
En Kali 2 de 64 bits, solo tuve que instalarlibselinux1:i386
Aralox el
4

Al instalar el deb para 32 bits, me di cuenta de que me faltaban algunas bibliotecas (además de ia32-libs y libc6). Primero resolví este problema dando este comando:

sudo apt-get install -f          

Entonces recibí otro error:

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

Obviamente, estas bibliotecas se instalaron correctamente. Sin entrar en detalles, tuve que vincular las bibliotecas a mano. Entonces me di cuenta de que también podría ser una solución más fácil a través de Synaptic instalar los siguientes paquetes:

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

Después de eso, el siguiente problema fue la pantalla negra durante la reproducción, que resolví reemplazando el ejecutable en / Shank / bin con esto: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar .bz2 .

Espero que sea útil para alguien. Si necesita más ayuda o más detalles, no dude en ponerse en contacto conmigo.

Francesco
fuente
3

Aquí hay una transcripción que muestra un poco más sobre la naturaleza del problema y cómo solucionarlo a partir de Ubuntu 16.04. Tenga en cuenta que aunque los fileinformes están "vinculados dinámicamente", los lddinformes "no son un ejecutable dinámico".

$ ./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

Una vez que instala libc6: i386, las cosas comienzan a mejorar ...

$ 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

Para completar el trabajo, es posible que deba identificar e instalar bibliotecas adicionales de una en una ...

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

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

No sé si hay una forma sistemática de identificar las bibliotecas correctas para instalar. Hay un poco de conjeturas que asignan los mensajes de error a los nombres de los paquetes (la finalización de la pestaña ayuda).

sin bar
fuente
ldd(incorrectamente) informa "no es un ejecutable dinámico".
nobar
3

Para ampliar la respuesta de @Gilles, hay al menos tres escenarios que resultan en este error:

  1. El archivo no existe.
  2. El archivo existe pero es un enlace simbólico colgante.
  3. El archivo existe (por ejemplo, el filecomando funciona), lo que genera un mensaje de error desconcertante. Esto puede significar que hay un problema con el cargador.

Categorías de problemas del cargador:

  1. El cargador de un ejecutable no existe. Puede verificar esto usando el comando de archivo y ver si el cargador existe. P.ej

    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
    

    Aviso interpreter /lib64/ld-lsb-x86-64.so.3; Si este archivo no existe, debe instalarlo. Para este cargador en particular en 16.04, la respuesta resultó ser sudo apt-get install lsb.

  2. Problemas con el cargador de un script (ver esta respuesta ).

  3. Faltan bibliotecas compartidas: utilícelas ldd <file-name>para buscar bibliotecas "no encontradas". Vea esta respuesta para más información.

El cargador que no existe podría deberse a una falta de coincidencia de 32/64 bits o alguna otra razón. Puede haber otros tipos de errores de cargador que no conozco.

jtpereyda
fuente
1
En mi caso, file lmutilno mostré el intérprete, pero lo lddhice, y la instalación lsbresolvió el problema.
davidA