Automatiza tareas críticas de base de datos con seguridad y confianza. Aquí verás cómo crear un script en Bash para instalar y desinstalar PostgreSQL en Ubuntu, validando la instalación, gestionando contraseñas con sudo y controlando servicios con systemctl. Todo basado en un flujo práctico y reproducible.
¿Cómo automatizar la instalación de PostgreSQL en Ubuntu con Bash?
La estrategia parte de un nuevo script (basado en uno previo) que agrupa verificación, instalación y puesta en marcha del servicio. La lógica central: comprobar si existe el binario psql; si no, pedir contraseñas y ejecutar los comandos con privilegios.
¿Cómo verificar la instalación con which y códigos de salida?
Usar which psql para validar si PostgreSQL está en el PATH.
Interpretar $?: 0 si hubo éxito, distinto de 0 si no se encontró.
Mostrar un mensaje si ya está instalado; de lo contrario, iniciar instalación.
# Verificación de instalaciónverify_install=$(which psql >/dev/null 2>&1)if[$? -eq 0];thenecho"PostgreSQL ya se encuentra instalado en el equipo."elseecho -e "Verificar instalación de PostgreSQL..."# aquí continúa el flujo de instalaciónfi
¿Cómo pedir contraseñas de sudo y Postgres de forma segura?
Solicitar la contraseña del superusuario con lectura silenciosa.
Pedir la contraseña que se asignará al usuario postgres.
read -s -p "Ingresar contraseña de sudo: " password;echoread -s -p "Ingresar contraseña a utilizar en Postgres: " pg_password;echo
Enviar la contraseña a sudo por pipe con -S para no repetirla en cada comando.
¿Cómo configurar el usuario y habilitar el servicio?
Cambiar la contraseña del usuario postgres ejecutando psql como ese usuario.
Habilitar y levantar el service con systemctl.
# Cambio de contraseña del usuario postgresecho"$password"|sudo -S -u postgres psql -c "ALTER USER postgres WITH PASSWORD '${pg_password}';"# Habilitar y arrancar el servicioecho"$password"|sudo -S systemctl enable postgresql.service
echo"$password"|sudo -S systemctl start postgresql.service
# Pausa para continuarechoafter_msg="[Presione Enter para continuar]"read -n 1 -s -r -p "$after_msg";echo
¿Cómo detener y desinstalar PostgreSQL por completo?
El proceso inverso apaga el servicio, purga paquetes y elimina directorios, usuario y grupo asociados a PostgreSQL. Todo mediante el mismo patrón: contraseña única, pipe a sudo y comandos idempotentes.
Bajar el servicio antes de remover paquetes.
Purgar con apt-get y eliminar archivos de configuración y datos.
Remover usuario y grupo si persisten.
# Contraseña de sudoread -s -p "Ingresar contraseña de sudo: " password;echo# Detener el servicioecho"$password"|sudo -S systemctl stop postgresql.service
# Purga total de paquetesecho"$password"|sudo -S apt-get -y purge remove 'postgres*'# Eliminación de directorios de configuración y datosecho"$password"|sudo -S rm -rf /etc/postgresql
echo"$password"|sudo -S rm -rf /var/lib/postgresql
# Limpieza de cuentas del sistema (puede variar según la distro)echo"$password"|sudo -S userdel -r postgres 2>/dev/null ||trueecho"$password"|sudo -S groupdel postgres 2>/dev/null ||true
Nota: la ubicación de archivos puede variar entre distribuciones. Aquí se trabaja con Ubuntu, donde esta estructura es habitual.
¿Qué prácticas y comandos clave debes recordar?
Para crear scripts confiables y reutilizables, se aplican estas ideas y keywords en secuencia lógica:
Validación con which y $?: comprobar binarios en PATH y usar códigos de salida para el flujo.
Condicional if: if [ $? -eq 0 ]; then ... fi para decidir instalar o no.
Lectura silenciosa de contraseñas: read -s -p para proteger credenciales.
Elevación con sudo -S y pipe: echo "$password" | sudo -S <comando> para ejecutar como superusuario sin pedir contraseña cada vez.
Gestión de paquetes con APT: apt update y apt-get -y install/purge remove. Instalación de postgresql y postgresql-contrib.
Administración del servicio con systemctl: enable, start, stop para controlar postgresql.service.
Configuración de Postgres con psql: sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '...'" para definir la contraseña.
Limpieza de archivos y cuentas: rm -rf en /etc/postgresql y /var/lib/postgresql, más userdel y groupdel si aplica.
Pausa interactiva: read -n 1 -s -r -p para esperar confirmación del usuario.
¿Te gustaría que publiquemos una variante del script con menús interactivos o validaciones extra? Deja tus dudas y comentarios para seguir mejorando el flujo.
Esta es una lista de las variables especiales en bash que encontre en internet:
$1, $2, $3,... parámetros de posición que hacen referencia al primer, segundo, tercer, etc.parámetro pasado al script.$_, el último argumento pasado al último comando ejecutado(justo después de arrancar la shell, este valor guarda la ruta absoluta del comando que inicio la shell).$#, número total de argumentos pasados al script actual.$*, la lista completa de argumentos pasados al script.Esta valor es una cadena de texto.$@, la lista completa de argumentos pasados al script.Esta valor es una lista.$-, la lista de opciones de la shell actual.$$, el PID de la shell actual.$IFS, el separador utilizado para delimitar los campos.$?, el código de salida del pipe más reciente(es decir, de la última vez que se encadenaron varios comandos mediante el carácter pipe que se escribe como |).$!, el PID del último comando ejecutado en segundo plano.$0, el nombre de la shell o del script de shell.
algunas de ellas las hemos visto en las clases del curso
Hola Jose, Gracias por tu aporte. Quisiera preguntarte si el signo $ y el uso de comillas simples " ' " es para evitar el uso del "\n" tradicional? Es decir que lo único que cambiaría la respecto es el uso de comillas dobles " " (?)
Tengo una duda, sobre el paso de la variable que contiene la contraseña se SUDO, ¿esa variable acaso se queda guardada en la memoria RAM del equipo al ser almacenada? o como saber o evitar que no se almacene en memoria y sea "robada" mediante mecanismos de lenguaje de programación Ensamblador. gracias.
Buenas, tras instalar,desintalar postgres el comando which me devuelve el path al binario de postges, es por ello que cuando vuelvo a intentar instalarlo el if [ $? -eq 0 ] no me lo permite, ¿alguna explicación?.
En lugar de guardar la verificación, ¿por qué no se evalua directamente el comando en el if?
if[ which psql 1>22>/dev/null]; then
...
Si se quiere evitar mostrar el mensajes que arroja which, para eso (entre muchas otras cosas) se puedo utilizar redireccionamiento.
1>2 redirecciona salida estandar a error estandar. 2>/dev/null redirecciona el error estandar a un archivo especial de linux que es la nada (a lo agujero negro).
Muchas gracias profe, todo me pareció super bien explicado!! gracias por su tiempo y dedicación!, lo de la muletilla puede seguir trabajandolo pero eso no desmerita su esfuerzo por explicarnos cada tema.
Al momento de ejecutar la funcion desinstalar_postgres, dentro del proceso de desinstalacion me aparece una ventana con lo siguiente:
no se como seleccionar el <yes>, intente con muchas teclas pero no puedo seleccinar nada ni salir de esa ventana alguien sabe como seleccionar 'yes' o 'no' y continuar ?
Buenas tardes, a alguien más le ha pasado?
Cuando ejecuta la desinstalación de Postgres, aun con la opción "-y", me aparece un prompt para la purga de los archivos. Y la aplicación se queda totalmente bloqueada. Tengo que matar el proceso y realizar "dpkg --configure -a". Pero cuando ejecuto el mismo comando desde consola, me aparece el mismo mensaje, pero no se bloquea y puedo terminar la desinstalación.
Hola jose, buen dia, tengo tu mismo inconveniente, me aparece el prompt para la purga de archivos, se queda bloqeado, no puedo seleccionar nada y tampoco puedo completar la desinstalacion, encontraste alguna solucion que me puedas compartir ?
Para los que tengan dudas de qué hace sudo -S es modificar el comando de tal manera que tome el valor enviado por medio de standar input (stdin) en vez de solicitar el valor por medio de la interfaz de la terminal. Si se omite la opción -S el comando va a esperar que se ingrese por medio de la terminal el valor esperado
Buenos dias, aqui os dejo un par de tips que he encontrado ya que tenia algunos problemas y no he obtenido respuesta ninguna, ni por el profesor ni por los compañeros.
En primer lugar quería añadir una salto de linea en el prompt del comando "read", ya que me parecía poco estética la forma en la que se presenta en el curso.
La forma de hacerlo es:
read -sp $'\nIngresar la contraseña sudo:' password
Al añadir el simbolo "$" antes de la cadena del prompt y muy importante utilizar comillas simples " ' ". Para que así nos reconozca el comando "\n" para el salto de linea.
Y el segundo tip viene del problema encontrado al desinstalar Postgresql, ya que al purgar aparece un prompt solicitando confirmación para la eliminación de directorios. Y al ejecutarlo desde el script, se bloquea la terminal y hay que matar el proceso. En cambio si lo hacemos desde la terminal, aparece el mismo prompt pero no se bloquea.
Despues de mucho investigar y hacer muchas pruebas, he localizado la opción:
Debemos ejecutar el comando:
pg_dropcluster --stop 12 main
Con el que eliminamos las configuraciones y archivos de postgres, y después de hacer esto ya podemos utilizar el comando desde el script sin ningún prompt. Además he visto que la opción --purge del comando apt-get remove, ya elimina los directorios que el profesor nos hace borrar manualmente con el script. Por lo que en el proceso lanza mensajes de que no ha podido borrar el archivo o directorio. Finalmente mi código totalmente funcional queda de la siguiente forma.
#!/bin/bash# Programa que permite manejar la utilidades de PostGres# Autor:TonyPintoEmail: tony@tpgimeno.comopcion=0directorioBackup=""backup=""#Función para instalar postgres
instalar_postgres(){ echo -e "\nVerificar instalación PostGres ..." verifyInstall=$(which psql)if[ $?-eq 0]; then
echo -e "\nPostGres ya se encuentra instalado en el equipo"else read -sp $'\nIngresar la contraseña sudo:' password
read -sp $'\nIngresar la contraseña para PostGres:' passwordPostgres
echo "$password"| sudo -S apt update
echo "$password"| sudo -S apt-get -y install postgresql postgresql-contrib
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '{passwordPostgres}';" echo "$password"| sudo -S systemctl enable postgresql.service echo "$password"| sudo -S systemctl start postgresql.service fi
read -p $'\nPRESIONE [ENTER] para continuar ...'}#Función para desinstalar postgres
desinstalar_postgres(){ read -sp $'\nIngresar la contraseña sudo:' password
echo -e "\n" echo "$password"| sudo -S systemctl stop postgresql.service echo "$password"| sudo -S pg_dropcluster --stop 12 main
echo "$password"| sudo -S apt-get -y --purge remove postgresql\* echo "$password"| sudo -S userdel -r postgres
echo "$password"| sudo -S groupdel postgresql
read -p $'\nPRESIONE [ENTER] para continuar ...'}#Función para sacar un respaldo
respaldo(){ echo -e "\nSacar respaldo..." echo "Directorio respaldo: $1"}#Función para restaurar respaldo
restaurar_respaldo(){ echo -e "\nRestaurar respaldo..." echo "Nombre del respaldo: $1"}while:do #Limpiar la pantalla
clear
#Desplegar el menu de opciones
echo "-----------------------------------------" echo "PGUTIL - Programa de Utilidad de Postgres" echo "-----------------------------------------" echo " MENU PRINCIPAL " echo "-----------------------------------------" echo "1. Instalar Postgres" echo "2. Desinstalar Postgres" echo "3. Realizar un respaldo" echo "4. Restaurar un respaldo" echo "5. Salir" #Leer los datos del usuario - capturar información
read -n1 -p "Ingresar una opción [1 - 5]: " opcion
#Validar la opción ingresada
case $opcion in1) instalar_postgres
sleep 3;;2) desinstalar_postgres
sleep 3;;3) read -rep $'\nIngresar el directorio de Backup:' directorioBackup
respaldo $directorioBackup
sleep 3;;4) read -rep $'\nIngresar backup a restaurar:' backup
restaurar_respaldo $backup
sleep 3;;5) echo -e "\nSalir del Programa" exit 0;; esac
done
Espero les sirva de ayuda.
Les comparto el codigo por si no pueden visualizar en el video:
# !/bin/bash
# Programa que permite manejar las utilidades de Postres# Autor:Marcoopcion=0# Función para instalar postgres
instalar_postgres(){ echo -e "\n Verificar instalación postgres ...." verifyInstall=$(which psql)if[ $?-eq 0]; then
echo -e "\n Postgres ya se encuentra instalado en el equipo"else read -s -p "Ingresar contraseña de sudo:" password
read -s -p "Ingresar contraseña a utilizar en postgres:" passwordPostgres
echo "$password"| sudo -S apt update
echo "$password"| sudo -S apt-get -y install postgresql postgresql-contrib
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '{$PASSWORDpOSTGRES}';" echo "$password"| sudo -S systemctl enable postgresql.service echo "$password"| sudo -S systemctl start postgresql.service fi
read -n 1-s -r -p "PRESIONE [ENTER] para continuar..."}# Función para desinstalar postgres
desinstalar_postgres(){ read -s -p "Ingresar contraseña de sudo:" password
echo -e "\n" echo "$password"| sudo -S systemctl stop postgresql.service echo "$password"| sudo -S apt-get -y --purge remove postgresql\* echo "$password"| sudo -S rm -r /etc/postgresql
echo "$password"| sudo -S rm -r /etc/postgresql-common
echo "$password"| sudo -S rm -r /var/lib/postgresql
echo "$password"| sudo -S userdel -r postgres
echo "$password"| sudo -S groupdel postgresql
read -n 1-s -r -p "PRESIONE [ENTER] para continuar..."}# Función para sacar un respaldo
sacar_respaldo(){ echo "Sacar respaldo..."i
echo "Directorio backup: $1"}# Función para restaurar un respaldo
restaurar_respaldo(){ echo "Restaurar respaldo..." echo "Directorio respaldo: $1"}while:do #Limpiar la pantalla
clear
#Desplegar el menú de opciones
echo "_________________________________________" echo "PGUTIL - Programa de Utilidad de Postgres" echo "_________________________________________" echo " MENÚ PRINCIPAL " echo "_________________________________________" echo "1. Instalar Postgres" echo "2. Desinstalar Postgres" echo "3. Sacar un respaldo" echo "4. Restar respaldo" echo "5. Salir" # Leer los datos del usuario - capturar información
read -n1 -p "Ingrese una opción [1-5]:" opcion
#Validar la opción ingresada
case $opcion in1) instalar_postgres
sleep 3;;2) desinstalar_postgres
sleep 3;;3) read -p "Directorio Backup:" directorioBackup
sacar_respaldo $directorioBackup
sleep 3;;4) read -p "Directorio de Respaldos:" directorioRespaldos
restaurar_respaldo $directorioRespaldos
sleep 3;;5) echo "Hasta la vista Baby" exit 0;;
esac
done