Comment spécifier un mot de passe pour 'psql' de manière non interactive?

338

J'essaie d'automatiser le processus de création de base de données avec un script shell et une chose que j'ai rencontré un obstacle en passant un mot de passe à psql . Voici un peu de code du script shell:

psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"

Comment puis-je transmettre un mot de passe de psqlmanière non interactive?

Alex N.
la source
1
Vous pouvez utiliser une URL de connexion. Vérifiez ces réponses dans stackoverflow.com/questions/3582552/postgres-connection-url .
paulodiovani

Réponses:

140

De la documentation officielle :

Il est également pratique d'avoir un fichier ~ / .pgpass pour éviter d'avoir à taper régulièrement des mots de passe. Voir Section 30.13 pour plus d'informations.

...

Ce fichier doit contenir des lignes du format suivant:

hostname:port:database:username:password

Le champ de mot de passe de la première ligne qui correspond aux paramètres de connexion actuels sera utilisé.

Flimzy
la source
29
Merci, je connais pgpass, mais cela ne résout pas le problème - j'ai besoin d'un script bash autonome pour fonctionner sur la base de données, d'où ma question sur la transmission d'informations à psql via la ligne de commande.
Alex
6
Je pense que votre seule option est de configurer un fichier .pgpass auquel votre script bash a accès. Ou n'utilisez pas du tout de mots de passe - vous pouvez configurer une autre forme d'authentification, telle que l'identifiant ou utiliser des certificats SSL.
Flimzy
C'est ce que je craignais :) Merci pour l'info!
Alex
Une autre option pourrait être d'utiliser expect. Mais je déteste vraiment m'attendre à
ça
1
N'oubliez pas de supprimer les autorisations de groupe et autres utilisateurs pour lire, écrire et exécuter le fichier .pgpass! Coursechmod go-rwx .pgpass
Vladislavs Dovgalecs
611

Définissez la variable d'environnement PGPASSWORD dans le script avant d'appeler psql

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

Pour référence, voir http://www.postgresql.org/docs/current/static/libpq-envars.html


Éditer

Depuis Postgres 9.2, il est également possible de spécifier une chaîne de connexion ou un URI pouvant contenir le nom d'utilisateur et le mot de passe.

Son utilisation présente un risque pour la sécurité car le mot de passe est visible en texte brut lorsque vous regardez la ligne de commande d'un processus en cours, par exemple en utilisant ps (Linux), ProcessExplorer (Windows) ou des outils similaires, par d'autres utilisateurs.

Voir aussi cette question sur les administrateurs de bases de données

un cheval sans nom
la source
32
Par exemple sur une ligne, vous pouvez faire quelque chose comme: PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb
3
Je pense que c'est le moyen le plus pratique pour exécuter simplement un script SQL.
zr870
2
Je peux seulement ajouter - ajouter un spacedans la ligne de commande avant le premier caractère et la commande ne sera pas stockée dans l'historique bash. Fonctionne pour ubuntu / bash.
baldr
5
BONUS: Fonctionne pour Docker:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Bilal Akil
3
Soyez prudent et assurez-vous de toujours ajouter un espace précédent sinon il apparaîtra dans votre historique bash ~ / .bash_history ...
rogerdpack
103
  • en une seule ligne:

    export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command'

    avec commande une commande sql telle que"select * from schema.table"

  • ou plus lisible:

    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg. "select * from schema.table")
user4653174
la source
18
La seule ligne peut être légèrement simplifiée: PGPASSWORD='password' psql .... ce qui a également l'avantage que la variable n'est pas accessible une fois la commande exécutée.
Garrett
3
export PGPASSWORD=YourNewPasswordtravaillé pour moi sur d'autres variantes.
Mikeumus
7
export PGPASSWORDsonne comme une très mauvaise idée
hasen
1
Cela enregistrera le mot de passe dans votre fichier bash history ~ / .bash_history (à moins que vous n'ajoutiez toujours un espace précédent) et exportera également le mot de passe dans votre environnement actuel FWIW: |
rogerdpack
68

J'ai tendance à préférer passer une URL à psql :

psql "postgresql://$DB_USER:$DB_PWD@$DB_SERVER/$DB_NAME"

Cela me donne la liberté de nommer mes variables d'environnement comme je le souhaite et évite de créer des fichiers inutiles.

Cela nécessite libpq. La documentation se trouve ici .

Jacques Gaudin
la source
pouvez-vous utiliser quelque chose comme ça avec pg_restore? Merci!
the_ccalderon
1
@ ccalderon911217 Apparemment, vous pouvez: stackoverflow.com/a/28359470/1388292
Jacques Gaudin
@JacquesGaudin yep m'a testé! Je vous remercie!
the_ccalderon
26

Sous Windows:

  1. Attribuez une valeur à PGPASSWORD: C:\>set PGPASSWORD=pass

  2. Exécuter la commande: C:\>psql -d database -U user

Prêt

Ou en une seule ligne,

set PGPASSWORD=pass&& psql -d database -U user

Notez le manque d'espace avant le &&!

JAGJ jdfoxito
la source
1
J'ai essayé ça, et ça n'a pas marché. On me demande toujours un mot de passe.
antipattern
1
@antipattern Vous devez passer l'option -w également .
mljrg
1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;" travaux.
Steve Shipway
21

Cela peut être fait en créant un .pgpassfichier dans le répertoire personnel de l'utilisateur (Linux). .pgpass format de fichier:

<databaseip>:<port>:<databasename>:<dbusername>:<password>

Vous pouvez également utiliser un caractère générique *à la place des détails.

Disons que je voulais courir tmp.sqlsans demander de mot de passe.

Avec le code suivant, vous pouvez dans le fichier * .sh

echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass
echo "` chmod 0600 $HOME/.pgpass `"

echo " ` psql -h 192.168.1.1 -p 5432  -U postgres  postgres  -f tmp.sql `        
Srini
la source
11
A quoi sert l'écho "` chmod 0600 $ HOME / .pgpass `"? Que diriez-vous de simplement chmod 0600 $ HOME / .pgpass?
Vlad Patryshev
12

Une alternative à l'utilisation de la PGPASSWORDvariable d'environnement consiste à utiliser la conninfochaîne selon la documentation :

Une autre façon de spécifier les paramètres de connexion est dans une chaîne conninfo ou un URI, qui est utilisé à la place d'un nom de base de données. Ce mécanisme vous donne un contrôle très large sur la connexion.

$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"

postgres=>
ubi
la source
4

Ajout du contenu de pg_env.sh à mon .bashrc:

cat /opt/PostgreSQL/10/pg_env.sh

#!/bin/sh
# The script sets environment variables helpful for PostgreSQL

export PATH=/opt/PostgreSQL/10/bin:$PATH
export PGDATA=/opt/PostgreSQL/10/data
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5433
export PGLOCALEDIR=/opt/PostgreSQL/10/share/locale
export MANPATH=$MANPATH:/opt/PostgreSQL/10/share/man

avec ajout de (selon la suggestion de l'utilisateur4653174)

export PGPASSWORD='password'
Rob
la source