> tmux new -s test
> OK=test
> export OK
> env | grep OK
OK=test
> [control]+[B],[D]
> grep OK /proc/*/environ
> while read P ; do ps eww -p $P | grep OK; done < <(pgrep bash)
> id
uid=0(root) gid=0(root) groups=0(root)
보시다시피 두 가지를 시도했지만 여전히 다른 세션(셸 인스턴스)에서 환경 변수를 읽는 방법을 찾고 있습니다. tmux에서 무언가를 내보내고 실행할 때만 변수를 볼 수 있습니다(예: sleep 999). 공유를 취소해도 아무런 효과가 없는 것 같습니다.
답변1
셸의 내부를 알고 있는 디버거를 연결하고 해당 지식을 사용하여 해당 정보를 추출하는 것 외에는 할 수 있는 일이 없습니다.
아니요, getenv("OK")
대부분 system("printenv OK >/this/tty")
의 쉘은 표준 libc 함수를 사용하여 환경을 관리하지 않고 환경 목록을 execve()
.
의 환경이 /proc/PID/environ
전달되었습니다.시작프로세스와 프로세스가 의도적으로 또는 의도하지 않게 수정되었을 수 있음을 관찰합니다.
예를 들어, 이(UB 트리거) C 코드는 자식을 "추가"하며 호출 시기와 방법에 따라 자식에게 반환되거나 전달 WTF=help
될 /proc/PID/environ
수도 있고 그렇지 않을 수도 있습니다 .getenv()
setenv()
putenv()
% cat a.c
#include <string.h>
#include <unistd.h>
int main(int argc, char **argv)
{
memcpy(argv[argc + 1], "WTF=help", 9);
pause();
}
% cc a.c
% ./a.out &
[4] 3445
% tr '\0' '\n' </proc/3170/environ | head -n1
WTF=help