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.
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 ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
Vous pouvez ajouter cette ligne de commande au début de votre script:
set PGPASSWORD=[your password]
Si vous souhaitez avoir plusieurs connexions hôtes/bases de données, le chemin ~/.pgpass est le chemin à parcourir.
Pas:
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.chmod 0600 ~/.pgpass
pour que psql ne l'ignore pas en silence.alias postygresy='psql --Host hostname database_name -U username'
Les valeurs doivent correspondre à celles que vous avez entrées dans le fichier ~/.pgpass.. ~/.bashrc
ou similaire.Notez que si vous avez une variable d'exportation PGPASSWORD = '' définie, elle aura priorité sur le fichier.
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
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.
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 :)
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:
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
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
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 -h
myserver, le -p
myport ou -U
jdoe 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!
Vous trouverez peut-être cela utile: Ligne de commande Windows PSQL: existe-t-il un moyen d'autoriser une connexion sans mot de passe?
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