실행 파일의 위치가 검색 경로에 없는데도 전체 경로 없이 실행 파일이 발견되는 이유는 무엇입니까?

실행 파일의 위치가 검색 경로에 없는데도 전체 경로 없이 실행 파일이 발견되는 이유는 무엇입니까?

이 질문은 실행 파일을 호출할 때 기록된 동작과 실제 동작이 일치하지 않는 이유를 이해하는 것에 관한 것입니다.스도. 언제. . . 언제안전한 길옵션을 활성화하면(내 시스템의 기본값) 검색 경로가 예상대로 작동합니다. 그러나 옵션이 비활성화되면 이상한 일이 발생합니다. /usr/local/bin실행 파일의 위치가 검색 경로에 없더라도 정규화된 경로 이름 없이 실행 파일에 액세스할 수 있습니다.

시스템 메시지

현재 내 시스템에 다음 소프트웨어가 설치되어 있습니다.

## Yeah... still haven't migrated to Alma
[me@localhost ~]$ cat /etc/centos-release
CentOS Linux release 8.5.2111

[me@localhost ~]$ bash --version | head -1
GNU bash, version 4.4.20(1)-release (x86_64-redhat-linux-gnu)

[me@localhost ~]$ sudo --version
Sudo version 1.8.29
Sudoers policy plugin version 1.8.29
Sudoers file grammar version 46
Sudoers I/O plugin version 1.8.29

[me@localhost ~]$ ssh -V
OpenSSH_8.0p1, OpenSSL 1.1.1k  FIPS 25 Mar 2021

PAM은 내 시스템에서 PATH 변수의 값을 설정하거나 업데이트하지 않습니다.

[me@localhost ~]$ grep --recursive 'pam_env\.so' /etc/pam.d
/etc/pam.d/fingerprint-auth:auth        required      pam_env.so
/etc/pam.d/smartcard-auth:auth        required      pam_env.so
/etc/pam.d/su:auth        required    pam_env.so
/etc/pam.d/password-auth:auth        required      pam_env.so
/etc/pam.d/system-auth:auth        required      pam_env.so

[me@localhost ~]$ sudo cat /etc/security/pam_env.conf /etc/environment | grep PATH
# be useful to be set: NNTPSERVER, LESS, PATH, PAGER, MANPAGER .....
#PATH       DEFAULT=${HOME}/bin:/usr/local/bin:/bin\

/etc/sudoers파일이 설정되었습니다안전한 길모든 sudoer의 값:

[me@localhost ~]$ sudo grep --recursive secure_path /etc/sudoers /etc/sudoers.d
/etc/sudoers:Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Bash의 기본값은 다음 PATH 값입니다.

[me@localhost ~]$ env --ignore-environment bash -c 'echo $PATH'
/usr/local/bin:/usr/bin

마지막으로 시스템에 SSH로 연결했는데 /etc/ssh/sshd_config파일에 다음 줄이 포함되어 있었습니다.

[me@localhost ~]$ sudo grep PATH /etc/sshd_config
# This sshd was compiled with PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

복사 과정

복제하려면 먼저 더미 스크립트를 생성하고 다음 위치에 설치합니다 /usr/local/bin.

[me@localhost ~]$ cat > dummy <<EOF
#!/usr/bin/bash
echo 'Found!'
EOF

[me@localhost ~]$ sudo install --owner=root --group=root --mode=755 dummy /usr/local/bin

사용하지 않을 때 검색 경로가 예상대로 작동하는지 확인했습니다.스도:

## The /usr/local/bin location is part of my search path
[me@localhost ~]$ echo $PATH
/home/me/.local/bin:/home/me/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

## This is expected
[me@localhost ~]$ dummy
Found!

그리고 사용스도, 이는 놀라운 일이 아닙니다.

## Sudo's secure_path value
[me@localhost ~]$ sudo --user=other env | grep PATH
PATH=/usr/bin:/bin:/usr/sbin:/sbin

## This is expected
[me@localhost ~]$ sudo --user=other which dummy
which: no dummy in (/sbin:/bin:/usr/sbin:/usr/bin)

## This too, of course
[me@localhost ~]$ sudo --user=other dummy
sudo: dummy: command not found

## Indeed, a fully qualified path name is required
[me@localhost ~]$ sudo --user=other /usr/local/bin/dummy
Found!

그런 다음 비활성화했습니다.안전한 길(여기서 조심하세요!비쥬도제안), 해당 행에 주석을 달거나 다음 행을 포함하는 파일을 /etc/sudoers생성합니다 ./etc/sudoers.d/local

# Disable secure_path if set
Defaults !secure_path

이를 방지해야스도--preserve-env, 스위치 와 함께 호출되면 PATH 환경 변수를 다음 값으로 재정의합니다.안전한 길. 예상대로 작동합니다.

그러나 스위치를 사용하지 않고 --preserve-env스위치를 사용하는 전체 로그인 시퀀스가 ​​프롬프트되지 않고 (따라서 Bash의 시작 파일을 가져오지 못하며) PATH가 PAM 환경 파일에 할당되지 않으면 --login이상한 일이 발생합니다 .

