web-dev-qa-db-fra.com

Postgresql: Scriptage de l'exécution de psql avec mot de passe

Comment puis-je appeler psql pour qu'il ne demande pas de mot de passe?

C'est ce que j'ai

psql -Umyuser < myscript.sql

Cependant, je ne pouvais pas trouver l'argument qui transmet le mot de passe, donc psql le demande toujours.

246
Axel Fontaine

Il existe plusieurs façons de s'authentifier auprès de PostgreSQL. Vous voudrez peut-être étudier des solutions de rechange à l’authentification par mot de passe à l’adresse https://www.postgresql.org/docs/current/static/client-authentication.html .

Pour répondre à votre question, il existe plusieurs façons de fournir un mot de passe pour l'authentification par mot de passe. La manière évidente est via l'invite de mot de passe. Au lieu de cela, vous pouvez fournir le mot de passe dans un fichier pgpass ou via la variable d'environnement PGPASSWORD. Voir ces:

Il n'est pas possible de fournir le mot de passe en tant qu'argument de ligne de commande, car ces informations sont souvent disponibles pour tous les utilisateurs, et donc non sécurisées. Toutefois, dans les environnements Linux/Unix, vous pouvez fournir une variable d’environnement pour une seule commande, comme ceci:

PGPASSWORD=yourpass psql ...
283
Reece
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
149
Greg

Vous pouvez ajouter cette ligne de commande au début de votre script:

set PGPASSWORD=[your password]
65
jbaylina

Si vous souhaitez avoir plusieurs connexions hôtes/bases de données, le chemin ~/.pgpass est le chemin à parcourir.

Pas:

  1. Créez le fichier en utilisant vim ~/.pgpass ou similaire. Entrez vos informations au format suivant: hostname:port:database:username:password N'ajoutez pas de guillemets autour des valeurs de votre champ. Vous pouvez également utiliser * comme caractère générique pour les champs de votre port/base de données.
  2. Vous devez chmod 0600 ~/.pgpass pour que psql ne l'ignore pas en silence.
  3. Créez un alias dans votre profil bash qui exécute votre commande psql pour vous. Par exemple: alias postygresy='psql --Host hostname database_name -U username' Les valeurs doivent correspondre à celles que vous avez entrées dans le fichier ~/.pgpass.
  4. Source votre profil bash avec . ~/.bashrc ou similaire.
  5. Tapez votre alias à partir de la ligne de commande.

Notez que si vous avez une variable d'exportation PGPASSWORD = '' définie, elle aura priorité sur le fichier.

47
tandy

C'est peut-être une vieille question, mais il existe une méthode alternative que personne n'a mentionnée. Il est possible de spécifier le mot de passe directement dans l'URI de la connexion. La documentation peut être trouvée ici , alternativement ici .

Vous pouvez fournir votre nom d'utilisateur et votre mot de passe directement dans l'URI de connexion fourni à psql:

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
21
ajxs

Vous devez créer un fichier de mots de passe: voir http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html pour plus d'informations.

12
Femi

Si vous rencontrez des problèmes avec Windows comme moi (j'utilise Windows 7 64 bits) et set PGPASSWORD=[Password] ne fonctionnait pas.

Ensuite, comme l’a dit Kavaklioglu dans l’un des commentaires,

export PGPASSWORD=[password]

Vous devrez enregistrer ceci en haut du fichier ou avant toute utilisation afin de le configurer avant de l'appeler.

Cela fonctionne certainement sur les fenêtres :)

12
Jamie Hutber

Compte tenu des problèmes de sécurité liés à l'utilisation de la variable d'environnement PGPASSWORD, je pense que la meilleure solution globale est la suivante:

  1. Ecrivez votre propre fichier temporaire pgpass avec le mot de passe que vous souhaitez utiliser.
  2. Utilisez la variable d’environnement PGPASSFILE pour indiquer à psql d’utiliser ce fichier.
  3. Supprimer le fichier temporaire pgpass

Il y a quelques points à noter ici. L'étape 1 est là pour éviter de nettoyer le fichier ~/.pgpass de l'utilisateur qui pourrait exister. Vous devez également vous assurer que le fichier a les autorisations 0600 ou moins.

Certains ont suggéré de tirer parti de bash pour résoudre ceci de la manière suivante:

PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb

Ceci utilise la syntaxe <() pour éviter d'avoir à écrire les données dans un fichier réel. Mais cela ne fonctionne pas car psql vérifie quel fichier est utilisé et provoquera une erreur comme celle-ci:

WARNING: password file "/dev/fd/63" is not a plain file
6
mightybyte

Cela peut être fait simplement en utilisant PGPASSWORD. J'utilise psql 9.5.10. Dans votre cas, la solution serait

PGPASSWORD=password psql -U myuser < myscript.sql

6
pyAddict

Construire sur la réponse de mightybyte pour ceux qui ne sont pas à l'aise avec * nix Scripting Shell, voici un script qui fonctionne:

#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE

Le double signe dollar ($$) dans /tmp/pgpasswd$$ à la ligne 2 ajoute le numéro d'identification du processus au nom du fichier, afin que ce script puisse être exécuté plusieurs fois, même simultanément, sans effets secondaires.

Notez l’utilisation de la commande chmod à la ligne 4 - tout comme l’erreur "pas un fichier simple" qui mightybyte décrit, il y a aussi une erreur "permissions" si ce n'est pas fait.

A la ligne 7, vous n’aurez plus à utiliser le -hmyserver, le -pmyport ​​ou -Ujdoe flag si vous utilisez les valeurs par défaut (localhost: 5432) et n’avez qu’un seul utilisateur de base de données. Pour plusieurs utilisateurs (sauf la connexion par défaut), modifiez cette ligne en

psql mydb jdoe

N'oubliez pas de faire le script exécutable avec

chmod +x runpsql (ou ce que vous avez appelé le fichier de script)

UPDATE:

J'ai suivi les conseils de de RichVel et rendu le fichier illisible avant ​​y mettant le mot de passe. Cela ferme un léger trou de sécurité. Merci!

5
Eliyahu Skoczylas
2
A Question Asker

8 ans plus tard ...

Sur mon mac, je devais mettre une ligne dans le fichier ~/.pgpass comme:

<IP>:<PORT>:<dbname>:<user>:<password>

Regarde aussi:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass

0
Dirk Schumacher