回答:
SSHはログインシェルを開始します。su
、デフォルトではありません。
特に、これは、~/.profile
そのユーザーの(または同様のファイル)がソースされていないことを意味します。したがって、変更は~/.profile
有効になりません。次の場合もあります。
~/.profile
ため、ユーザーの環境が汚染される可能性があります。
/etc/profile
そして、/etc/profile.d/*
(ただし、デフォルトではない)異なるユーザごとに異なる設定を適用することができますPAM構成は異なります。たとえば、/etc/pam.d/ssh
次のとおりです。
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
一方、/etc/pam.d/su
持っています:
session required pam_env.so readenv=1 envfile=/etc/default/locale
これはSSHがロードすることを意味しますが~/.pam_environment
、ロードsu
しません。~/.pam_environment
環境変数のシェルに依存しない場所であるため、これは大きなものであり、GUI、TTY、またはSSHからログインする場合に適用されます。
ログインシェルを起動するには、次のいずれかを実行します。
su - <username>
sudo -iu <username>
例:
# su muru -c 'sh -c "echo $HOME $PATH"'
/home/muru /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
# su - muru -c 'sh -c "echo $HOME $PATH"'
/home/muru /home/muru/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
# sudo -iu muru sh -c 'echo $HOME $PATH'
/home/muru /home/muru/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# sudo -u muru sh -c 'echo $HOME $PATH'
/root /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ssh muru@localhost 'echo $HOME $PATH'
/home/muru /home/muru/devel/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
でも、SSHで使用すると、コマンドを実行する代わりにシェルを起動する場合、ログインシェルは、(注記がない場合に実行されることはありません~/bin
中に存在しているSSHのテスト、中su -
とsudo -i
)。真の結果を得るには、ログインシェルとしてシェルを実行します。
# ssh muru@localhost '$SHELL -ilc "echo \$HOME \$PATH"'
/home/muru /home/muru/bin:/home/muru/devel/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
これも理由でsudo su
ありsudo -s
、ルートシェルを取得する安っぽい方法です。これらの方法は両方とも環境によって汚染されています。
関連:
概して、それは主に戦略的な違いです。
スーパーユーザーとしてログインしている場合は、いつでも変更できます。つまり、致命的なミスに対する保護はありません。安全のために一時的に他のユーザーに変更する必要があります。
一方、限られた特権でログインしている場合、その電源に一時的にアクセスするために意図的にsu rootに移行する必要があるため、致命的なミスのリスクを回避できますが、安全なユーザーへのデフォルトのフォールバック位置があります。
したがって、違いは技術的なものではなく、本当に戦略的なものです。