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