파일이 존재하지 않는다고 생각하도록 프로세스를 속이는 방법은 무엇입니까?

파일이 존재하지 않는다고 생각하도록 프로세스를 속이는 방법은 무엇입니까?

~/.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바꿉니다 config.script.

config이제 필요한 실제 구성에 대한 소프트 링크(또는 애플리케이션이 구성 파일로 기대하는 이름)를 생성하고 애플리케이션을 실행합니다.

ln -s config.interactive config

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

관련 정보