Postgresql: exécution de script 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 n’ai pas trouvé l’argument qui transmet le mot de passe, et donc psql le demande toujours.

Il existe plusieurs façons de vous authentifier auprès de PostgreSQL. Vous souhaiterez peut-être rechercher des alternatives à 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 moyens 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’y a pas d’option pour fournir le mot de passe en tant qu’argument de ligne de commande car cette information est souvent disponible pour tous les utilisateurs, et donc non sécurisée. Cependant, dans les environnements Linux / Unix, vous pouvez fournir une variable d’environnement pour une seule commande comme celle-ci:

 PGPASSWORD=yourpass psql ... 
 PGPASSWORD=[your password] psql -Umyuser < myscript.sql 

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

 set PGPASSWORD=[your password] 

Si vous avez l’intention d’avoir plusieurs connexions hôte / firebase database, le fichier ~ / .pgpass est la voie à suivre.

Pas:

  1. Créez le fichier ~ / .pgpass. Entrez vos informations dans le format suivant nom d’hôte: port: firebase database: nom d’utilisateur: mot de passe
  2. N’ajoutez pas de guillemets autour des valeurs de votre champ. Vous pouvez également utiliser * comme caractère générique pour vos champs de port / firebase database.
  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.
  5. Tapez votre alias à partir de la ligne de commande.

Notez que si vous avez une variable d’exportation PGPASSWORD = ”, celle-ci aura la priorité sur le fichier. Il est également sage de modifier les permissions de votre fichier afin que le contenu soit masqué par les autres utilisateurs. Cela peut être réalisé avec chmod 600 ~/.pgpass

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

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

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

 export PGPASSWORD=[password] 

Vous devrez l’enregistrer en haut du fichier, ou avant toute utilisation, avant de l’appeler.

Cela fonctionne certainement sur Windows 🙂

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 pgpass temporaire avec le mot de passe que vous souhaitez utiliser.
  2. Utilisez la variable d’environnement PGPASSFILE pour indiquer à psql d’utiliser ce fichier.
  3. Supprimez le fichier pgpass temporaire

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

Certains ont suggéré de tirer parti de bash comme suit:

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

Cela 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 génère une erreur comme celle-ci:

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

En s’appuyant sur la réponse de mightybyte pour ceux qui ne sont pas à l’aise avec les scripts shell * nix , voici un script de travail:

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

Le signe double 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 ” not a plain file ” décrite par mightybyte , il y a également une erreur ” permissions ” si cela n’est pas fait.

À la ligne 6, vous n’aurez pas à utiliser le -h myserver , -p myport ou -U jdoe si vous utilisez les valeurs par défaut ( localhost : 5432 ) et que vous ne disposez que d’un utilisateur de firebase database. Pour plusieurs utilisateurs, (mais la connexion par défaut) changez cette ligne en

 psql mydb jdoe 

N’oubliez pas de rendre le script exécutable avec

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

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

Vous trouverez peut-être cela utile: Ligne de commande Windows PSQL: existe-t-il un moyen d’autoriser la connexion sans mot de passe?

Je trouve que ce psql affiche l’invite de mot de passe même si vous définissez la variable PGPASSWORD, mais vous pouvez spécifier l’option -w pour que psql omette l’invite de mot de passe.

Utilisez -w dans la commande: psql -h localhost -p 5432 -U utilisateur -w