왜 ./filename
를 사용하여 Linux에서 파일을 실행합니까?
왜 안됩니까? 다른 명령 gcc
, ls
등과 같이 입력하기 만하면됩니다 …
댓글
- ' 첫 줄이 " Linux에서 명령 을 실행 하시겠습니까? "
- user15760, 아니요. 검색 엔진에서 검색 할 수 있으며이 질문이있는 모든 사람이 타고난 것은 아닙니다. ' 닉스 스터 (:
Answer
Linux, UNIX 및 관련 운영 체제에서 .
는 현재 디렉터리를 나타냅니다. 현재 디렉터리와 해당 디렉터리에서 파일을 실행하려고하기 때문입니다. $PATH
에없는 경우 쉘에 위치를 알리려면 ./
비트가 필요합니다. 실행 파일입니다. 따라서 ./foo
는이 디렉토리에있는 foo
라는 실행 파일을 실행하는 것을 의미합니다.
type
또는 which
$PATH
에있는 모든 명령의 전체 경로를 가져옵니다.
댓글
- 현재 디렉토리에서 프로그램을 실행하는 것은 매우 일반적입니다. ' 쉘이 거기에서도 검색하지 않는 이유는 무엇입니까? 먼저.에서 검색 한 다음 $ PATH에서 검색합니다.
- iv id = “b321ad2e9d”뿐만 아니라 방해 할 수있는
alias
도 있습니다. >
.
.
에서 검색했다면 보안 문제 일 것입니다. 본인이나 다른 사람이 예를 들어 ls
(간단한 바이러스 / trojen : 누군가가 검색 할 때 ls
라는 이름의 실행 파일이 포함 된 zip 파일을 만듭니다. 그들은이 실행 파일을 실행합니다.…). 마지막으로 .
에서 검색했다면 프로그램이 작동하지 않는 이유를 모른 채 오랫동안 미쳐 버릴 수 있습니다 (예 : 프로그램을 실행하는 대신 test라는 프로그램을 만들 수 있습니다. 출력을 생성하지 않는 시스템 테스트 프로그램). Answer
정답은 다른 사람들이 제공 한 것과 같습니다. 현재 디렉토리가 $PATH
에 없기 때문입니다.
하지만 이유는 무엇입니까? 간단히 말해서 보안을위한 것입니다. “다른 사람의 홈 디렉토리 (또는 / tmp)를 찾고 있고 gcc
또는 ls
만 입력하면 모든 파일을 지우는 장난 꾸러기 친구가 작성한 악의적 인 버전이 아니라 실제 파일을 실행하고 있다는 것을 알고 있습니다. 또 다른 예는 test
또는 [
, 쉘에 내장 된 명령이없는 경우 쉘 스크립트에서 해당 명령을 재정의 할 수 있습니다.
.
를 마지막 항목이 조금 더 안전하지만이를 활용하는 다른 공격이 있습니다. 쉬운 방법은 sl
또는 ls-l
와 같은 일반적인 오타를 이용하는 것입니다. 또는이 시스템에 설치되지 않은 일반적인 명령을 찾으십시오. 예를 들어 시스템 관리자가 입력 할 가능성이 평균 이상이므로 vim
입니다.
이것이 너무 이론적으로 들립니까? 대부분 그렇지만 실제로는 특히 다중 사용자 시스템에서 발생할 수 있습니다. 실제로 여기에 관리자가 사용자 홈 디렉토리로 전환하여 ps
을 찾은이 사이트의 예가 있습니다. 해당 이름의 실행 파일로 마스킹됩니다.
댓글
-
PATH
환경 변수.
답변
그렇다면./ 시작시-이는 (Windows와 달리) 현재 디렉토리가 기본적으로 경로의 일부가 아니기 때문입니다. 다음을 실행하는 경우 :
$ ls
셸은 PATH 환경 변수 (iv)의 디렉토리에서 ls
를 찾습니다. id = “b0ea2fff81″>
확인), 찾은 첫 번째 실행 파일 ls
를 실행합니다. 다음을 입력하면 :
$ a.out
셸도 마찬가지로 작동하지만 a.out이라는 실행 파일을 찾을 수 없습니다. 셸에 위치를 알려야합니다. a.out은-현재 디렉토리 (.)에있는 경우 경로는 ./a.out
입니다.
“이 호출 된 이유”를 묻는 경우 “a.out”은 gcc의 기본 출력 파일 이름입니다. -o 명령 줄 인수로 변경할 수 있습니다. 예 :
$ gcc test.c -o test $ ./test
댓글
- 감사합니다. 처음에 ./가 필요한 이유는 의심 스럽습니다 …. "." (현재 디렉토리 위치 지정)하지만 왜 " / " 그 후?
- /는 Linux의 경로 구분 기호이므로 디렉토리 (.)를 파일 이름 (a.out)과 구분하는 데 사용합니다.이 파일이 없으면 유효한 .a.out이 있습니다. 파일 이름 자체에 있습니다. (이것을 보려면
touch .a.out; ls -lA
를 사용해보세요.) - Unix의 경로,
<dir>/<file>
그래서 기본적으로 현재 디렉토리에서 파일을 실행하는 것입니다. 이는./test
- Red Hat Linux 9? 업그레이드 할 시간입니다!
- Windows 10에서 PowerShell은 이제 기본 셸이며 현재 경로에서 실행 파일을 실행하려면
./
도 필요합니다.
답변
$ PATH 변수에 :.
를 추가 할 수 있습니다.
Alt + F2를 입력하고 Linux / GTK를 실행하는 경우 gksudo gedit /etc/environment
를 입력합니다 (Ubuntu를 사용하는 경우 사용).
그러나, 그렇게하지 말 것을 강력히 권합니다. 그것은 나쁘고 나쁘고 나쁘다.
아시다시피 1970 년부터 이런 종류의 것들이 작동합니다. 현재 디렉토리가 $ PATH에 포함되지 않은 이유가 있습니다.
.
는 현재 디렉터리입니다.
.something
는 숨겨진 파일입니다 ( “ALT +”를 입력하여 Nautilus에 나타나거나 “ls -la
“를 입력합니다.
./someProgram.sh
는 실행 가능한 someProgram을 실행하기 위해 입력하는 것입니다. .sh를 현재 디렉터리에 저장합니다.
.somethingElse
는 현재 디렉터리에 숨겨진 실행 파일이 있음을 의미하며 이는 좋지 않습니다.
답변
더 완전한 규칙은 실제로 : 슬래시가있는 경우 /
가 경로에 있으므로 PATH
를 검색하지 마십시오.
다음으로 이동하기 전에 근거를 확인하려면 먼저이 사실을 알아야합니다. 다음 중 하나를 실행합니다.
bin/someprog
또는 :
또는 :
cd bin ./myexec
bin/someprog
를
변수 : bin/someprog
, /bin/someprog
및 안에 슬래시 /
가 있습니다.
someprog
만 슬래시가 없습니다. /
, 따라서 PATH
에서만 검색합니다.
POSIX 7 은 다음 위치에서이 규칙을 지정합니다. http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01
PATH
[…] 찾고있는 경로 이름에
<slash>
가 포함되어 있으면 경로 접두사를 통한 검색이 수행되지 않습니다. .
/
POSIX PATH 규칙의 근거
다음을 실행한다고 가정합니다.
someprog
검색 할 것 :
- CWD에 먼저 관련
- 이후에 PATH에 상대적
그런 다음 /bin/someprog
작업을 수행했습니다.
someprog
때로는 작동하지만 다른 경우에는 실패합니다. 관련되지 않은 다른 someprog
프로그램이 포함 된 디렉토리에있을 수 있습니다.
그러므로 곧 이것이 신뢰할 수 없다는 것을 알게되고 항상 사용하게됩니다. PATH를 사용하고 싶을 때 절대 경로를 사용하므로 PATH의 목적을 무효화합니다.
이것이 PATH에 상대 경로를 사용하는 것이 정말 나쁜 생각 인 이유이기도합니다. 저는 node_modules/bin
를보고 있습니다.
반대로 다음을 실행한다고 가정합니다.
./someprog
검색 할 것 :
- PATH 우선
- 이후 CWD 기준
그런 다음 git 저장소에서 someprog
스크립트를 방금 다운로드하여 실행하려는 경우 CWD에서는 이것이 실행될 실제 프로그램인지 확신 할 수 없습니다. 배포판에 다음이있을 수 있기 때문입니다.
/bin/someprog
작년 크리스마스 이후에 너무 많이 마신 후 설치 한 일부 패키지입니다.
따라서 다시 한 번, 실행중인 항목을 알기 위해 항상 전체 경로를 사용하여 CWD와 관련된 로컬 스크립트를 실행해야합니다.
"$(pwd)/someprog"
또한 매우 성가신 일입니다.
당신이 생각해 내고 싶은 또 다른 규칙은 다음과 같습니다.
상대 경로는 PATH 만 사용하고 절대 경로는 CWD 만 사용합니다.
다시 한번 이렇게하면 사용자가 항상 abso 사용 "$(pwd)/someprog"
를 사용하는 비 PATH 스크립트에 대한 류트 경로.
/
경로 검색 규칙은 기억하기 쉬운 솔루션을 제공합니다. 정보 문제 :
- 슬래시 :
PATH
- 슬래시 사용 안 함 :
현재 디렉토리의 파일이
또는 somefile
, 따라서 이들 중 하나에 특별한 의미를 부여합니다.
때로는 검색 할 수없는 약간 짜증이납니다. PATH
를 기준으로 some/prog
에 대한 것이지만 이에 대한 더 나은 해결책은 보이지 않습니다.