J'essaie d'exécuter cette commande psql
à l'aide d'un script batch:
psql --Host=localhost --dbname=<dbname> --port=<Port Number>
--username=<dbuser> --file=C:\PSQL_Script.txt --output=C:\PSQL_Output.txt
Le problème est qu'il demande le mot de passe chaque fois que j'exécute le script de traitement par lots. Comment puis-je mot de passe argument via le fichier de commandes?
Continuez votre lecture, les meilleures options arrivent en dernier. Mais clarifions d'abord quelques points.
Si votre problème concerne uniquement l'invite de mot de passe, vous pouvez le désactiver. Je cite le manuel ici :
-w
--no-password
Ne jamais donner un mot de passe Invite. Si le serveur requiert une authentification par mot de passe et un mot de passe n'est pas disponible par d'autres moyens tels que un fichier
.pgpass
, la tentative de connexion échouera. Cette option peut être utile dans les travaux par lots et les scripts où aucun utilisateur n'est présent pour entrer un mot de passe. (...)
Normalement, c'est inutile. Le superutilisateur de la base de données par défaut postgres
correspond généralement à l'utilisateur système du même nom. L'exécution de psql
à partir de ce compte ne nécessite pas de mot de passe si la méthode d'authentification peer
ou ident
est définie dans votre fichier pg_hba.conf
. Vous avez probablement une ligne comme celle-ci:
local all postgres peer
Et généralement aussi:
local all all peer
Cela signifie que chaque utilisateur local peut se connecter à une base de données all en tant qu’utilisateur du même nom sans mot de passe.
Cependant, il y a une idée fausse commune ici. _ { Citant encore :
Cette méthode est uniquement prise en charge sur connexions locales.
Gras accent mien.
Vous vous connectez à localhost
, qui est n'est pas une "connexion locale", même s'il contient le mot "local". C'est une connexion TCP/IP à 127.0.0.1. _ { Wikipedia sur localhost } _:
Sur les systèmes informatiques modernes,
localhost
en tant que nom d’hôte se traduit par un Adresse IPv4 dans le bloc réseau127.0.0.0/8
(bouclage), généralement127.0.0.1
ou::1
dans IPv6.
Omettez le paramètre -h
de l'invocation psql
. Citant le manuel sur psql
encore une fois:
Si vous omettez le nom d'hôte, psql se connectera via un socket de domaine Unix sur un serveur de l'hôte local ou via TCP/IP vers
localhost
sur des machines qui n'ont pas de sockets de domaine Unix.
... n'a pas de sockets de domaine Unix, les lignes pg_hba.conf
commençant par local
ne s'appliquent pas sous Windows. Sous Windows, vous vous connectez via localhost
par défaut, ce qui nous ramène au début.
Si vos exigences de sécurité sont laxistes, vous pouvez simplement faire confiance à toutes les connexions via localhost
:
Host all all 127.0.0.1/32 trust
Je ne ferais cela que pour le débogage avec des connexions distantes désactivées. Pour plus de sécurité, vous pouvez utiliser authentification SSPI sous Windows. Ajoutez cette ligne à pg_hba.conf
pour les connexions "locales":
Host all all 127.0.0.1/32 sspi
Vous pouvez définir une variable d'environnement, mais il s'agit de déconseillé, en particulier pour Windows. Le manuel:
PGPASSWORD
se comporte comme le mot de passe connexion paramètre. L'utilisation de cette variable d'environnement n'est pas recommandée pour des raisons de sécurité, car certains systèmes d'exploitation autorisent les applications non root les utilisateurs peuvent voir les variables d'environnement de processus via ps; au lieu envisagez d'utiliser le fichier~/.pgpass
(reportez-vous à la section Section 32.15 ).
_ { Le manuel sur psql
:
Une chaîne conninfo
est une alternative pour spécifier les paramètres de connexion:
$ psql "user=myuser password=secret_pw Host=localhost port=5432 sslmode=require"
Ou un URI , utilisé à la place du nom de la base de données:
$ psql postgresql://myuser:secret_pw@localhost:5432/mydb?sslmode=require
Mais il est généralement préférable de configurer un .pgpass
fichier plutôt que de mettre des mots de passe dans des fichiers de script.
Lisez attentivement le court chapitre du manuel . En particulier, notez qu'ici ...
Un nom d'hôte de
localhost
correspond aux connexions TCP (nom d'hôtelocalhost
) et de socket de domaine Unix (pghost
vide ou au répertoire de socket par défaut) provenant de la machine locale.
Le chemin exact dépend du système. Ce fichier peut stocker des mots de passe pour plusieurs combinaisons de rôle et de port (cluster de base de données):
localhost:5432:*:myadmin:myadminPasswd
localhost:5434:*:myadmin:myadminPasswd
localhost:5437:*:myadmin:myadminPasswd
...
Sur les machines Windows, recherchez le fichier dans:
%APPDATA%\postgresql\pgpass.conf
%APPDATA%
se résout généralement comme suit: C:\Documents and Settings\My_Windows_User_Name\Application Data\
.
J'ai eu un peu le même problème:
psql -hlocalhost -d<myDB> -U<myUser>
m'a toujours demandé le mot de passe. Comme @Erwin l'a expliqué, car -hlocalhost
se connecte via TCP et non via le socket de domaine Unix (pour les systèmes d'exploitation Unix). Donc, même si vous avez configuré votre local
en tant que confiance:
local all all trust
il sera toujours demander le mot de passe. Donc, pour configurer le -hlocalhost
afin qu'il fonctionne via TCP, je devais configurer la Host
pour les adresses localhost, comme suit:
Host all all 127.0.0.1/32 trust
Host all all ::1/128 trust
Mais cela n'a pas fonctionné pour moi. Ce que je devais faire est de combiner les deux comme:
Host all all localhost trust
Quelques lectures supplémentaires:
postgres Documentation - https://www.postgresql.org/docs/9.6/static/app-psql.html
-w -- no-password N'émettez jamais d'invite de mot de passe. Si le serveur requiert une authentification par mot de passe et qu'un mot de passe n'est pas disponible par un autre moyen, tel qu'un fichier .pgpass, la tentative de connexion échouera. Cette option peut être utile dans les travaux par lots et les scripts dans lesquels aucun utilisateur n'est présent pour entrer un mot de passe.