왜 우리는 ./filename
리눅스에서 파일을 실행 하시겠습니까?
다른 명령 gcc
, ls
etc ...처럼 입력하지 않겠습니까?.
현재 디렉토리가 $PATH
에 없기 때문에 문자 그대로의 대답은 다른 사람들이 제공 한 것과 같습니다.
그러나 why? 간단히 말하면 보안을위한 것입니다. 다른 사람의 홈 디렉토리 (또는/tmp)를보고 gcc
또는 ls
만 입력하면 악의적 인 버전이 아니라 실제 버전을 실행하고 있다는 것을 알고 싶을 것입니다. 장난 꾸러기 친구가 작성하여 모든 파일을 지 웁니다. 또 다른 예는 test
또는 [
이며, 쉘에 내장 명령이없는 경우 쉘 스크립트에서 해당 명령을 무시할 수 있습니다.
경로에서 last 항목으로 .
를 사용하는 것이 좀 더 안전하지만이를 사용하는 다른 공격이 있습니다. 쉬운 방법은 sl
또는 ls-l
와 같은 일반적인 오타를 사용하는 것입니다. 또는이 시스템에 설치되지 않은 일반적인 명령 (vim
)을 찾으십시오. 예를 들어 sysadmins는 평균 이상일 가능성이 높습니다.
즉, 시작시 ./가 필요한 이유는 Windows와 달리 현재 디렉토리가 기본 경로의 일부가 아니기 때문입니다. 당신이 실행하는 경우 :
$ ls
쉘은 PATH 환경 변수의 디렉토리에서 ls
를 찾습니다 (echo $PATH
)를 확인하고 찾은 ls
이라는 첫 번째 실행 파일을 실행합니다. 입력하면 :
$ a.out
셸도 마찬가지로 작동하지만 a.out이라는 실행 파일을 찾지 못할 수 있습니다. 쉘에 a.out이 어디에 있는지 알려줘야한다. 현재 디렉토리 (.)에 있고 경로는 ./a.out
.
왜 "a.out"이라고 부르는지 묻는다면 gcc의 기본 출력 파일 이름 일뿐입니다. -o 명령 행 arg를 사용하여 변경할 수 있습니다. 예를 들면 다음과 같습니다.
$ gcc test.c -o test
$ ./test
:.
를 $ PATH 변수에 추가하십시오.
Alt + F2를 입력하고 gksudo gedit /etc/environment
Linux/GTK를 실행중인 경우 (Ubuntu를 사용하는 경우 보유).
그러나 그렇게하지 말 것을 강력히 권합니다. 나쁜 나쁜 나쁜 나쁜.
1970 년 이후 이런 종류의 것들이 작동한다는 것을 알고 있습니다. 현재 디렉토리가 $ PATH에 포함되지 않는 이유가 있습니다.
.
는 현재 디렉토리입니다
.something
은 (는) 숨겨진 파일입니다 ( "ALT +"를 입력하여 노틸러스에 표시하거나 "ls -la
".
./someProgram.sh
는 현재 디렉토리에서 someProgram.sh 실행 파일을 실행하기 위해 입력 한 것입니다.
.somethingElse
은 현재 디렉토리에 숨겨진 실행 파일이 있다는 것을 의미합니다. 이는 나쁜 생각입니다.