기본 PATH를 설정하는 파일

기본 PATH를 설정하는 파일

설정 파일에 대해 혼란스러워요기본값 PATHLinux(특히 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/etcbash

답변1

간단히 말해서, 경험 법칙기준사용자, Debian 11

  1. /etc/profile, 신뢰할 수 있는 PATH를 설정합니다.
  2. /etc/environment또는 /etc/default/locale;
  3. /usr/local/bin:/usr/bin:/bin:/usr/games(GDM, XDM... 또는 OpenSSH인 경우)
  4. /etc/login.defs' ENV_PATH옵션(콘솔인 경우);
  5. getconf PATH-- 또는 이에 상응하는 C 로 대체합니다 (콘솔의 경우).

GDM, XDM... 또는 OpenSSH인 경우의미: 세션이 그래픽 데스크톱 또는 SSH인 경우.

콘솔의 경우의미: 세션이 콘솔인 경우, 즉 그래픽 데스크톱이나 SSH가 아닌 경우(아래 참조)

이는 환경 su에 적합하지 않거나 적합하지 않습니다.sudo

아래에서는 사용자가 각 테스트 사이에 로그아웃/로그인한다고 가정합니다.


테스트 설정

  • VERSION="11 (bullseye)"
  • 디스플레이 관리자: GDM3
  • 데스크탑:난쟁이, 터미널:그놈 터미널, 껍데기:세게 때리다

사용자의 ~/.bashrc, 및 을 ~/.bash_profile삭제 한 후 명령은 다음을 반환합니다 . 이 문자열을 검색하면 파일이 나타납니다 .~/.bash_login~/.profileprintenv PATH/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games/etc/etc/profile

1단계: 변경 /etc/profile및 작동 방식 확인

/etc/profile4-9행(경로 조작 부분)을 주석 처리한 후 printenv PATH다음과 같이 말합니다 /usr/local/bin:/usr/bin:/bin:/usr/games. PATH가 없다는 것은 /usr/local/games작업이 시스템에 영향을 미쳤다는 것을 나타냅니다.

다음 단계: /usr/games가능하다면 문자열 찾기

상황이 조금 더 까다로워지므로 소스 패키지 xdm,,,,를 설치해야 합니다. 그런 다음 검색 결과 그 중 세 개(,, )가 파일에 특정 유형이 설정되어 있음이 표시됩니다.gdm3lightdmopenssh/usr/gamesxdmgdm3opensshdefault_pathdebian/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/profilePATH가 설정되지 않았습니다.
    • 만약에PATH=/somepath항목 을 설정했습니다./etc/environment
      • 이 항목을 적용하고,
    • 기타
      • 컴파일된 대체 사용( /usr/local/bin:/usr/bin:/bin:/usr/games)
좀 더 벗어봐

따라서 OpenSSH 및 DM은 빈 PATH변수를 덮어쓰지만 콘솔에서는 이를 사용하지 않습니다. /etc/profilePATH 섹션이 주석 처리되고 파일 /etc/environment이 비어 있으면(기본 상태) 세 번째 PATH 값인 /etc/login.defsENV_PATH 옵션이 사용됩니다.

/etc/login.defs103행을 주석 처리하면 다음과 같은 결과를 얻을 수 있습니다.

$ 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

PATHLinux 시스템에는 변수를 설정하거나 업데이트할 수 있는 곳이 많이 있습니다 . 이는 시스템 및 관련 소프트웨어에 대한 액세스 모드에 따라 다릅니다( 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그러면 상위 셸에서 환경 변수를 상속받지 않고 셸 초기화 파일을 얻지 못하는 셸에서 변수 값이 출력됩니다.

관련 정보