web-dev-qa-db-fra.com

Quelle est la différence entre la connexion en tant qu'utilisateur et le changement d'utilisateur avec su via root?

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?

17
Miguel Corti

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:

  • même si vous démarrez un shell de connexion, différents changements ont été apportés dans le ~/.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)
  • il peut y avoir différents paramètres pour différents utilisateurs dans la configuration SSH.
  • 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:

15
muru