psql sin contraseña
El programa psql
es el indicado para efectuar un buen número de trabajos en
el servidor PostgreSQL, muchos de ellos no interactivos, por lo que es
conveniente recordar aquí las diferentes posibilidades que existen para no
requerir presencia humana.
Empleando el entorno
Se puede emplear la variable de entorno PGPASSWORD
para almacenar la
contraseña del usuario, pero es un método desaconsejado por varias razones:
- Cualquiera que tenga acceso al entorno del proceso puede acceder a la contraseña.
- Sólo sirve para un usuario en concreto, el que se indica en la conexión con
el parámetro
-U
.
Más información en la
documentación
de la versión 7.4
.
Usando un archivo
Si existe un archivo llamado .pgpass
en el directorio de inicio del usuario
que invoca al programa psql
, y tiene restringidos los permisos de acceso
únicamente al usuario (0600), se puede emplear para conservar contraseñas de
acceso, siempre que éstas no se especifiquen de otra forma en la llamada.
El archivo contiene líneas con el siguiente aspecto:
hostname:port:database:username:password
donde todos los campos exceptuando el último, el de la contraseña, pueden
contener un asterisco (*
) a emplear como comodín cuando se buscan los
parámetros de conexión. Así pues, es posible definir varias combinaciones
entre el servidor de bases de datos, la base de datos y el usuario.
Observaciones:
- Se emplea la primera línea que coincide, así que es mejor definir las entradas más específicas antes que las genéricas.
- Lo de los permisos va en serio; si encuentra un acceso menos restrictivo que 0600 ignora la archivo por completo; conviene comprobar este extremo antes de nada en caso de problemas.
Documentación
para la versión 7.4
.
Caso práctico: bacula y postgresql
En una de mis redes existen bases de datos que debo incluir en las copias de seguridad, y que tienen que aparecer como volcados, dadas las dificultades (a veces insalvables, como migrar de una versión de 32 bits a una de 64 bits) que supone poner en marcha una recuperación desde archivos del sistema.
Para ello he creado un pequeño programa que obtiene ese volcado mediante la
herramienta pg_dump
, y que debe ejecutarse antes de cualquier trabajo de
copia real. Como empleo bacula para respaldar los datos, he
visto que lo más cómodo y limpio es que sea el propio usuario bacula
el que
se encargue de eso, por lo que el programa se instala en /etc/bacula/scripts
con el nombre de dump-databases.sh
y tiene éste aspecto:
1 #!/bin/sh 2 3 # Directorio donde almacenar las copias 4 # por cada base de datos 5 TARGET=/data/backups/postgres 6 7 # Cambio temporal del directorio HOME para tener acceso 8 # al archivo .pgpass, dado que en 7.4 no existe la opción 9 # de especificar otro archivo 10 export HOME=/etc/bacula 11 12 # 13 # Usuario de conexión con la base de datos, con suficientes permisos para 14 # efectuar el volcado 15 # 16 USERDB=postgres 17 18 # 19 # Comprobamos que podamos escribir en el directorio destino 20 if [ ! -d $TARGET -a ! -w $TARGET ]; then 21 echo $0: could not write to $TARGET 22 exit 1 23 fi 24 25 # Bases de datos a salvar si no se indica otra cosa 26 DATABASES="venexma_alpha bacula ecoembes lidia" 27 if [ $# -gt 0 ]; then 28 DATABASES=$* 29 else 30 DATABASES=$(psql -h localhost -U $USERDB -t -c "select datname from pg_database;" template1) 31 fi 32 33 # Parámetros para volcado de base de datos: 34 # - Usuario y servidor 35 # - Formato tar 36 # - Incluir instrucciones SQL para borrar la base de datos. 37 # - Incluir instrucciones SQL para crear la base de datos. 38 PGDUMP_OPT="-U $USERDB --format=t --clean --create -h localhost " 39 40 # obtener un grupo de archivos independiente. 41 for db in $DATABASES 42 do 43 if [ "$db" == "template0" ]; then 44 continue 45 fi 46 cd $TARGET 47 mkdir -p $db 48 chmod 0750 $db 49 cd $db 50 pg_dump $PGDUMP_OPT $db | tar xf - 51 done
Podemos ver como se cambia la variable de entorno HOME
para que apunte a
/etc/bacula
ya que es allí donde tengo el archivo .pgpass
con una entrada para
el usuario postgres
.