¿Cómo usar psql sin solicitud de contraseña?

70

Escribí un script para REINDEXindexar en una base de datos. Aqui esta uno de ellos:

echo -e "\nreindex for unq_vbvdata_vehicle started at: `date "+%F %T"`" >> ${LOG_FILE}
psql -U ${USERNAME} -h ${HOSTNAME} -d ${DBNAME} -c "REINDEX INDEX scm_main.unq_vbvdata_vehicle;"
if [[ ${?} -eq 0 ]]; then
    echo "reindex for unq_vbvdata_vehicle finished at: `date "+%F %T"`" >> ${LOG_FILE}
else
    echo "reindex for unq_vbvdata_vehicle failed" >> ${LOG_FILE}
    exit 1
fi

El problema es que no puedo ejecutar este script en modo independiente. psqlsolicita una contraseña cada vez que se ejecuta. También hay dos limitaciones:

  1. No puedo crear un usuario en la base de datos sin contraseña.

  2. Debido a que REINDEXbloquea las tablas, debería usar sleep <num>entre cada una REINDEX.

¿Hay alguna solución automática?

Majid Azimi
fuente

Respuestas:

111

Tiene cuatro opciones con respecto a la solicitud de contraseña:

  1. establece la variable de entorno PGPASSWORD. Para más detalles, consulte el manual:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. use un archivo .pgpass para almacenar la contraseña. Para más detalles, consulte el manual:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. use "autenticación de confianza" para ese usuario específico:
    http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. use un URI de conexión que contenga todo:
    http://www.postgresql.org/docs/current/static/libpq-connect.html#AEN42532
un caballo sin nombre
fuente
44
Desde PostgreSQL 9.1 también existe el peermétodo de autenticación para conexiones locales. Actualmente solo para Linux, BSD, OS X o Solaris (no Windows).
Erwin Brandstetter
1
Una nota sobre la .pgpassopción, aún debe especificar el nombre de usuario, la base de datos y el nombre de host (si lo hubiera hecho normalmente) en el psqlcomando
raphael
con respecto a 3, debe editar el método. se explica aquí: gist.github.com/p1nox/4953113
FuzzyAmi
export PGPASSWORD="your_pw"
Úselo
18

Un ejemplo simple con PGPASSWORDserá algo como:

PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME

Espero eso ayude.

pdm
fuente
44
Hola Ian_H, gracias por tus comentarios y todos estoy de acuerdo con tus puntos. La respuesta aceptada es muy completa y eso resolvió mi problema. La razón por la que puse mi respuesta a esta vieja publicación es porque todavía no es sencillo para mí, ya que creo que otros pueden tener el mismo sentimiento.
pdm
Esta fue definitivamente una buena adición a la respuesta aceptada: recordatorio útil de que no necesitamos establecer permanentemente las variables ENV.
kevlarr
1

Dependiendo de los permisos de su cuenta, el ejemplo sin especificar la base de datos puede fallar, porque los permisos de los usuarios se comparan con la base de datos a la que se conecta. Es mejor especificar explícitamente la base de datos también.

# this can fail.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME    

# this is more likely to work, assuming given account has permissions to that database.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME -d YOUR_DATABASE  
mtoonen
fuente
0

Respuestas muy útiles en este hilo. Solo estoy agregando esto para ubuntu 18.04:

sudo PGPASSWORD=yourpasswordHere -u postgres psql

Esto lo llevará a los postgres sin la solicitud de contraseña, sin tener que establecer ninguna variable de entorno. Este no es un escenario permanente.

Dhiraj
fuente
No haga esto: la contraseña será visible en la salida de ps -ef.
Colin 't Hart