シェルや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これはルートと非ルートの両方のデフォルトです。これDebian ビルドルール/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binrootユーザーの場合、ライブメディア(udeb)がインストールされている/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gamesUbuntuはroot以外のユーザーに設定し、それ以外の場合はroot以外のユーザーに設定します。/usr/local/bin:/usr/bin:/bin/usr/local/bin:/usr/bin:/bin:/usr/games

おすすめ記事