쉘이나 sudo, pam.d가 변경되기 전에 Linux에서 사용자의 PATH는 어디에 설정되어 있습니까?

쉘이나 sudo, pam.d가 변경되기 전에 Linux에서 사용자의 PATH는 어디에 설정되어 있습니까?

Raspbian에서 쉘을 사용하지 않고 ssh를 통해 명령을 실행하면 다음과 같은 결과가 나타납니다 $PATH.

$ ssh pi@raspberrypi env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games

이 경로가 실제로 어디에 설정되어 있는지 찾을 수 없습니다.

로그인도 아니고 대화형 쉘도 아니기 때문에 /etc/profileor 에 대한 소스가 없다고 가정합니다 . /etc/bashrc방문할 것 같지만 bashrc그리 멀리 가지 않습니다.

# cat /etc/bash.bashrc 
# System-wide .bashrc file for interactive bash(1) shells.

# If not running interactively, don't do anything
[ -z "$PS1" ] && return


그러나 세션은 pam을 통해 처리될 것으로 보이며 , 및 를 /etc/pam.d/sshd사용하여 환경 변수를 설정하는 것이 좋습니다./etc/environment/etc/security/pam_env.conf/etc/default/locale

# Read environment variables from /etc/environment and
# /etc/security/pam_env.conf.
session    required     pam_env.so # [1]
# In Debian 4.0 (etch), locale-related environment variables were moved to
# /etc/default/locale, so read that as well.
session    required     pam_env.so user_readenv=1 envfile=/etc/default/locale

그러나 이 컴퓨터에서는 이러한 파일 중 어느 것도 설정 경로에 대한 참조를 포함하지 않습니다. 예를 들어

# cat /etc/default/locale
#  File generated by update-locale
LANG=en_GB.UTF-8

# cat /etc/environment
root@raspberrypi:~# 

# cat /etc/security/pam_env.conf | grep "^[^#;]"
root@raspberrypi:~# 

로그인 이름.defs
내가 비슷한 길을 찾을 수 있는 유일한 곳은

PATH=/usr/local/bin:/usr/bin:/bin:/usr/games

/etc/login.defs 파일에 있습니다.

login.defs:ENV_PATH        PATH=/usr/local/sbin:/usr/local/bin: \
/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

후자의 경로에는 올바른 순서로 요소가 있는 것처럼 보이지만 구성 요소가 sbin제거되었습니다. 그러나 설명서에 login.defs따르면 해당 파일은 다음과 같습니다.대부분 더 이상 사용되지 않음;

이전에 Shadow Cipher Suite에서 제공했던 대부분의 기능은 이제 PAM에서 처리됩니다. 따라서 passwd(1)은 더 이상 /etc/login.defs를 사용하지 않으며 login(1)과 su(1)은 /etc/login.defs를 덜 자주 사용합니다. 해당 PAM 구성 파일을 참조하세요.

/home/pi/.bashrc
pi 사용자는 일부 뼈대 파일을 사용하여 생성되지만 비대화형, 비로그인 셸의 경우 파일을 읽은 것으로 나타나지 않습니다.

# cat /home/pi/.bashrc 
# ~/.bashrc: executed by bash(1) for non-login shells.

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

/home/pi/.profile

# cat /home/pi/.profile 
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login

원본 $PATH가 일부 바이너리로 하드코딩되어 있나요? 아니면 뭔가 빠졌나요?

답변1

sshd바이너리 에 하드코딩되어 있습니다 .

$ strings /usr/sbin/sshd |grep /usr/local/bin
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games

OpenSSH 이식 가능한 코드에서는 다음과 같습니다._PATH_STDPATH/usr/bin:/bin:/usr/sbin:/sbin이는 루트 및 비루트 모두에 대한 기본값입니다. 이것데비안 빌드 규칙/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin루트 사용자의 경우 라이브 미디어(udeb)가 설치된 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gamesUbuntu에서는 루트가 아닌 사용자 로 설정하고 그렇지 않으면 루트가 아닌 사용자로 설정합니다./usr/local/bin:/usr/bin:/bin/usr/local/bin:/usr/bin:/bin:/usr/games

관련 정보