자식 프로세스의 다른 사용자 환경

자식 프로세스의 다른 사용자 환경

"루트" 사용자로 실행되는 상위 프로세스가 있습니다. fork(), execl()및 이후에는 setuid()/setgid()하위 프로세스가 다른 운영 체제 사용자(예: user1)로 시작됩니다.

환경을 인쇄하면 user1로 로그인한 것과는 달리 루트 환경과 동일하다는 것을 알 수 있습니다(마치 루트로 로그인한 것처럼). 왜?

하위 프로세스에서 user1의 환경을 읽는 방법이 있습니까?

답변1

모든 프로세스에는상위 환경에서 복사된 자체 환경. 부모가 쉘이라면 개념이 있습니다내보낼 수 있는 변수이 점을 고려해야 하지만 직접 거래하는 경우에는 적용되지 않습니다 exec(). 이 LOGNAME변수는 일반적으로 로그인 쉘에 의해 설정되며 재설정되지 않은 나머지 값만 표시됩니다. 그래서 당신은아이의 환경을 살펴보세요. 일부 시스템에서는 상위(또는 기타 프로세스) 환경에 쉽게 액세스할 수 없지만 Linux에서는 액세스할 수 있습니다(권한 제한에 따라 다름).통과하다/proc)

su을 시도하여 보고 있는 효과를 재현할 수 있습니다 su -. 후자는 쉘 로그인 환경을 초기화하여 (거의 확실하게) 재설정되고 LOGNAME전자는 무엇보다도 변경되지 않은 상태로 유지됩니다.

env명령을 사용하는 것은 명령줄에서 새 프로세스를 시작할 때 깨끗한 환경을 얻는 한 가지 방법이며, execle()유사한 작업을 수행하는 방법을 알아보려면 시스템의 설명서를 확인해야 합니다.

답변2

다음 명령을 사용하여 간단하게 사용자 환경을 확인할 수 있습니다.

su -l user_name  -c "run_programm && env"

또는 env해당 pid를 사용하여 하위 프로세스를 확인할 수 있습니다.

하위 프로세스 pid가 24112다음 env을 사용하여 확인된다고 가정합니다.

cat /proc/24112/environ

답변3

몇가지 정보:

  • 환경 변수를 사용 execle하거나 하위 항목에 제공할 수 있습니다. execve이를 사용하여 더 이상 하위 프로세스에 적합하지 않은 상위 ​​프로세스의 환경 변수를 억제하고 하위 프로세스에 추가 변수를 제공할 수 있습니다.
  • 예를 들어 를 사용하여 하위 항목에 대한 "로그인 셸"을 시작할 수 있습니다 bash -l. 이렇게 하면 하위 항목과 같은 환경이 채워집니다. 많은 쉘(bash 포함)의 경우 바이너리 이름 앞에 하이픈을 추가하는 것(예 -bash: pass argv[0])은 동일한 효과를 갖습니다. 이러한 차이점의 주요 영향은 로그인 셸이 실행되거나 /etc/profile다른 프로필 셸 스크립트를 실행하여 많은 수의 환경 변수를 설정한다는 것입니다.
  • 인증 및 세션 초기화를 위해 PAM을 사용하는 서비스의 경우 이 pam_env모듈은 환경을 적절하게 초기화하는 역할을 담당합니다. 이를 사용하거나 해당 동작을 에뮬레이트하기 위해 해당 구성을 볼 수 있습니다.

답변4

각 프로세스에는 일련의 환경 변수가 있습니다(셸 export SOMEVAR=value등에서 설정할 수 있음). 이는 하위 프로세스에 의해 변경되지 않고 상속됩니다. 이를 재설정하려면 를 사용하여 extern char **environ;전달된 환경(참고자료 참조 environ(7))을 가져온 다음 복사된 변수 값이 포함된 새 환경 배열을 사용 execle(3)하거나 전달합니다. execve(3)데이비드 휠러(David Wheeler)는 자신의 책에서 무엇을 해야 하는지, 어떻게 해야 하는지에 대한 몇 가지 지침을 제공합니다."보안 Unix/Linux 프로그래밍 가이드"

관련 정보