¿Cómo especifico una contraseña para psql de forma no interactiva?

Estoy tratando de automatizar el proceso de creación de bases de datos con un script de shell y una cosa es que he topado con un bloque de carreteras al pasar una contraseña a psql. Aquí hay un poco de código del script de shell:

psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL" 

¿Cómo paso una contraseña a psql de una manera no interactiva?

¡Gracias!

De la documentación oficial :

También es conveniente tener un archivo ~ / .pgpass para evitar tener que escribir regularmente las contraseñas. Ver la Sección 30.13 para más información.

Este archivo debe contener líneas del siguiente formato:

 hostname:port:database:username:password 

Se usará el campo de contraseña de la primera línea que coincida con los parámetros de conexión actuales.

Establezca la variable de entorno PGPASSWORD dentro de la secuencia de comandos antes de llamar a psql

 PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName 

Para referencia, vea http://www.postgresql.org/docs/current/static/libpq-envars.html


Editar

Desde Postgres 9.2 también existe la opción de especificar una cadena de conexión o URI que puede contener el nombre de usuario y la contraseña.

Usar eso es un riesgo de seguridad porque la contraseña es visible en texto plano cuando se mira la línea de comando de un proceso en ejecución, por ejemplo, usando ps (Linux), ProcessExplorer (Windows) o herramientas similares, por otros usuarios.

Ver también esta pregunta sobre administradores de bases de datos

  • en una línea:

     export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command' 

    con comando un comando sql como "select * from schema.table"

  • o más legible:

     export PGPASSWORD='password' psql -h 'server name' -U 'user name' -d 'base name' \ -c 'command' (eg. "select * from schema.table") 

Esto se puede hacer creando un archivo .pgpass en el directorio de inicio del Usuario (Linux). .pgpass archivo .pgpass :

 :::: 

También puede usar la tarjeta salvaje * en lugar de detalles.

Digamos que quería ejecutar tmp.sql sin tmp.sql una contraseña.

Con el siguiente código puedes en el archivo * .sh

 echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass echo "` chmod 0600 $HOME/.pgpass `" echo " ` psql -h 192.168.1.1 -p 5432 -U postgres postgres -f tmp.sql ` 

En Windows:

  1. Asignar valor a PGPASSWORD: C:\>set PGPASSWORD=pass

  2. Ejecutar comando: C:\>psql -d database -U user

Listo

O en una línea,

 set PGPASSWORD=pass&& psql -d database -U user 

Tenga en cuenta la falta de espacio antes de la &&!

Tiendo a preferir pasar una url a psql:

 psql "postgresql://$DB_USER:$DB_PWD@$DB_SERVER/$DB_NAME" 

Esto me da la libertad de nombrar las variables de mi entorno como me gustaría y evito crear archivos innecesarios.

Esto requiere libpq . La documentación se puede encontrar aquí