/usr/bin/ls: /usr/bin/ls: não é possível executar o arquivo binário

2

Estou usando git bash no Windows. Eu quero executar o comando ls com bash . Posso executar ls separadamente assim:

$ ls
f1  f2

No entanto, quando tento com bash , recebo o erro:

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

Mas se eu criar meu script, tudo funcionará bem:

$ echo "echo \$@" > my.sh && bash my.sh

Qual pode ser o problema?

    
por Max Koretskyi aka Wizard 03.02.2017 / 17:30

1 resposta

11

Do bom manual de bash(1) :

ARGUMENTS If arguments remain after option processing, and neither the -c nor the -s option has been supplied, the first argument is assumed to be the name of a file containing shell commands.

O ls contém comandos do shell? Não, é um arquivo binário. bash grita sobre esse fato e falha.

Um strace pode ajudar a mostrar o que está acontecendo:

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

O arquivo alog pode ficar um pouco confuso, mas mostra bash procurando ls no diretório de trabalho atual - um risco de segurança se alguém colocou um arquivo ls impertinente em algum lugar! PATH search:

$ 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

Por que isso pode ser um risco de segurança, se você executar bash somecmd do diretório errado onde alguém criou um ls (ou algum outro comando conhecido devido a um erro em um script):

$ echo "echo rm -rf /" > ls
$ bash ls
rm -rf /
$ 
    
por 03.02.2017 / 17:55

Tags