SSH bắt đầu một vỏ đăng nhập. su
, theo mặc định thì không.
Cụ thể, điều này có nghĩa là ~/.profile
(hoặc tệp tương tự) cho người dùng đó không có nguồn gốc. Vì vậy, những thay đổi được thực hiện ~/.profile
sẽ không có hiệu lực. Nó cũng có thể là trường hợp:
- ngay cả khi bạn bắt đầu một vỏ đăng nhập, các thay đổi khác nhau đã được thực hiện trong root
~/.profile
, điều này có thể gây ô nhiễm môi trường của người dùng.
/etc/profile
và /etc/profile.d/*
có thể áp dụng các cài đặt khác nhau cho những người dùng khác nhau (mặc dù không phải mặc định)
- có thể có các cài đặt khác nhau cho những người dùng khác nhau trong cấu hình SSH.
Cấu hình PAM là khác nhau. Ví dụ /etc/pam.d/ssh
: có:
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
trong khi đó /etc/pam.d/su
có:
session required pam_env.so readenv=1 envfile=/etc/default/locale
Điều này có nghĩa là tải SSH ~/.pam_environment
, nhưng su
không. Đây là một điểm lớn, vì ~/.pam_environment
là nơi độc lập với vỏ cho các biến môi trường và nó được áp dụng nếu bạn đăng nhập từ GUI, TTY hoặc SSH.
Để bắt đầu một vỏ đăng nhập, hãy chạy một trong hai:
su - <username>
sudo -iu <username>
Thí dụ:
# 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
Ngay cả với SSH, nếu bạn chạy một lệnh thay vì khởi động shell, shell đăng nhập sẽ không được chạy (lưu ý sự vắng mặt ~/bin
trong kiểm tra SSH, có trong su -
và sudo -i
). Để có kết quả thực sự, tôi sẽ chạy shell của mình dưới dạng shell đăng nhập:
# 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
Đây cũng là lý do tại sao sudo su
và sudo -s
là những cách ngu ngốc để có được một vỏ gốc. Cả hai cách này đều bị ô nhiễm bởi môi trường.
Liên quan: