web-dev-qa-db-fra.com

Quelle est la différence entre Sudo su - postgres et Sudo -u postgres?

Par défaut, les utilisateurs PostgreSQL authentifient les authentifications sur les sockets Unix, où l'utilisateur Unix doit être le même que l'utilisateur PostgreSQL. Ainsi, les gens utilisent fréquemment su ou Sudo pour devenir le superutilisateur postgres.

Je vois souvent des gens utiliser des constructions comme:

Sudo su - postgres

plutôt que

Sudo -u postgres -i

et je me demande pourquoi. De même, j'ai vu:

Sudo su - postgres -c psql

au lieu de

Sudo -u postgres psql

Sans Sudo, les versions su auraient un sens si vous étiez sur une ancienne plateforme sans Sudo. Mais pourquoi utiliser un système UNIX ou Linux moins que préhistorique utiliseriez-vous Sudo su?

38
Craig Ringer

Oublier Sudo su

Il n'y a aucun avantage à utiliser Sudo su, c'est une habitude anachronique de l'époque où les gens avaient l'habitude d'utiliser su. Les gens ont commencé à claquer Sudo devant lorsque les distributions Linux ont cessé de définir un mot de passe root et ont fait de Sudo le seul moyen d'accéder au compte root. Plutôt que de changer leurs habitudes, ils ont simplement utilisé Sudo su. (J'étais l'un d'entre eux jusqu'à relativement récemment lorsque j'utilisais des boîtes avec des configurations sudoers m'obligeait à changer d'habitude).

Utilisation Sudo -u

Pour un shell de connexion, Sudo -u postgres -i est préférable à Sudo su - postgres. Il ne nécessite pas que l'utilisateur ait un accès root dans /etc/sudoers, ils n'ont besoin que du droit de devenir utilisateur postgres. Il vous permet également d'appliquer de meilleurs contrôles d'accès.

Pour l'exécution des commandes

Sudo -u postgres psql -c "SELECT 1"

est supérieur à l'alternative:

Sudo su - postgres -c "psql -c \"SELECT 1\""

en ce que vous n'avez pas à double-échapper les guillemets et autres métacaractères Shell ainsi que les autres avantages de sécurité de ne pas avoir besoin de root. Vous atterrirez probablement accidentellement en écrivant:

Sudo su - postgres -c psql -c "SELECT 1"

parfois, ce qui ne fonctionnera pas correctement.

Enfin, il est beaucoup plus facile de définir des variables d'environnement via Sudo, par exemple.

Sudo PATH=/usr/pgsql-9.3/bin:$PATH -u postgres /usr/pgsql-9.3/bin/initdb -D /var/lib/pgsql/testcluster

que via su. (Ici, le paramètre PATH est requis pour que initdb puisse trouver l'exécutable postgres correct).

Donc. Oubliez la commande su existe. Vous n'en avez plus besoin. Pour briser cette habitude, alias-la à quelque chose qui affichera une erreur. (Certains scripts de configuration d'initialisation et de package utilisent toujours su, vous ne pouvez donc pas le supprimer).

Voir également:

41
Craig Ringer