나는 git bash
Windows에서 그것을 사용하고 있습니다. ls
run 명령을 사용하고 싶습니다 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
(누군가가 이상한 파일을 어딘가에 놓으면 보안 위험이 발생합니다!) 다음을 검색합니다.ls
ls
PATH
$ 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 /
$