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