No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Programación en Bash Shell

Curso de Programación en Bash Shell

Marco Antonio Toscano Freire

Marco Antonio Toscano Freire

Funciones de instalar y desinstalar postgres

40/43
Recursos

Aportes 25

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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

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: Tony Pinto Email: [email protected]

opcion=0
directorioBackup=""
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 in 
        1)
            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.

Buen curso, muy facil la explicación, me sorprende no ver comentarios…
En lo personal me ayudo bastante con mi trabajo diario.

Ejecutar un comando con sudo desde un bash-script

read -s -p "Ingresar cotraseña sudo" password
echo "$password" | sudo comando

Me parecio interesante este dato como tambien el resto del curso en general.

Les comparto el codigo por si no pueden visualizar en el video:

# ! /bin/bash
# Programa que permite manejar las utilidades de Postres
# Autor: Marco

opcion=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 in

                1)
                        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

Significado de $?: devuelve el estado del último comando ejecutado.

Más información:
https://stackoverflow.com/questions/7248031/meaning-of-dollar-question-mark-in-shell-scripts

No estaria brindando mal el password de usuario de postgres, ya que al guardarla la guarda en una variablame llamada

$passwordPostgres

Pero al realizar el cambio de contraseña en postgres lo manda se de esta forma

$PASSWORDpOSTGRES

Ya casi se terminan los temas del curso XD

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.

En lugar de guardar la verificación, ¿por qué no se evalua directamente el comando en el if?

if [ which psql 1>2 2>/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.

en algunas distros basta con un purge :d

Mi código:
1- Frontend
2- Backend

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

Recordar que:

0 # True
1 # False
#!/bin/bash

option=0
backup_directory=""
restore_directory=""

install_postgresql () {
    echo -e "\nVerifying PostgreSQL installation..."
    is_pg_installed=$(which psql)
    
    if [ $? -eq 0 ]; then
        echo -e "\nPostgreSQL is already installed on this server."
    else
        echo -e "\n"
        read -s -p "Enter the sudo password: " password
        echo -e "\n"
        read -s -p "Enter the new PostgreSQL password: " postgresql_password

        echo "$password" | sudo -S apt update
        echo "$password" | sudo -S apt install postgresql postgresql-contrib -y
        echo -e "\nInstalling PostgreSQL..."
        
        sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '{postgresql_password}';"
        
        echo "$password" | sudo -S service postgresql enable
        echo "$password" | sudo -S service postgresql start
    fi

    echo -e "\n"
    read -n1 -s -r -p "Press [ENTER] to continue..."
}

uninstall_postgresql () {
    echo -e "\n"
    read -s -p "Enter the sudo password: " password

    echo -e "\nUninstalling PostgreSQL..."
    
    echo "$password" | sudo -S service postgresql stop
    echo "$password" | sudo -S apt remove postgresql\* --purge -y
    echo "$password" | sudo -S rm -rf /etc/postgresql
    echo "$password" | sudo -S rm -rf /etc/postgresql-common
    echo "$password" | sudo -S rm -rf /var/lib/postgresql
    echo "$password" | sudo -S userdel -r postgres
    echo "$password" | sudo -S groupdel postgresql

    echo -e "\n"
    read -n1 -s -r -p "Press [ENTER] to continue..."
}

backup () {
    echo -e "\nBackuping..."
    echo -e "\nBackup directory: $1"
}

restore_backup () {
    echo -e "\nRestoring backup..."
    echo -e "\nRestore directory: $1"
}

while :
do
    clear
    echo "-------------------------------------"
    echo "PGUTIL - PostgreSQL utilities program"
    echo "-------------------------------------"
    echo "              MAIN MENU              "
    echo "-------------------------------------"
    echo "1. Install PostgreSQL"
    echo "2. Uninstall PostgreSQL"
    echo "3. Backup"
    echo "4. Restore Backup"
    echo "5. Exit"

    read -n1 -p "Enter an option [1-5]: " option

    case $option in
    1)
        install_postgresql
        sleep 3
        ;;
    2)
        uninstall_postgresql
        sleep 3
        ;;
    3)
        echo -e "\n"
        read -p "Enter the backup directory: " backup_directory
        backup $backup_directory
        sleep 3
        ;;
    4)
        echo -e "\n"
        read -p "Enter the backup restore directory: " restore_directory 
        restore_backup $restore_directory
        sleep 3
        ;;
    5)
        echo -e "\nExiting..."
        exit 0
        ;;
    esac
