Lorsque vous avez un serveur, vous pouvez y accéder via, par exemple, ssh user1@ip
et vous pouvez également utiliser ssh root@ip
pour accéder à votre utilisateur racine avec des privilèges su, puis pour accéder à su user1
. Selon moi, ces deux méthodes devraient me conduire au même environnement utilisateur (dans ce cas, "utilisateur1"), mais dans mon expérience actuelle, ce n'est pas le cas, car ssh user1@ip
contient des choses installées qui ne sont pas dans su user1
.
Pourquoi donc?
SSH démarre un shell de connexion. su
, par défaut non.
En particulier, cela signifie que le ~/.profile
(ou un fichier similaire) de cet utilisateur n’a pas été acheté. Ainsi, les modifications apportées dans ~/.profile
ne prendront effet. Il se pourrait aussi que:
~/.profile
de la racine, ce qui pourrait polluer l'environnement de l'utilisateur. /etc/profile
et /etc/profile.d/*
peuvent appliquer les paramètres différemment pour différents utilisateurs (pas par défaut, cependant)La configuration de PAM est différente. Par exemple, /etc/pam.d/ssh
a:
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
alors que /etc/pam.d/su
a:
session required pam_env.so readenv=1 envfile=/etc/default/locale
Cela signifie que SSH charge ~/.pam_environment
, mais su
ne le fait pas. C'est un gros problème, car ~/.pam_environment
est l'emplacement indépendant du shell pour les variables d'environnement et il est appliqué si vous vous connectez à partir de l'interface graphique, du TTY ou de SSH.
Pour démarrer un shell de connexion, exécutez l’une des opérations suivantes:
su - <username>
Sudo -iu <username>
Exemple:
# 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
Même avec SSH, si vous exécutez une commande au lieu de démarrer un shell, aucun shell de connexion ne sera exécuté (notez l'absence de ~/bin
dans le test SSH, présent dans su -
et Sudo -i
). Pour obtenir le résultat final, je vais utiliser mon shell en tant que shell de connexion:
# 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
C’est aussi pourquoi Sudo su
et Sudo -s
sont des méthodes peu fiables pour obtenir un shell racine. Ces deux voies sont polluées par l'environnement.
En relation: