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!
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é.
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
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")
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
Sous Windows:
Attribuer une valeur à PGPASSWORD: C:\>set PGPASSWORD=pass
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 &&!
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 `
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'