web-dev-qa-db-fra.com

Exécuter un fichier de commandes avec la commande psql sans mot de passe

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?

22
shabu 224

Continuez votre lecture, les meilleures options arrivent en dernier. Mais clarifions d'abord quelques points.

Silence seulement la demande de mot de passe

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. (...)

Vous n'avez probablement pas besoin d'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éseau 127.0.0.0/8 (bouclage), généralement 127.0.0.1 ou ::1 dans IPv6.

Solution simple pour les connexions locales

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.

Les fenêtres

... 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

Si vous avez réellement besoin d'un mot de passe

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

Fichier de mot de passe

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ôte localhost) 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\.

44
Erwin Brandstetter

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:

2
nyxz

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.

0
Darshana Patel