A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

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 20

Preguntas 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

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.
[email protected], 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

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

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

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.

Ya casi se terminan los temas del curso XD

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

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 鈥渞ead鈥, 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.

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

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

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

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 鈥渞obada鈥 mediante mecanismos de lenguaje de programaci贸n Ensamblador. gracias.

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

Mi c贸digo:
1- Frontend
2- Backend

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 鈥渕ala鈥 copia de Docker) y as铆 instalar los componentes que hagan falta.

en algunas distros basta con un purge :d

Muy bien y puesto en practica鈥