일반적인 방법이 실패할 때 Linux에서 실행 파일의 위치를 ​​찾는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1604132

  •  05-07-2019
  •  | 
  •  

문제

또 다른 질문에서 대답은 Unix에서 /proc, 정말 직접적이고 신뢰할 수 있는 방법은 readlink("/proc/self/exe", buf, bufsize) 그런 다음 다음과 같이 백업 솔루션을 제공합니다.

/proc가 없는 Unix에서는(예:위의 내용이 실패할 경우):

  • argv[0]이 "/"(절대 경로)로 시작하는 경우 이것이 경로입니다.
  • 그렇지 않고 argv[0]에 "/"(상대 경로)가 포함되어 있으면 이를 cwd에 추가합니다(아직 변경되지 않았다고 가정).
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1);
strncat(buf, argv[0], bufsize-strlen(buf)-1);
  • 그렇지 않으면 다음에서 디렉토리를 검색하십시오. $PATH 실행 파일용 argv[0].

그런 다음 실행 파일이 실제로 심볼릭 링크가 아닌지 확인하는 것이 합리적일 수 있습니다.그것이라면 심볼릭 링크 디렉토리를 기준으로 해결하십시오.

제 경우에는 불행히도 위의 어느 것도 작동하지 않습니다.

  1. /proc/self/exe exists 하지만 실패 readlink() 권한 거부로 인해 오류 번호 13이 발생했습니다.
  2. 그만큼 argv[0] 없다 / 절대 또는 상대 경로의 경우.
  3. 그만큼 $PATH 에 있는 실행 파일이 포함되어 있지 않습니다. argv[0].

이 문제는 sgid 애플리케이션이 실행될 때도 발생하는 것으로 보입니다.제 경우에는 sgid가 아니라 inetd 실행입니다.

도움이 되었습니까?

해결책

Suid Binary에서 /Proc를보십시오.

다른 팁

이 문제를 해결하는 가장 좋은 방법은 /etc/xinetd.d/myApp 구성 파일에서 다음과 같이 바이너리 위치를 지정하는 환경 변수를 추가하는 것입니다.

service myApp
{
    socket_type = stream
    protocol = tcp
    wait = no
    user = root
    server = /usr/local/bin/myAppd
    env = MY_APP_HOME=/usr/local/bin
    port = 2354
    disable = no
}

그런 다음 /proc/self/exe에 권한이 거부된 경우 env 변수를 확인하고 대신 사용하십시오.

대답은 다음과 같습니다. 포기하십시오.

사용자에게 명령 줄 인수로 설치 디렉토리 (또는 원하는 대상)를 전달하도록 요청하십시오.

최후의 수단으로서 /etc/xinetd.d/myapp 파일을 구문 분석하여 INETD를 통해 소환 된 실행 가능에 대한 완전한 경로를 포함하는 서버 라인을 꺼내십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top