ある種のサーバーがある場合は、ssh user1@ip
などからアクセスできます。また、ssh root@ip
を実行して、su特権を使用してrootユーザーに移動し、su user1
に移動することもできます。私の考えでは、これらの両方の方法は同じユーザー環境(この場合は「user1」)につながるはずですが、実際の経験ではそうではなく、ssh user1@ip
にsu user1
にインストールされているものがありますありません。
何故ですか?
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
およびsu -
にあるSSHテストに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
がルートシェルを取得する安っぽい方法である理由でもあります。これらの両方の方法は、環境によって汚染されています。
関連する: