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?
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-passwordN'é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
.pgpassfichier, 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,
localhostcomme nom d'hôte se traduit par une Adresse IPv4 dans le127.0.0.0/8(loopback) bloc net, généralement127.0.0.1, ou::1en 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
localhostsur 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:
PGPASSWORDse 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~/.pgpassfichier (voir la section l'Article 32.15).
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
localhostcorrespond aux deux TCP (nom d'hôtelocalhost) et Unix domain socket (pghostvide 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\.
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:
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.