Raspbianでシェルを使用せずにsshを介してコマンドを実行すると、次の結果が表示されます$PATH
。
$ ssh pi@raspberrypi env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
このパスが実際にどこに設定されているかが見つかりません。
ログインでも対話型シェルでもないため、/etc/profile
orのソースがないとします。/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:/bin
rootユーザーの場合、ライブメディア(udeb)がインストールされている/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Ubuntuはroot以外のユーザーに設定し、それ以外の場合はroot以外のユーザーに設定します。/usr/local/bin:/usr/bin:/bin
/usr/local/bin:/usr/bin:/bin:/usr/games