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-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 à localhost
ce 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 le127.0.0.0/8
(loopback) bloc net, généralement127.0.0.1
, ou::1
en IPv6.
la solution la plus Simple pour les connexions locales
omettre le paramètre -h
psql
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).
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ôtelocalhost
) 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\
.
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.