## Not sure where this PATH value is from, neither from sudo's secure_path option
## (not set), PAM environment files (contain no assignment to PATH), Bash startup
## scripts (not sourced), nor Bash or sshd default PATH values (no match).
[me@localhost ~]$ sudo --user=other env | grep PATH
PATH=/usr/bin:/bin:/usr/sbin:/sbin

## Regardless, this is expected
[me@localhost ~]$ sudo --user=other which dummy
which: no dummy in (/usr/bin:/bin:/usr/sbin:/sbin)

## But wait! What?!?
[me@localhost ~]$ sudo --user=other dummy
Found!

그렇다면 어떻게 which dummy불평 해야 할까요?가짜검색 경로에 있지 않고 dummy경로 접두사 없이 메소드를 직접 호출하지 않고도 찾을 수 있나요?

관련된 문서

다음은 이 문제를 조사하면서 찾은 다양한 관련 정보에 대한 참조입니다.

Sudo 문서에는 다음과 같이 명시되어 있습니다.안전한 길옵션:

sudo에서 실행되는 각 명령에 사용되는 경로입니다. sudo를 실행하는 사람이 일반 PATH 환경 변수를 가지고 있다는 것을 신뢰하지 않는 경우 이 방법을 사용할 수 있습니다. 또 다른 용도는 "사용자 경로"에서 "루트 경로"를 분리하려는 경우입니다. Except_group 옵션으로 지정된 그룹의 사용자는 secure_path의 영향을 받지 않습니다. 이 옵션은 기본적으로 설정되어 있지 않습니다.

~에 따르면pam_env매뉴얼 페이지의 문서에서는 /etc/environment, /etc/security/pam_env.conf~/.pam_environment만으로 표시되어야 합니다.pam_env기본값이 아닌 파일 이름을 지정하지 않는 한 기본값은 모듈입니다. 내 시스템에서는 그렇지 않습니다. 이러한 파일 중 어느 것도 PATH 값을 설정하거나 업데이트하지 않습니다.

Bash 매뉴얼 페이지는 다음과 같이 말합니다.

PATH 명령에 대한 검색 경로입니다. 이는 쉘이 명령을 찾는 콜론으로 구분된 디렉토리 목록입니다(아래 명령 실행 참조). PATH 값의 길이가 0인(빈) 디렉터리 이름은 현재 디렉터리를 나타냅니다. 빈 디렉터리 이름은 인접한 두 개의 콜론이나 선행 또는 후행 콜론으로 나타날 수 있습니다. 기본 경로는 시스템에 따라 다르며 bash를 설치한 관리자가 설정합니다. 일반적인 값은 "/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin"입니다.

gnu.org의 Bash 문서 페이지(https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html) 다양한 시작 파일의 원본 시간을 설명합니다. 위의 데모에서는 --login새 셸을 생성 --interactive하거나 호출 하지 않으므로 이러한 파일을 가져와서는 안 됩니다.스도스위치 로 --login.

이 서버 오류 답변(https://serverfault.com/questions/833762/where-does-the-bash-path-on-centos-7-get-usr-local-bin-from#answer-838552) Bash의 PATH 변수의 기본값을 설명합니다. 이는 CentOS 7의 Bash에 대한 답변이지만 CentOS 8 패키지 버전의 Bash와 여전히 관련이 있습니다. 허용되는 답변에 따라 bash 소스 코드는 config-top.h다음과 같습니다.

/* The default value of the PATH variable. */
#ifndef DEFAULT_PATH_VALUE
#define DEFAULT_PATH_VALUE \
  "/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
#endif

/* The value for PATH when invoking `command -p'.  This is only used when
   the Posix.2 confstr () function, or CS_PATH define are not present. */
#ifndef STANDARD_UTILS_PATH
#define STANDARD_UTILS_PATH \
  "/bin:/usr/bin:/sbin:/usr/sbin:/etc:/usr/etc"
#endif

답변1

env_reset나는 당신이 사이의 상호 작용을 본 적이 있다고 확신합니다 secure_path.

활성화한 후:

  • secure_pathPATH알려진 양호한 값으로 재설정
  • env_reset다음을 포함한 대부분의 환경 변수를 재설정합니다 PATH(정확한 동작은 다음을 포함한 다른 옵션 및 구성에 따라 다름 secure_path).

문제는 각 재설정이 어떤 영향을 미치는가입니다.

둘째, env_reset에 의해 시작된 프로그램에 영향을 미칩니다 sudo. 반면에 secure_path그것은 sudo그 자체에도 영향을 미칩니다. 사용할 수 없는 경우 sudo사용자의 를 사용(호출)하여 PATH프로그램을 찾습니다 . 하지만:

  • 프로그램을 시작할 때,
    • 활성화된 경우 env_reset(기본값)
      • PATH는 재설정(예: 에 의한)에 면역되지 않습니다 env_keep.
        • 프로그램은 다음과 같이 시작됩니다...
          • 재설정 값은PATH
          • (및 기타 환경 변수)

그래서 전화를 걸 which거나 다른 일을 할 때, 그 자체가 사용되는 것을 env보지 못합니다 .PATHsudo

관련 정보