Ejecute el archivo por lotes con el comando psql sin contraseña

Estoy intentando ejecutar este comando psql usando un script por lotes:

 psql --host=localhost --dbname= --port= --username= --file=C:\PSQL_Script.txt --output=C:\PSQL_Output.txt 

El problema es que está pidiendo la contraseña cada vez que ejecuto el script por lotes. ¿Cómo puedo usar el argumento de la contraseña a través del archivo por lotes?

Las preguntas sobre el inicio de sesión sin contraseña siguen apareciendo. Sigue leyendo, las mejores opciones vienen al final . Pero aclaremos un par de cosas primero.

Solo silencia la solicitud de contraseña

Si su problema es solo la solicitud de contraseña, puede silenciarlo. Cito el manual aquí :

-w
--no-password

Nunca emita una solicitud de contraseña. Si el servidor requiere autenticación de contraseña y una contraseña no está disponible por otros medios, como un archivo .pgpass , el bash de conexión fallará. Esta opción puede ser útil en trabajos por lotes y secuencias de comandos donde no hay usuarios presentes para ingresar una contraseña. (…)

Probablemente no necesites una contraseña

Normalmente esto es innecesario. El superusuario predeterminado de la base de datos postgres generalmente corresponde al usuario del sistema del mismo nombre. La ejecución de psql desde esta cuenta no requiere una contraseña si el peer o ident método de ident se configura en su archivo pg_hba.conf . Probablemente tengas una línea como esta:

 local all postgres peer 

Y generalmente también:

 local all all peer 

Esto significa que todos los usuarios locales pueden iniciar sesión en una base de datos como usuarios de bases de datos con el mismo nombre sin contraseña.
Sin embargo , hay un error común aquí. Citando nuevamente :

Este método solo se admite en conexiones locales .

Negrita énfasis mío.
Se está conectando a localhost , que no es una “conexión local” , aunque tiene la palabra “local”. Es una conexión TCP / IP a 127.0.0.1. Wikipedia en localhost :

En los sistemas informáticos modernos, localhost como nombre de host se traduce a una dirección IPv4 en el bloque de red 127.0.0.0/8 (loopback), generalmente 127.0.0.1 , o ::1 en IPv6.

Solución simple para conexiones locales

Omita el parámetro -h de la invocación psql . Citando el manual en psql una vez más:

Si omite el nombre de host, psql se conectará mediante un socket de dominio Unix a un servidor en el host local, o mediante TCP / IP a localhost en máquinas que no tienen sockets de dominio Unix.

Windows

… no tiene conectores de dominio Unix, pg_hba.conf líneas pg_hba.conf que comienzan con local no son aplicables en Windows. En Windows, se conecta a través de localhost de forma predeterminada, lo que nos lleva de vuelta al inicio.

Si sus requisitos de seguridad son laxos, puede confiar en todas las conexiones a través de localhost :

 host all all 127.0.0.1/32 trust 

Solo lo haría para la eliminación de errores con conexiones remotas. Para mayor seguridad, puede usar la autenticación SSPI en Windows. Agregue esta línea a pg_hba.conf para las conexiones “locales”:

 host all all 127.0.0.1/32 sspi 

Si realmente necesitas una contraseña

Puede establecer una variable de entorno , pero esto se desaconseja , especialmente para Windows. El manual:

PGPASSWORD comporta de la misma manera que el parámetro de conexión de contraseña . El uso de esta variable de entorno no se recomienda por razones de seguridad, ya que algunos sistemas operativos permiten a los usuarios no root ver las variables del entorno de proceso a través de ps; en su lugar, considere usar el archivo ~/.pgpass (consulte la Sección 32.15 ).

El manual sobre psql :

Una cadena conninfo es una alternativa para especificar los parámetros de conexión:

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

O un URI , que se utiliza en lugar de un nombre de base de datos:

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

Archivo de contraseña

Pero generalmente es preferible configurar un archivo .pgpass lugar de poner contraseñas en archivos de script.
Lea el capítulo corto en el manual con cuidado . En particular, tenga en cuenta que aquí …

Un nombre de host de localhost concuerda con las conexiones TCP (nombre de host localhost ) y socket de dominio Unix ( pghost empty o el directorio de socket predeterminado) que provienen de la máquina local.

La ruta exacta depende del sistema. Este archivo puede contraseñas para múltiples combinaciones de roles y puertos (clúster DB):

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

En máquinas con Windows , busque el archivo en:

 C:\Documents and Settings\My_Windows_User_Name\Application Data\postgresql 

Tuve un problema similar:

 psql -hlocalhost -d -U 

siempre me pedía una contraseña. Esto es como @Erwin explicado porque -hlocalhost está conectando a través de TCP y no a través del socket de dominio Unix (para sistema operativo basado en Unix). Entonces, incluso si ha configurado su local como confiable:

 local all all trust 

aún solicitará una contraseña. Entonces, para configurar el -hlocalhost para que funcione a través del TCP, tuve que configurar el host para las direcciones del host local, así:

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

Pero esto no funcionó para mí. Lo que tuve que hacer es combinar ambos como:

 host all all localhost trust 

Algunas lecturas adicionales:

  • Configurando el archivo pg_hba.conf
  • Métodos de autenticación: confianza, pares, ident, etc.