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

338

Estoy tratando de automatizar el proceso de creación de la base de datos con un script de shell y una cosa me he topado con 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 de psqlmanera no interactiva?

Alex N.
fuente
1
Puede usar una url de conexión. Verifique estas respuestas en stackoverflow.com/questions/3582552/postgres-connection-url .
paulodiovani

Respuestas:

141

De la documentación oficial :

También es conveniente tener un archivo ~ / .pgpass para evitar tener que escribir contraseñas regularmente. Vea 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 utilizará el campo de contraseña de la primera línea que coincida con los parámetros de conexión actuales.

Flimzy
fuente
29
Gracias, conozco pgpass, pero esto no resuelve el problema: necesito un script bash autónomo para operar sobre la base de datos, de ahí mi pregunta acerca de pasar información a psql a través de la línea de comandos.
Alex N.
66
Creo que su única opción es configurar un archivo .pgpass al que tenga acceso su script bash. O no use contraseñas en absoluto: puede configurar otra forma de autenticación, como ident o usar certificados SSL.
Flimzy
Eso es lo que temía :) ¡Gracias por la información!
Alex N.
Otra opción podría ser utilizar esperar. Pero realmente odio esperar :)
Flimzy
1
¡No olvide eliminar el permiso de grupo y otros usuarios para leer, escribir y ejecutar el archivo .pgpass! Runchmod go-rwx .pgpass
Vladislavs Dovgalecs
611

Establezca la variable de entorno PGPASSWORD dentro del script antes de llamar a psql

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

Para referencia, consulte 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 al mirar la línea de comandos de un proceso en ejecución, por ejemplo, usando ps(Linux), ProcessExplorer (Windows) o herramientas similares, por otros usuarios.

Consulte también esta pregunta sobre Administradores de bases de datos

un caballo sin nombre
fuente
32
Por ejemplo, en una línea puede hacer algo como: PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb el
3
Creo que esta es la forma más conveniente de simplemente ejecutar un script SQL.
zr870
2
Solo puedo agregar: agregue un spaceen la línea de comando antes del primer carácter y el comando no se almacenará en el historial de bash. Funciona para ubuntu / bash.
baldr
55
BONIFICACIÓN: Obras para Docker:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Bilal Akil
3
Tenga cuidado y asegúrese de agregar siempre un espacio anterior; de lo contrario, aparecerá en su archivo bash history ~ / .bash_history ...
rogerdpack
103
  • en una linea:

    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")
usuario4653174
fuente
18
La línea única se puede simplificar ligeramente a: lo PGPASSWORD='password' psql .... que también tiene el beneficio de que la variable no sea accesible después de que se haya ejecutado el comando.
Garrett
3
export PGPASSWORD=YourNewPasswordfuncionó para mí sobre otras variaciones.
Mikeumus
77
export PGPASSWORDsuena como una muy mala idea
hasen
1
Esto guardará la contraseña en su archivo bash history ~ / .bash_history (a menos que siempre agregue cuidadosamente un espacio anterior), y también exporte la contraseña a su entorno actual FWIW: |
rogerdpack
68

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 mis variables de entorno como desee y evita crear archivos innecesarios.

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

Jacques Gaudin
fuente
¿Puedes usar algo como esto con pg_restore? ¡Gracias!
the_ccalderon
1
@ ccalderon911217 Aparentemente puedes: stackoverflow.com/a/28359470/1388292
Jacques Gaudin
¡@JacquesGaudin sí me probé! ¡Gracias!
the_ccalderon
26

En Windows:

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

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

Listo

O en una linea,

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

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

JAGJ jdfoxito
fuente
1
Lo intenté y no funcionó. Todavía se me pide una contraseña.
antipatrón
1
@antipattern Debe pasar la opción -wtambién.
mljrg
1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"trabajos.
Steve Shipway
21

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

<databaseip>:<port>:<databasename>:<dbusername>:<password>

También puede usar comodines *en lugar de detalles.

Digamos que quería ejecutar tmp.sqlsin solicitar 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 `        
Srini
fuente
11
¿Cuál es el punto de eco "` chmod 0600 $ HOME / .pgpass `"? ¿Qué tal solo chmod 0600 $ HOME / .pgpass?
Vlad Patryshev
12

Una alternativa al uso de la PGPASSWORDvariable de entorno es usar la conninfocadena de acuerdo con la documentación :

Una forma alternativa de especificar los parámetros de conexión es en una cadena de información o un URI, que se utiliza en lugar de un nombre de base de datos. Este mecanismo le brinda un control muy amplio sobre la conexión.

$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"

postgres=>
ubi
fuente
4

Contenido agregado de pg_env.sh a mi .bashrc:

cat /opt/PostgreSQL/10/pg_env.sh

#!/bin/sh
# The script sets environment variables helpful for PostgreSQL

export PATH=/opt/PostgreSQL/10/bin:$PATH
export PGDATA=/opt/PostgreSQL/10/data
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5433
export PGLOCALEDIR=/opt/PostgreSQL/10/share/locale
export MANPATH=$MANPATH:/opt/PostgreSQL/10/share/man

con adición de (según la sugerencia del usuario 4653174)

export PGPASSWORD='password'
Robar
fuente