./filename를 사용하여 Linux에서 파일을 실행합니까?

왜 안됩니까? 다른 명령 gcc, ls 등과 같이 입력하기 만하면됩니다 …

댓글

  • ' 첫 줄이 " Linux에서 명령 을 실행 하시겠습니까? "
  • user15760, 아니요. 검색 엔진에서 검색 할 수 있으며이 질문이있는 모든 사람이 타고난 것은 아닙니다. ' 닉스 스터 (:

Answer

Linux, UNIX 및 관련 운영 체제에서 .는 현재 디렉터리를 나타냅니다. 현재 디렉터리와 해당 디렉터리에서 파일을 실행하려고하기 때문입니다. $PATH에없는 경우 쉘에 위치를 알리려면 ./ 비트가 필요합니다. 실행 파일입니다. 따라서 ./foo는이 디렉토리에있는 foo라는 실행 파일을 실행하는 것을 의미합니다.

type 또는 which $PATH에있는 모든 명령의 전체 경로를 가져옵니다.

댓글

  • 현재 디렉토리에서 프로그램을 실행하는 것은 매우 일반적입니다. ' 쉘이 거기에서도 검색하지 않는 이유는 무엇입니까? 먼저.에서 검색 한 다음 $ PATH에서 검색합니다.
  • iv id = “b321ad2e9d”뿐만 아니라 방해 할 수있는 alias도 있습니다. >

.

  • @Michael 보안 및 온 전성 : 먼저 .에서 검색했다면 보안 문제 일 것입니다. 본인이나 다른 사람이 예를 들어 ls (간단한 바이러스 / trojen : 누군가가 검색 할 때 ls라는 이름의 실행 파일이 포함 된 zip 파일을 만듭니다. 그들은이 실행 파일을 실행합니다.…). 마지막으로 .에서 검색했다면 프로그램이 작동하지 않는 이유를 모른 채 오랫동안 미쳐 버릴 수 있습니다 (예 : 프로그램을 실행하는 대신 test라는 프로그램을 만들 수 있습니다. 출력을 생성하지 않는 시스템 테스트 프로그램).
  • @jcubic that ' 나쁜 생각입니다. 위의 주석을 참조하십시오. 과거에 DOS는 현재 디렉토리를 검색했고 그 동작은 Windows cmd로 옮겨져 많은 보안 문제를 야기했습니다. MS는 PowerShell에서이 문제를 수정했으며 이제 현재 디렉토리에서 프로그램을 실행하려면. \를 사용해야합니다.
  • @ ctrl-alt-delor : 80 년 후반에 대학에있을 때 ' s, 이것은 일반적인 (금지 된) 전술이었습니다. " ls " 프로그램을 작성하고 다른 사람이 스누핑 할 경우를 대비하여 홈 폴더에 남겨 둡니다. 이 프로그램을 " get shell " IIRC라고했습니다. 명령을 실행하는 사용자의 자격 증명을 가져 오려고 시도한 다음 가짜 디렉토리 목록을 인쇄하여 사용자가 알지 못하게합니다.
  • 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에 대한 것이지만 이에 대한 더 나은 해결책은 보이지 않습니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다