done

Me deje -S entre sudo y comando lo siento.

Alguien ha hecho todo esto desde Mac? Me pregunto si los comandos cambian, pienso que en vez de apt uso brew pero no se si debo cambiar los comandos para habilitar (deshabilitar) y levantar (bajar) los servicios de Postgres en Mac

En bash tenemos algunas variables especiales, entre ellas aquí estamos utilizando $? esta variable guarda el código de salida del ultimo comando pipe utilizado. El cual está relacionado al hecho de si se pudo conectar los comandos o no con el pipe.
.
En otras palabras si la conexión fue exitosa se almacena un numero 0 en caso contrario se almacena un numero 1, esto con relación a la última conexión entre comandos utilizados.
.
Por esa razón en la función de instalar_postgres primero se ejecuta el comando which psql y el resultado de ese comando se conecta a la creación de una variable que se puede entender como un segundo comando en este caso si resulta exitosa esa conexión la variable $? guardara un numero 0 en caso contrario guardara un numero 1 y de ahí su importancia para validar procesos con un condicional if
.
Para aplicaciones más complejas donde se necesita saber el código de salida de varias conexiones con pipe, no solamente de la última ejecutada, en algunas distribuciones de linux existe una matriz de códigos de salidas llamada PIPESTATUS en la cual utilizamos en índice del arreglo para buscar el código del pipe que estamos buscando

\### Resumen: \- Puedes crear funciones en Bash usando `nombre\_funcion() { ... }`. \- Los argumentos se pasan a las funciones como en los scripts, usando `$1`, `$2`, etc. \- Puedes devolver códigos de estado con `return` o cadenas de texto con `echo`. \- Usar `"$@"` permite iterar sobre todos los argumentos de manera eficiente.
En vim para eliminar texto desde el cursor a la derecha en una línea, podemos utilizar el comando: `d$` (utilizar en modo no normal es decir no insertar)

++La variable <span class=“math-inline”>?\ en bash es una variable especial que contiene el código de salida del último comando que se ejecutó. El código de salida es un número que indica si el comando se ejecutó correctamente o no.
Los códigos de salida comunes son:

  • 0: El comando se ejecutó correctamente.
  • 1: El comando falló.
  • 2: El comando no se encontró.
  • 3: Se introdujeron argumentos incorrectos al comando.
  • 127: El comando no es un comando interno o externo.
    La variable ?se puede utilizar en los comandosifywhile para comprobar si el último comando se ejecutó correctamente.

Por ejemplo, el siguiente código utiliza la variable $? para comprobar si el comando ls se ejecutó correctamente. Si es así, el código imprime el mensaje “El comando ls se ejecutó correctamente.” En caso contrario, el código imprime el mensaje “El comando ls falló.”

if [ $? -eq 0 ]; then
echo "El comando ls se ejecutó correctamente."
else
echo "El comando ls falló."
fi
En este ejemplo, si el comando ls se ejecutó correctamente, se imprimirá el mensaje “El comando ls se ejecutó correctamente.” En caso contrario, se imprimirá el mensaje “El comando ls falló.”

La variable <span class=“math-inline”>?\ también se puede utilizar para controlar el flujo de un script de shell. Por ejemplo, el siguiente código utiliza la variable ?para detener el script si el comandols falló.

if [ $? -ne 0 ]; then
echo "El comando ls falló."
exit 1
fi
En este ejemplo, si el comando ls falló, el script se detendrá y se imprimirá el mensaje “El comando ls falló.” El código exit 1 indica que el script falló.

La variable $? es una herramienta muy útil para controlar el flujo de un script de shell. Se puede utilizar para comprobar si un comando se ejecutó correctamente, para controlar el flujo de un script y para detener un script si se produce un error.++

Quedo mal como le pasaste la password !! Ni en el archivo para descargar esta corregido !

Se me acaba de ocurrir esto, si estoy mal en algo por favor dígame.
Se puede crear un script como el del profesor, que este script tenga un menú, donde nosotros podamos personalizar los comandos de instalación de ciertas cosas. Podríamos llevar esto al trabajo (algo así como una “mala” copia de Docker) y así instalar los componentes que hagan falta.

Muy bien y puesto en practica…