web-dev-qa-db-fra.com

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

J'essaie d'automatiser le processus de création de base de données avec un script Shell. J'ai bloqué 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 à psql de manière non interactive?

Merci!

260
Alex N.

De la documentation officielle :

Il est également pratique d’avoir un fichier ~/.pgpass afin d’éviter de taper régulièrement des mots de passe. Voir Section 30.1 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é.

111
Flimzy

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


Modifier

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

Cela pose un risque pour la sécurité car le mot de passe est visible en texte brut lorsque vous consultez 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 Administrateurs de bases de données

479
  • en une 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")
    
92
user4653174

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 les variables de mon environnement comme je le souhaite et évite de créer des fichiers inutiles.

Cela nécessite libpq. La documentation peut être trouvée ici

33
Jacques Gaudin

Sous Windows:

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

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

Prêt

Ou en une ligne,

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

Notez le manque d'espace avant le &&!

23
JAGJ jdfoxito

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

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

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

Disons que je voulais exécuter tmp.sql sans 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 `        
20
Srini

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 user4653174)

export PGPASSWORD='password'
2
Rob