/usr/bin/ls: /usr/bin/ls: 바이너리 파일을 실행할 수 없습니다.

/usr/bin/ls: /usr/bin/ls: 바이너리 파일을 실행할 수 없습니다.

나는 git bashWindows에서 그것을 사용하고 있습니다. lsrun 명령을 사용하고 싶습니다 bash. 다음과 같이 개별적으로 실행할 수 있습니다 ls.

$ ls
f1  f2

그러나 사용하려고 하면 다음과 bash같은 오류가 발생합니다.

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

하지만 스크립트를 생성하면 정상적으로 작동합니다.

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

무엇이 문제일까요?

답변1

아름다운 매뉴얼에서bash(1):

매개변수 옵션 처리 후에도 매개변수가 지속되고 -c 또는 -s 옵션이 모두 제공되지 않은 경우,첫 번째 매개변수가 파일 이름이라고 가정합니다.쉘 명령이 포함되어 있습니다.

ls쉘 명령이 포함되어 있습니까 ? 아니요, 바이너리 파일입니다. bash이 사실에 대해 불평하고 실패했습니다.

A는 strace무슨 일이 일어나고 있는지 보여주는 데 도움이 될 수 있습니다.

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

파일 alog은 다소 혼란스러울 수 있지만 디스플레이는 현재 작업 디렉토리를 살펴본 후 bash(누군가가 이상한 파일을 어딘가에 놓으면 보안 위험이 발생합니다!) 다음을 검색합니다.lslsPATH

$ 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

이것이 보안 위험이 될 수 있는 이유는 bash somecmd누군가가 만든 잘못된 디렉토리 ls(또는 스크립트의 버그로 인해 알려진 다른 명령)에서 실행하는 경우입니다.

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

관련 정보