Comment puis-je appeler psql pour qu'il ne demande pas de mot de passe ?
Voici ce que j'ai:
psql -Umyuser < myscript.sql
Cependant, je n'ai pas pu trouver l'argument qui transmet le mot de passe, et donc psql le demande toujours.
Comment puis-je appeler psql pour qu'il ne demande pas de mot de passe ?
Voici ce que j'ai:
psql -Umyuser < myscript.sql
Cependant, je n'ai pas pu trouver l'argument qui transmet le mot de passe, et donc psql le demande toujours.
Réponses:
Il existe plusieurs façons de s'authentifier auprès de PostgreSQL. Vous pouvez rechercher des alternatives à l'authentification par mot de passe sur 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 PGPASSWORD
variable d'environnement. Voir ces:
Il n'y a pas d'option pour fournir le mot de passe comme argument de ligne de commande car ces informations sont souvent disponibles pour tous les utilisateurs, et donc non sécurisées. Cependant, dans les environnements Linux / Unix, vous pouvez fournir une variable d'environnement pour une seule commande comme celle-ci:
PGPASSWORD=yourpass psql ...
Vous pouvez ajouter cette ligne de commande au début de votre script:
set PGPASSWORD=[your password]
export PGPASSWORD=[password]
a fonctionné
#!/bin/sh set PGPASSWORD = postgres psql -h 192.168.3.200 -U postgres incx_um << EOF DELETE FROM usrmgt.user_one_time_codes WHERE time < NOW() - INTERVAL '30 minute' EOF
PGPASSWORD=password
.
Si vous avez l'intention d'avoir plusieurs hôtes / connexions à la base de données, le fichier ~ / .pgpass est la solution.
Pas:
vim ~/.pgpass
ou similaire. Saisissez vos informations dans le format suivant:
hostname:port:database:username:password
N'ajoutez pas de guillemets autour de vos valeurs de champ. Vous pouvez également utiliser * comme caractère générique pour vos champs de port / base de données.chmod 0600 ~/.pgpass
pour qu'il ne soit pas ignoré silencieusement par psql.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 un jeu de variables d'exportation PGPASSWORD = '', il aura priorité sur le fichier.
chmod 600
sur le fichier, sinon vous psql
l'ignorerez silencieusement (selon les documents).
C'est peut-être une vieille question, mais il existe une autre méthode que vous n'avez pas mentionnée. Il est possible de spécifier le mot de passe directement dans l'URI de connexion. La documentation peut être trouvée ici , ou 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
PGPASSWORD
Si vous rencontrez des problèmes sur Windows comme moi (j'utilise Windows 7 64 bits) et que set PGPASSWORD=[Password]
cela 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, donc son ensemble avant d'être appelé.
Fonctionne certainement sur Windows :)
export PGPASSWORD=[password]
ne fonctionne pas du tout en utilisant la ligne de commande (cmd.exe). Êtes-vous sûr de ne pas utiliser cygwin ou quelque chose de similaire?
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.
Étant donné les 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 le nettoyage avec le fichier ~ / .pgpass de l'utilisateur qui pourrait exister. Vous devez également vous assurer que le fichier dispose des autorisations 0600 ou moins.
Certains ont suggéré de tirer parti de bash pour raccourcir cela 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érera une erreur comme celle-ci:
WARNING: password file "/dev/fd/63" is not a plain file
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$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
Le double signe dollar ( $$
) /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 chmod
commande à la ligne 4 - tout comme l' erreur " pas un fichier ordinaire " qui pourrait être décrite, il y a aussi une erreur " autorisations " si cela n'est pas fait.
À la ligne 7, vous n'aurez pas à utiliser le drapeau -h
myserver , -p
myport ou -U
jdoe si vous utilisez les valeurs par défaut ( localhost : 5432 ) et que vous n'avez qu'un seul utilisateur de base de données. Pour plusieurs utilisateurs (mais la connexion par défaut), remplacez cette ligne par
psql mydb jdoe
N'oubliez pas de rendre le script exécutable avec
chmod +x runpsql
( ou ce que vous avez appelé le fichier de script )
METTRE À JOUR:
J'ai suivi les conseils de RichVel et rendu le fichier illisible avant d'y mettre le mot de passe. Cela ferme un léger trou de sécurité. Merci!
mktemp
pour créer un fichier temporaire au lieu de créer votre propre schéma de dénomination. Il crée un nouveau fichier temporaire (nommé quelque chose comme /tmp/tmp.ITXUNYgiNh
sous Linux et /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
sur MacOS X) et imprime son nom sur stdout.
chmod 600
après avoir créé le fichier, mais avant d'y écrire le mot de passe. Tel qu'il est écrit, un script malveillant sur le serveur pourrait continuellement essayer de lire des fichiers de ce format et réussirait parfois à obtenir le mot de passe. De plus, si ce script est interrompu pour une raison quelconque, le fichier sera laissé sur le disque - l'écriture d'un trap
gestionnaire de shell résoudrait ce problème. Étant donné qu'il n'est pas trivial d'écrire un script sécurisé comme celui-ci, je recommande d'utiliser à la export PGPASSWORD
place.
PGPASSWORD
est obsolète en 9.3.
Une alternative à l'utilisation de PGPASSWORD
la variable d'environnement consiste à utiliser une conninfo
chaîne conformément à 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=>
Vous pouvez trouver cela utile: Ligne de commande Windows PSQL: existe-t-il un moyen d'autoriser la 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>
Voir également:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
Je trouve, que 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 psql pour omettre l'invite de mot de passe.