[linux] Unix에서 다른 프로세스의 환경 변수를 변경하는 방법이 있습니까?

Unix에서 한 프로세스가 다른 프로세스의 환경 변수를 변경할 수있는 방법이 있습니까 (모두 동일한 사용자에 의해 실행되고 있다고 가정)? 일반적인 해결책이 가장 좋지만 그렇지 않다면 하나가 다른 하나의 자식 인 특정 경우는 어떻습니까?

편집 : gdb를 통해 어떻습니까?



답변

gdb를 통해 :

(gdb) attach process_id

(gdb) call putenv ("env_var_name=env_var_value")

(gdb) detach

이것은 매우 끔찍한 해킹이며 물론 디버깅 시나리오의 컨텍스트에서만 수행해야합니다.


답변

기술적으로 할 수는 있지만 (다른 답변 참조) 도움이되지 않을 수 있습니다.

대부분의 프로그램은 시작 후에 env vars를 외부에서 변경할 수 없다고 예상하므로 대부분은 시작시 관심있는 vars를 읽고이를 기반으로 초기화합니다. 따라서 나중에 변경해도 프로그램이 다시 읽지 않기 때문에 차이가 없습니다.

이것을 구체적인 문제로 게시했다면 아마도 다른 접근 방식을 취해야 할 것입니다. 호기심에서 나온 것이라면 : 좋은 질문입니다 :-).


답변

실질적으로 아닙니다. 충분한 권한 (루트 또는 그 주변)이 있고 / dev / kmem (커널 메모리) 주위를 찌르고 프로세스의 환경을 변경했으며 프로세스가 실제로 나중에 환경 변수를 다시 참조했는지 (즉, 프로세스 이미 env var의 사본을 가져 오지 않았고 해당 사본 만 사용하지 않았습니다.) 운이 좋고 영리하고 바람이 올바른 방향으로 불고 달의 위상이 정확하다면 아마도 당신은 뭔가를 얻을 수 있습니다.


답변

Jerry Peek 인용 :

늙은 개에게 새로운 속임수를 가르 칠 수 없습니다.

할 수있는 유일한 방법은 시작 하기 전에 자식 프로세스의 환경 변수를 변경하는 것 입니다. 죄송합니다. 부모 환경의 복사본을 가져옵니다.

자세한 내용은 http://www.unix.com.ua/orelly/unix/upt/ch06_02.htm 을 참조하십시오.

/ proc 사용에 대한 답변에 대한 의견입니다. 리눅스에서는 / proc가 지원되지만 작동하지 않으며, 루트 사용자라도 파일을 변경할 수 없습니다 . 절대적으로 읽기 전용입니다./proc/${pid}/environ


답변

그렇게하는 다소 인위적인 방법을 생각할 수 있으며 임의의 프로세스에서는 작동하지 않습니다.

‘char * getenv’를 구현하는 자체 공유 라이브러리를 작성한다고 가정합니다. 그런 다음 ‘LD_PRELOAD’또는 ‘LD_LIBRARY_PATH’환경을 설정합니다. vars를 사용하여 두 프로세스가 모두 미리로드 된 공유 라이브러리로 실행되도록합니다.

이렇게하면 기본적으로 ‘getenv’함수의 코드를 제어 할 수 있습니다. 그런 다음 모든 종류의 불쾌한 트릭을 할 수 있습니다. ‘getenv’는 env vars의 대체 값에 대해 외부 구성 파일 또는 SHM 세그먼트를 참조 할 수 있습니다. 또는 요청 된 값에 대해 regexp 검색 / 대체를 수행 할 수 있습니다. 아니면 …

동적 링커 (ld-linux.so)를 다시 작성하지 않고 임의의 실행 프로세스 (루트 인 경우에도)에 대해이를 수행하는 쉬운 방법을 생각할 수 없습니다.


답변

또는 새 프로세스에 대한 구성 파일을 업데이트하도록 프로세스를 가져온 다음 다음 중 하나를 수행하십시오.

  • 새 프로세스에서 kill -HUP를 수행하여 업데이트 된 구성 파일을 다시 읽거나
  • 프로세스가 때때로 업데이트를 위해 구성 파일을 확인하도록하십시오. 변경 사항이 발견되면 구성 파일을 다시 읽으십시오.

답변

내가 아는 한 멀지 않습니다. 실제로 IPC 메서드 (공유 메모리, 세마포어, 소켓 등) 중 하나를 호출하는 한 프로세스에서 다른 프로세스로 통신하려고합니다. 이러한 방법 중 하나를 사용하여 데이터를 수신하면 환경 변수를 설정하거나 다른 작업을보다 직접 수행 할 수 있습니다.