설정 파일에 대해 혼란스러워요기본값 PATH
Linux(특히 Debian)에서. (나는 ~
( , 및 기타) .profile
의 사용자별 항목에는 관심이 없습니다 xsessionrc
.)
지금까지 나는 일반적인 용의자를 배제했지만 로그인할 때마다 기본값은 여전히 "/local/games"로 설정되어 있어 아무 결과도 나오지 /etc/{environment,bash.bashrc,login.defs,profile,crontab,security/pam_env.conf,default/locale,default/cron,pam.d/sshd,pam.d/cron}
않습니다 /usr/sbin/sshd
. PATH
바이너리 어딘가에 하드코딩되어 있는 것 같습니다. 나는 그것을 사용하고 있다/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
/etc
bash
답변1
간단히 말해서, 경험 법칙기준사용자, Debian 11
/etc/profile
, 신뢰할 수 있는 PATH를 설정합니다./etc/environment
또는/etc/default/locale
;/usr/local/bin:/usr/bin:/bin:/usr/games
(GDM, XDM... 또는 OpenSSH인 경우)/etc/login.defs
'ENV_PATH
옵션(콘솔인 경우);getconf PATH
-- 또는 이에 상응하는 C 로 대체합니다 (콘솔의 경우).
GDM, XDM... 또는 OpenSSH인 경우의미: 세션이 그래픽 데스크톱 또는 SSH인 경우.
콘솔의 경우의미: 세션이 콘솔인 경우, 즉 그래픽 데스크톱이나 SSH가 아닌 경우(아래 참조)
이는 환경 su
에 적합하지 않거나 적합하지 않습니다.sudo
아래에서는 사용자가 각 테스트 사이에 로그아웃/로그인한다고 가정합니다.
테스트 설정
VERSION="11 (bullseye)"
- 디스플레이 관리자: GDM3
- 데스크탑:난쟁이, 터미널:그놈 터미널, 껍데기:세게 때리다
사용자의 ~/.bashrc
, 및 을 ~/.bash_profile
삭제 한 후 명령은 다음을 반환합니다 . 이 문자열을 검색하면 파일이 나타납니다 .~/.bash_login
~/.profile
printenv PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
/etc
/etc/profile
1단계: 변경 /etc/profile
및 작동 방식 확인
/etc/profile
4-9행(경로 조작 부분)을 주석 처리한 후 printenv PATH
다음과 같이 말합니다 /usr/local/bin:/usr/bin:/bin:/usr/games
. PATH가 없다는 것은 /usr/local/games
작업이 시스템에 영향을 미쳤다는 것을 나타냅니다.
다음 단계: /usr/games
가능하다면 문자열 찾기
상황이 조금 더 까다로워지므로 소스 패키지 xdm
,,,,를 설치해야 합니다. 그런 다음 검색 결과 그 중 세 개(,, )가 파일에 특정 유형이 설정되어 있음이 표시됩니다.gdm3
lightdm
openssh
/usr/games
xdm
gdm3
openssh
default_path
debian/rules
Gdm3의 코드에서는 다음과 같은 경우에 이 값이 사용된다고 명시합니다.pam_getenv(3)PATH 값이 반환되지 않습니다.
lightdm 케이스:
이것은 debian/patches/01_set-default-path.patch
(컴파일 매개변수 대신) 소스 코드에 경로를 하드코딩하는 파일이 있다는 점에서 약간 다릅니다.
경고하다: 데비안 관리자가 사용합니다.정확히 동일한 PATH 시퀀스비교하다 /etc/profile
( /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
). 이 경우 코드에 주석을 달아 변경 사항을 알아차리기가 더 어렵습니다.
다음 단계: /etc/pam.d
정책 살펴보기
이 파일이 /etc/pam.d/gdm-launch-environment
좋은 후보인 것 같습니다. 두 파일에서 제공됩니다.
/etc/environment
;/etc/default/locale
(여기에 PATH 문을 넣으면 안 됩니다 ^^).
간단히 말해서 가능한 모든 동작을 확인하지는 않았지만 GDM과 OpenSSH는 동일하게 동작하므로 이것이 Debian 방식이라고 확신할 수 있습니다.
- 만약에
/etc/profile
PATH가 설정되지 않았습니다.- 만약에
PATH=/somepath
항목 을 설정했습니다./etc/environment
- 이 항목을 적용하고,
- 기타
- 컴파일된 대체 사용(
/usr/local/bin:/usr/bin:/bin:/usr/games
)
- 컴파일된 대체 사용(
- 만약에
좀 더 벗어봐
따라서 OpenSSH 및 DM은 빈 PATH
변수를 덮어쓰지만 콘솔에서는 이를 사용하지 않습니다. /etc/profile
PATH 섹션이 주석 처리되고 파일 /etc/environment
이 비어 있으면(기본 상태) 세 번째 PATH 값인 /etc/login.defs
ENV_PATH 옵션이 사용됩니다.
/etc/login.defs
103행을 주석 처리하면 다음과 같은 결과를 얻을 수 있습니다.
$ grep -nE '^#?ENV_(SU)?PATH' /etc/login.defs
102:ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
103:#ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
그런 다음 콘솔에 로그인할 수 있습니다(직렬 및 TTY~해야 한다동일하게 동작함) printenv PATH
다시 플레이하세요. 이번에는 다음과 같이 표시되어야 합니다 /bin:/usr/bin
. 이것은 getconf PATH
내 시스템의 값과 동일하므로 바닥에 도달한 것 같습니다.
기타 (아마도) 흥미로운 점
OpenSSH 및 그래픽 디스플레이 세션은나머지환경변수 상속(cf환경(7)).
답변2
PATH
Linux 시스템에는 변수를 설정하거나 업데이트할 수 있는 곳이 많이 있습니다 . 이는 시스템 및 관련 소프트웨어에 대한 액세스 모드에 따라 다릅니다( sshd
예: SSH 데몬에 하드 코딩된 값이 포함되어 있음 PATH
). 귀하가 보는 값이 귀하의 시스템에서 어디에 설정되어 있는지 모르겠습니다. 따라서 이 답변에서는 질문 끝 부분에서 언급한 의혹에 대해 다루겠습니다.
실행 파일에는 bash
변수에 대한 기본값이 포함되어 있습니다 PATH
.
bash
이 파일은 소스에서 셸을 컴파일할 때 수정될 수 있습니다.config-top.h
. 이 파일에는 운영 체제 배포 방식에 맞게 시스템 배포자(패키지 유지 관리자)가 자주 변경하는 다양한 컴파일 시간 설정이 포함되어 있습니다.
이 파일이 설정하는 것 중 하나는 DEFAULT_PATH_VALUE
매크로 값입니다. 쉘의 분산 소스에 설정된 값은 문자열입니다.
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
이는 명령의 출력이 됩니다.
env -i bash -c 'echo "$PATH"'
PATH
그러면 상위 셸에서 환경 변수를 상속받지 않고 셸 초기화 파일을 얻지 못하는 셸에서 변수 값이 출력됩니다.