Exécutez le fichier batch avec la commande psql sans mot de passe

je suis en train d'exécuter ce psql commande utilisant un script de traitement par lots:

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 batch. Comment puis-je entrer un mot de passe dans le fichier batch?

22
demandé sur Erwin Brandstetter 2013-03-12 14:59:25

3 réponses

Conserver à lire, le meilleures options en dernière. Mais nous allons préciser quelques choses d'abord.

faites seulement taire la demande de mot de passe

si votre question n'est que l'invite de mot de passe, vous pouvez la réduire au silence. Je cite le manuel ici:

-w

--no-password

N'émettez jamais d'invite de mot de passe. Si le serveur nécessite une authentification par mot de passe et un mot de passe est non disponibles par d'autres moyens tels que des .pgpass fichier, la tentative de connexion échoue. 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, cela n'est pas nécessaire. La base de données par défaut superuser postgres correspond généralement à l'utilisateur du système du même nom. Cours d'exécution psql à partir de ce compte ne nécessite pas de mot de passe si le méthode d'authentification peer ou ident sont définies dans votre pg_hba.conf fichier. Vous avez probablement une ligne comme ceci:

local    all    postgres    peer

Et:

local    all    all         peer

cela signifie, Chaque l'utilisateur peut se connecter à un base de données utilisateur de base de données du même nom sans mot de passe.

cependant, il y a une idée fausse commune ici. en Citant :

cette méthode n'est supportée que sur connexions.

c'est moi qui souligne.

Vous vous connectez à localhostce n'est pas une "connexion locale", même si elle contient le mot "local". C'est une connexion TCP/IP à 127.0.0.1. Wikipédia sur localhost:

Sur les systèmes informatiques modernes, localhost comme nom d'hôte se traduit par une Adresse IPv4 dans le 127.0.0.0/8 (loopback) bloc net, généralement 127.0.0.1, ou ::1 en IPv6.

la solution la plus Simple pour les connexions locales

omettre le paramètre -hpsql invocation. Citing le manuel sur psql une fois de plus:

si vous omettez le nom d'hôte, psql se connectera via une socket Unix-domain vers un serveur sur l'hôte local, ou via TCP / IP vers localhost sur les machines qui n'ont pas de sockets de domaine Unix.

Windows

... n'ont pas les sockets de domaine Unix, pg_hba.conf les lignes commençant par local ne s'appliquent pas sur Windows. Sous Windows, vous vous connectez via localhost par défaut, ce qui nous ramène au point de départ.

si vos exigences de sécurité sont laxistes, vous pouvez faire confiance à toutes les connexions via localhost:

host    all    all    127.0.0.1/32     trust

Je ne ferais cela que pour déboguer avec des connexions à distance hors. Pour plus de sécurité, vous pouvez utiliser authentification SSPI sur les fenêtres. Ajoutez cette ligne à pg_hba.conf pour les "locaux" connexions:

host    all    all    127.0.0.1/32     sspi

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

Vous mettre un variable d'environnement, mais c'est découragé, surtout pour les fenêtres. manuel:

PGPASSWORD se comporte de la même façon que le mot de passe connexion paramètre. L'utilisation de cette variable d'environnement n'est pas recommandé pour des raisons de sécurité, certains systèmes d'exploitation permettent non root les utilisateurs doivent voir les variables d'environnement du processus via ps; à la place pensez à utiliser le ~/.pgpass fichier (voir la section l'Article 32.15).

Le manuel sur psql:

conninfo string est une alternative pour spécifier la connexion paramètres:

 $ psql "user=myuser password=secret_pw host=localhost port=5432 sslmode=require"

et URI, qui est utilisé à la place d'un nom de base de données:

 $ psql postgresql://myuser:secret_pw@localhost:5432/mydb?sslmode=require

Fichier De Mots De Passe

Mais il est généralement préférable de créer un .pgpass le fichier plutôt que de mettre des mots de passe dans des fichiers de script.

Lire le court chapitre dans le manuel soigneusement. En particulier, la note que voici ...

Un nom d'hôte localhost correspond aux deux TCP (nom d'hôte localhost) et Unix domain socket (pghost vide ou que le défaut de prise répertoire) des connexions venant de la machine locale.

le chemin Exact dépend du système. Ce fichier peut stocker des mots de passe pour de multiples combinaisons de rôle et de port (cluster DB):

localhost:5432:*:myadmin:myadminPasswd
localhost:5434:*:myadmin:myadminPasswd
localhost:5437:*:myadmin:myadminPasswd
...

Windows machines rechercher le fichier dans:

%APPDATA%\postgresql\pgpass.conf

%APPDATA% se résout typiquement à: C:\Documents and Settings\My_Windows_User_Name\Application Data\.

41
répondu Erwin Brandstetter 2018-09-18 16:05:45

j'ai eu un peu le même problème:

psql -hlocalhost -d<myDB> -U<myUser>

me demandait toujours le mot de passe. C'est comme @Erwin a expliqué à cause de -hlocalhost se connecte via TCP et non via la socket Unix-domain (pour un système D'exploitation Unix). Donc, même si vous avez configuré votre local confiance:

local   all    all                     trust

il demandera quand même le mot de passe. Afin de configurer le -hlocalhost pour travailler avec TCP, j'ai dû configurer le host pour les adresses localhost, comme donc:

host    all    all    127.0.0.1/32     trust
host    all    all    ::1/128          trust

mais ça n'a pas marché pour moi. Ce que j'ai dû faire, c'est combiner les deux comme:

host    all    all    localhost        trust

Quelques lectures supplémentaires:

2
répondu nyxz 2015-11-19 10:18:42

postgres Documentation -https://www.postgresql.org/docs/9.6/static/app-psql.html

-w --pas de mot de passe N'émettez jamais d'invite de mot de passe. Si le serveur nécessite une authentification par mot de passe et qu'un mot de passe n'est pas disponible par d'autres moyens tels que A.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.

0
répondu Darshana Patel 2018-09-28 12:28:25