1363 votes

est-il possible de vérifier ou de changer l'utilisateur / le mot de passe postgresql ?

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 ?

4voto

YordanGeorgiev Points 1222

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 ;
 "

2voto

99Sono Points 141

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.

2voto

Andreas Dietrich Points 155

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 :

  1. sauvegarde pg_hba.conf à pg_hba.orig.conf par exemple
  2. créer pg_hba.conf avec seulement ça : host all all 127.0.0.1/32 trust
  3. redémarrer pg (service)
  4. exécuter psql -U postgres -h 127.0.0.1
  5. entrer (dans la console pgctl) alter user postgres with password 'SomePass';
  6. rétablir pg_hba.conf à partir du point 1. ci-dessus

1voto

Sufyan Elahi Points 11

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

1voto

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 .
  • 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 ligne host 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X