GNU/Linux >> Tutoriales Linux >  >> Linux

/usr/bin/ls:/usr/bin/ls:¿No se puede ejecutar el archivo binario?

Estoy usando git bash en Windows Quiero ejecutar ls comando con bash . Puedo ejecutar ls por separado así:

$ ls
f1  f2

Sin embargo, cuando intento con bash , me sale el error:

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

Pero si creo mi script, funciona bien:

$ echo "echo [email protected]" > my.sh && bash my.sh

¿Cuál puede ser el problema?

Respuesta aceptada:

Del excelente manual para bash(1) :

ARGUMENTOS
Si quedan argumentos después del procesamiento de la opción, y no se ha proporcionado la opción -c ni
-s, se supone que el primer argumento es el
nombre de un archivo que contiene comandos de shell.

Hace ls contienen comandos de shell? No, es un archivo binario. bash grazna sobre este hecho y falla.

Una strace puede ayudar a mostrar lo que está pasando:

$ strace -o alog bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file

El alog El archivo puede complicarse un poco, pero muestra bash buscando ls en el directorio de trabajo actual:un riesgo de seguridad si alguien ha colocado un ls travieso archivo en alguna parte! y luego hace un PATH buscar:

$ grep ls alog
execve("/usr/bin/bash", ["bash", "ls"], [/* 43 vars */]) = 0
open("ls", O_RDONLY)                    = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/ls", 0x7fff349810f0) = -1 ENOENT (No such file or directory)
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", X_OK)             = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", R_OK)             = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", X_OK)             = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", R_OK)             = 0
open("/usr/bin/ls", O_RDONLY)           = 3

En cuanto a por qué esto podría ser un riesgo de seguridad, si ejecuta bash somecmd desde el directorio equivocado donde alguien ha creado un ls (o algún otro comando conocido debido a un error en un script):

$ echo "echo rm -rf /" > ls
$ bash ls
rm -rf /
$ 

Linux
  1. ¿Por qué /bin/sh apunta a /bin/dash y no a /bin/bash?

  2. /usr/bin/python3.5 eliminado accidentalmente, ¿no se puede reinstalar?

  3. /usr/bin/perl:mal intérprete:archivo de texto ocupado

  4. /usr/bin/ld:no se puede encontrar -lpython2.7

  5. permiso denegado para el compositor en /usr/local/bin/

Cambiar directorio y ejecutar archivo en un comando

¿Cuál es la diferencia entre #!/usr/bin/env bash y #!/usr/bin/bash?

cmake --version apunta a /usr/bin/cmake mientras que cmake apunta a /usr/local/bin

Diferencia entre /bin y /usr/bin

Se movió el contenido de /bin a /usr/bin, ¿es posible deshacerlo?

¿Deberían vivir los sitios web en /var/ o /usr/ según el uso recomendado?