전체 경로나 앞의 "./"를 지정하지 않고 바이너리를 실행할 수 있습니까?

전체 경로나 앞의 "./"를 지정하지 않고 바이너리를 실행할 수 있습니까?

이 용어는 current directory다른 프로세스 실행과 같이 셸 외부에서 무엇을 의미합니까? 전체 경로나 앞에 "./"를 지정하지 않고 바이너리( current directory실행 파일이 포함되어 있다고 가정)를 실행할 수 있습니까?

답변1

예, 검색 경로를 적절하게 설정하면(명시적으로 작업 디렉터리를 포함하거나 "./" 포함) 이를 수행할 수 있지만 프로그램 이름 앞에 "./"를 추가하는 것이 더 좋습니다. 그 이유는 보안 때문입니다. 맬웨어는 ls일반 프로그램 이름(예: )을 사용하여 실행 파일을 작성할 수 있으며 다음 호출에서는 ls대신 로컬 복사본을 실행합니다 /bin/ls. 따라서 UNIX의 표준 PATH 설정에는 "./"가 포함되지 않습니다.

답변2

"다른 프로세스"가 무엇인지, 프로그램을 시작하는 데 사용하는 방법을 더 잘 정의해야 합니다.

그럼에도 불구하고 현재 작업 디렉터리는 실행 중인 모든 프로세스의 속성이므로 실행할 프로그램을 찾는 데 사용할 수 있습니다. 이런 식으로 구현하는 것이 안전한지 의문입니다.

답변3

빠른 수정은 별칭을 만드는 것입니다. 이 생성을 .bashrc에 추가하여 시작 중에 추가할 수 있습니다.

답변4

Unix/Linux/*BSD 커널은 항상 작업 디렉토리를 추적합니다. 시스템 호출은 C 언어가 등장한 이후부터 chdir()있었습니다 .fchdir()

C 언어 프로그램을 작성하고 execve()프로그램에서 지정한 filename매개변수를 사용하는 경우 execve(). 커널은 현재 작업 디렉터리에서 실행 파일을 찾거나, "some_executable" 또는 "subdir/some_executable"과 같은 파일 이름 인수를 제공하는 경우 현재 작업 디렉터리를 기준으로 실행 파일이 존재하고 실행 가능한 경우 커널에서 실행 파일을 찾습니다. .

cd현대 쉘(적어도 zsh)은 심볼릭 링크로 들어가서 심볼릭 링크가 포함된 디렉토리로 백업 할 수 있도록 현재 작업 디렉토리를 약간 난독화 cd ..하지만 현재 작업 디렉토리의 커널 기반 추적은 여전히 ​​존재한다는 것을 알고 있습니다. Linux 시스템에서는 ls -l /proc/$$/cwd커널이 디렉토리가 무엇이라고 생각하는지 정확하게 볼 수 있습니다.

관련 정보