파일이 존재하지 않는다고 프로세스를 속이려면 어떻게 해야 합니까?

파일이 존재하지 않는다고 프로세스를 속이려면 어떻게 해야 합니까?

~/.config/myprogram대화식으로 사용하고 일괄 대기열 시스템과 함께 사용한다는 점 에서 설정을 저장하는 프로그램이 있습니다 . 대화형으로 실행할 때 이 프로그램이 내 구성 파일을 사용하기를 원합니다. 그러나 배치 모드로 실행하는 경우 모든 관련 설정을 덮어쓰는 명령줄 옵션을 지정하므로 구성 파일이 필요하지 않습니다. 또한 네트워크를 통해 구성 파일에 액세스하면 프로그램 시작 시간이 몇 초 정도 늘어납니다. 파일이 없으면 프로그램이 훨씬 빠르게 시작됩니다. 각 작업은 약 1분 정도만 걸리므로 일괄 작업 처리량에 상당한 영향을 미칩니다. 하지만 프로그램을 대화형으로 사용하기 때문에 구성 파일을 항상 이동/삭제하고 싶지는 않습니다. 내 배치 작업이 클러스터에서 예약되는 시기(다른 사용자의 사용량에 따라)에 따라 프로그램을 대화형으로 사용하고 동시에 배치 작업의 일부로 사용할 수 있습니다.

(여담: 네트워크 파일 성능이 너무 느린 것은 버그일 수도 있지만 저는 클러스터의 사용자일 뿐이므로 해결만 할 수는 있고 수정할 수는 없습니다.)

일괄 사용을 위해 구성 파일을 읽지 않는(또는 읽지 않는 명령줄 옵션이 있는) 프로그램 버전을 빌드할 수 있지만 이 프로그램의 빌드 환경은 제대로 설계되지 않았고 설정하기 어렵습니다. 나는 내 시스템의 패키지 관리자를 통해 설치된 바이너리를 사용하는 것을 훨씬 선호합니다.

이 프로그램의 특정 인스턴스를 속여 구성 파일이 존재하지 않는 것처럼 보이게 하려면(프로그램을 수정하지 않고) 어떻게 해야 합니까? 나는 form 의 래퍼를 원 pretendfiledoesntexist ~/.config/myprogram -- myprogram --various-options...하지만 다른 솔루션도 열려 있습니다.

답변1

해당 프로그램은 아마도 $HOME/.config/myprogram. 따라서 홈 디렉터리가 다음과 같은 다른 곳에 있다고 말할 수 있습니다.

HOME=/nowhere your-program

이제 귀하의 프로그램에는 홈 디렉토리에 다른 리소스가 필요할 수 있습니다. 그것이 무엇인지 안다면, 필요한 리소스에 대한 링크가 포함된 프로그램용 가짜 집을 준비할 수 있습니다.

mkdir -p ~/myprogram-home/.config
ln -s ~/.Xauthority ~/myprogram-home/
...
HOME=~/myprogram-home myprogram

답변2

LD_PRELOAD다른 모든 방법이 실패하면 호출을 open("/home/you/my-program/config.interactive")가로채지만 다른 호출은 통과하도록 사용하여 주입할 래퍼 라이브러리를 작성합니다 . 이는 시스템 호출을 필터링하므로 모든 유형의 프로그램, 심지어 쉘 스크립트에서도 작동합니다.

extern int errno;

int open(const char *pathname, int flags)
{
  char *config_path = get_config_file_path();
  if (!strstr(pathname, config_path))
  {
    return get_real_open(pathname, flags);
  }
  else
  {
    errno = ENOENT;
    return -1;
  }
}

참고: 이 코드를 테스트하지 않았으므로 해당 errno부분이 작동하는지 100% 확신할 수 없습니다.

방법을보세요fakerootgetuid(2)및 와 같은 호출에 사용됩니다 stat(2).

기본적으로 링커는 해당 응용 프로그램을 라이브러리에 연결하여 open기호를 재정의합니다. 자신의 라이브러리에 이름이 지정된 서로 다른 두 함수를 사용할 수 없으므로 open이를 두 번째 부분(예: )으로 분리해야 합니다. get_real_open그러면 원래 open호출에 연결됩니다.

원래의:./Application

Application -----> libc.so
            open()

차단됨:LD_PRELOAD=yourlib_wrap.so ./Application

Application -----> yourlib_wrap.so --------------> yourlib_impl.so -----> libc.so
            open()                 get_real_open()                 open()

편집하다:보기에이중 연결에 의존하지 않고도 래퍼를 작성할 수 있도록 ld활성화할 수 있는 플래그( ) 가 있습니다 .--wrap <symbol>

/* yourlib.c */
#include <stdio.h>

int __real_open(const char *pathname, int flags)

int __wrap_open(const char *pathname, int flags)
{
  char *config_path = get_config_file_path();
  if (!strstr(pathname, config_path))
  {
    /* the undefined reference here will resolve to "open" at linking time */
    return __real_open(pathname, flags);
  }
  else
  {
    errno = ENOENT;
    return -1; 
  }
}

답변3

구성 파일을 다른 곳으로 옮기고, 파일을 일반 대상에 복사하고, 프로그램을 실행하고, 종료 시 삭제하는 대화형 사용 사례에 대한 쉘 스크립트 래퍼를 작성하세요.

답변4

구성 파일의 이름을 예를 들어 config.interactive. eg라는 또 다른 빈 파일을 만듭니다 config.script.

이제 필요한 실제 구성에 대한 소프트 링크 config(또는 응용 프로그램이 구성 파일로 기대하는 모든 것)를 만들고 응용 프로그램을 실행하십시오.

ln -s config.interactive config

나중에 링크를 정리하는 것을 잊지 마세요.

관련 정보