J'ai installé postgreSQL il y a quelque temps sur ma machine Ubuntu et j'ai configuré un db, mais je me demandais s'il serait possible de vérifier le mot de passe du nom d'utilisateur que j'avais créé, de le réinitialiser ou d'en créer un nouveau en ligne ?
Réponses
Trop de publicités?Et la manière entièrement automatisée avec bash et expect ( dans cet exemple nous provisionnons un nouvel administrateur postgres avec le pw postgres nouvellement provisionné tant au niveau du système d'exploitation que de l'exécution de postgres)
# the $postgres_usr_pw and the other bash vars MUST be defined
# for reference the manual way of doing things automated with expect bellow
#echo "copy-paste: $postgres_usr_pw"
#sudo -u postgres psql -c "\password"
# the OS password could / should be different
sudo -u root echo "postgres:$postgres_usr_pw" | sudo chpasswd
expect <<- EOF_EXPECT
set timeout -1
spawn sudo -u postgres psql -c "\\\password"
expect "Enter new password: "
send -- "$postgres_usr_pw\r"
expect "Enter it again: "
send -- "$postgres_usr_pw\r"
expect eof
EOF_EXPECT
cd /tmp/
# at this point the postgres uses the new password
sudo -u postgres PGPASSWORD=$postgres_usr_pw psql \
--port $postgres_db_port --host $postgres_db_host -c "
DO \$\$DECLARE r record;
BEGIN
IF NOT EXISTS (
SELECT
FROM pg_catalog.pg_roles
WHERE rolname = '"$postgres_db_useradmin"') THEN
CREATE ROLE "$postgres_db_useradmin" WITH SUPERUSER CREATEROLE
CREATEDB REPLICATION BYPASSRLS
PASSWORD '"$postgres_db_useradmin_pw"' LOGIN ;
END IF;
END\$\$;
ALTER ROLE "$postgres_db_useradmin" WITH SUPERUSER CREATEROLE
CREATEDB REPLICATION BYPASSRLS
PASSWORD '"$postgres_db_useradmin_pw"' LOGIN ;
"
En général, il suffit d'utiliser l'interface d'administration de pg pour effectuer des activités liées à la base de données.
Si vous vous concentrez plutôt sur l'automatisation de la configuration de la base de données pour votre développement local, ou CI etc...
Par exemple, vous pouvez utiliser une combinaison simple comme celle-ci.
(a) Créer un super utilisateur fictif via jenkins avec une commande similaire à celle-ci :
docker exec -t postgres11-instance1 createuser --username=postgres --superuser experiment001
ceci créera un super utilisateur appelé experiment001 dans votre base de données postgres.
(b) Donnez à cet utilisateur un mot de passe en exécutant une commande SQL NON INTERACTIVE.
docker exec -t postgres11-instance1 psql -U experiment001 -d postgres -c "ALTER USER experiment001 WITH PASSWORD 'experiment001' "
Postgres est probablement la meilleure base de données pour les outils en ligne de commande (non interactifs). Créer des utilisateurs, exécuter SQL, faire une sauvegarde de la base de données etc... En général, tout est assez basique avec Postgres et il est assez simple d'intégrer cela dans vos scripts de configuration de développement ou dans la configuration automatisée de CI.
J'étais sous Windows (Server 2019 ; PG 10) donc local
les connexions de type ( pg_hba.conf
: local all all peer
) ne sont pas pris en charge. Les éléments suivants devraient fonctionner aussi bien sur les systèmes Windows que sur les systèmes Unix :
- sauvegarde
pg_hba.conf
àpg_hba.orig.conf
par exemple - créer
pg_hba.conf
avec seulement ça :host all all 127.0.0.1/32 trust
- redémarrer pg (service)
- exécuter
psql -U postgres -h 127.0.0.1
- entrer (dans la console pgctl)
alter user postgres with password 'SomePass';
- rétablir
pg_hba.conf
à partir du point 1. ci-dessus
Vérifier pg_hba.conf
Si la méthode d'authentification est 'peer', le nom d'utilisateur/mot de passe du système d'exploitation du client doit correspondre au nom d'utilisateur et au mot de passe de la base de données. Dans ce cas, définissez le mot de passe de l'utilisateur Linux 'postgres' et de l'utilisateur de la base de données 'postgres' comme étant identiques.
voir la documentation pour plus de détails : https://www.postgresql.org/docs/9.1/auth-pg-hba-conf.html
La plupart des réponses étaient correctes, mais vous devez faire attention à des détails mineurs. Le problème que j'ai eu est que je n'ai jamais défini le mot de passe de postgres, donc je ne pouvais pas me connecter à une ligne de commande SQL qui me permettait de changer les mots de passe. Voici les étapes que j'ai utilisées avec succès (notez que la plupart ou toutes les commandes nécessitent l'utilisateur sudo/Root) :
- Modifier le
pg_hba.conf
dans le répertoire de données du cluster de BD auquel vous essayez de vous connecter.- Le dossier du répertoire de données peut être trouvé en inspectant la ligne de commande systemd, facilement obtenue avec
systemctl status postgresql@VERSION-DB_CLUSTER
. Remplacez VERSION par votre version PSQL et DB_CLUSTER par le nom de votre cluster de base de données. Il peut s'agir du nom principal s'il a été créé automatiquement, donc par ex.postgresql@13-main
. Alternativement, mon bash fournissait l'auto-complétion après avoir entrépostgresql@
Vous pouvez donc essayer cela ou rechercher les services postgresql dans la liste de tous les services (systemctl -a
). Une fois que vous avez la sortie d'état, cherchez la deuxième ligne de commande après CGroup, qui devrait être assez longue, et commencez par/usr/lib/postgresql/13/bin/postgres
ou similaire (selon la version, la distro et la méthode d'installation). Vous recherchez le répertoire situé après-D
par exemple/var/lib/postgresql/13/main
.
- Le dossier du répertoire de données peut être trouvé en inspectant la ligne de commande systemd, facilement obtenue avec
- Ajoutez la ligne suivante :
host all all 127.0.0.1/32 trust
. Cela permet à tous les utilisateurs de toutes les bases de données de se connecter à la base de données via IPv4 sur la machine locale. inconditionnellement, sans demander de mot de passe . Il s'agit d'une solution temporaire et n'oubliez pas de supprimer à nouveau cette ligne par la suite. Juste pour être sûr, j'ai commenté la lignehost all all 127.0.0.1/32 md5
(md5 peut être remplacé par scram-sha-256), qui est valable pour les mêmes données de connexion, nécessitant simplement un mot de passe. - Redémarrez le service de base de données :
systemctl restart postgresql@...
Encore une fois, utilisez le service exact que vous avez trouvé précédemment. - Vérifiez que le service a démarré correctement avec
systemctl status postgresql@...
. - Connectez-vous avec psql, et très important, forcer psql à ne pas demander de mot de passe . D'après mon expérience, il vous demandera un mot de passe même si le serveur s'en moque, et rejettera quand même votre connexion si votre mot de passe est incorrect. Ceci peut être réalisé avec l'option
-w
drapeau. La ligne de commande complète ressemble à ceci :sudo -u postgres psql -w -h 127.0.0.1 -p 5432
. Ici,postgres
est votre utilisateur et vous l'avez peut-être changé.5432
est le port du serveur spécifique à la grappe et peut être plus élevé si vous exécutez plus d'une grappe (j'ai 5434 par exemple). - Changez le mot de passe avec le
\password
commande spéciale. - N'oubliez pas de supprimer la solution de contournement consistant à ignorer le mot de passe et de redémarrer le serveur pour appliquer la configuration.
- Réponses précédentes
- Plus de réponses