Bases del sistema operativo

1

Lo que aprenderás sobre la administración de servidores linux

2

Distribuciones más utilizadas de Linux

3

Instalación de Ubuntu Server

4

Instrucciones para instalar CentOS

5

Gestión del árbol de directorios

6

Diferencias entre LESS, CAT, HEAD y TAIL para lectura de archivos

7

Interacción con archivos y permisos

8

Conociendo las terminales en linux

9

Manejo y monitoreo de procesos y recursos del sistema

10

Monitoreo de recursos del sistema

Instalación y manejo de software en Linux

11

Análisis de los parámetros de red

12

Administración de paquetes acorde a la distribución

13

Manejo de paquetes en sistemas basados en Debian

14

Administración de software con YUM y RPM para CentOS

15

Nagios: Desempaquetado, descompresión, compilación e instalación de paquetes

Administración de usuarios

16

Los usuarios, una tarea vital en el proceso de administración del sistema operativo

17

Creando y manejando cuentas de usuario en el sistema operativo

18

Entendiendo la membresía de los grupos

19

Usando PAM para el control de acceso de usuarios

Servicios en el sistema operativo

20

Autenticación de clientes y servidores sobre SSH

21

Configurando DNS con bind

22

Arranque, detención y recarga de servicios

23

NGINX y Apache en Ubuntu server

24

Instalación y configuración de NGINX

25

¿Qué es NGINX Amplify?

26

NGINX Amplify: Instalación y configuración de un servidor para producción

27

Monitoreo de MySQL con Nagios

28

Configuración de Nagios

29

Los logs, nuestros mejores amigos

30

Otros servicios de logs

Bash scripting

31

Las bases de bash

32

Las variables y su entorno de ejecución

33

Automatizando tareas desde la terminal

34

Automatizando la copia de seguridad

35

Crontab

Asegurando tu servidor

36

Entendiendo la gestión de vulnerabilidades

37

¿Qué es una superficie de ataque? Principio del menor privilegio

38

El firewall y sus reglas

39

Escaneo de puertos con NMAP y NIKTO desde Kali Linux

40

Lynis: Herramientas de auditoria de seguridad en Linux

Proyecto

41

Configuración de Node.js en un ambiente productivo

42

Configuración de NGINX para la aplicación de Node.js

Bonus: Linux en Azure

43

Aprende sobre Linux en Azure

44

Despliegue de una aplicación web MEAN

45

Crea una máquina virtual en la nube de Azure

Conclusiones

46

Lo que aprendiste sobre servidores linux

Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Automatizando tareas desde la terminal

33/46
Recursos

Nuestro principal trabajo como administradores de sistemas es automatizar las tareas y procesos de nuestro servidor. En esta clase vamos a realizar un script que nos permita realizar una copia de seguridad de una base de datos MYSQL.

Aportes 44

Preguntas 7

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

En esta clase se asumen conocimientos de programación, para aquellos que no los tengan explicaré brevemente el código.

El objetivo del script es hacer un backup de una base de datos, para ello primero se debe verificar que estén instalados ciertos paquetes en el sistema operativo (es lo que se ve en esta clase). Antes de continuar es importante saber la definición de funciones en programación.

Una vez sabiendo esto, empezamos el análisis del código:

El profesor empezó con el comando

set -e

simplemente para detener la ejecución del script por si hay alguna falla.

Después declaró dos variables de solo lectura. Estas son como variables globales, es decir, pueden llamarse aún estando dentro de funciones.

Después ejecuta dos funciones (run y make_backup), estas dos funciones son declaradas más abajo (en realidad en esta clase solo se ve la función run).

La función run ejecuta otra función (assert_is_insatalled), la cual recibe como parámetro los nombres de paquetes que la función assert_is_insatalled se va a encargar de preguntar si están instalados.

La función assert_is_insatalled inicia con la declaración de una variable (name), la cual lee el primer argumento ($1) que recibe la función assert_is_insatalled (que es el nombre del paquete a averiguar si está instalado). Para saber si está instalado el paquete solo hace un condicional cuya condición es si el comando

command -v "paquete" 

da respuesta, si no da respuesta el comando, significa que no está instalado y ejecuta la función log_error con argumento “The binario …” y después de eso marca un error con el comando

exit 1

Ver para entender el exit.

La función log_error define otra variable que lee el argumento recibido y llama a otra función (log) con dos argumentos.

La función log lee los dos argumentos recibidos y crea otra variable con la fecha de ese momento, para después hacer una salida echo especificando que es un error (>&2). Errores1 Errores2

En clonclusión se crearon las funciones run y assert_is_installed para saber si ciertos paquetes que se usarán están insatalados, y las funciones log_error y log para el manejo de errores.

RESUMEN DE LA CLASE
|
Automatizando tareas desde la terminal
|
|
Scripts útiles
|

  • Generar backup de base de datos MySQL
#!/bin/bash
# Shell script para obtener una copia desde MySQL
# Desarrollado por Jhon Edison

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

set -e

readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly SCRIPT_NAME="$(basename "$0")"

run
make_backup

function assert_is_installed {
	local readonly name="$1"
	if [[ ! $(command -v ${name})]]; then
		log_error "The binary '$name' is required but it isn't in 		our system"
		exit 1
}

function log_error {
	local readonly message "$1"
	log "ERROR" "$message"
}

function  log {
	local readonly level="$1"
	local readonly message="$2"
	local readonly timestamp=$(date +"%Y-%m-%d %H:%M:%S") >&2 echo -e "${timestamp} [${level}] [$SCRIPT_NAME] ${message}"
		
}

function run {
	assert_is_installed "mysql"
	assert_is_installed "mysqldump"
	assert_is_installed "gzip"
	assert_is_installed "aws"
}

No se vio el script corriendo en el vídeo, tampoco la explicación a fondo de muchas funciones y comandos muy importantes para aquel que apenas está aprendiendo como administrar un servidor Linux. Lo que realmente vi fue como se ¡tarareaba! cada símbolo o letra escrita en la pantalla durante toda “la clase”. A mi parecer, pudo haber escogido un ejemplo más didáctico…

Esta clase ha sido incomprensible… Paso al siguiente video con varias dudas.

se le fue la mano pudo automatizar un proceso tan sencillo como el de limpiar memoria

Se debió dar el curso de bash y regex primero

Concuerdo con varios comentarios, hay muchas tareas mucho más simples para automatizar y que no requieren aplicar tanto código para quienes no tienen experiencia en programación bash. Exagerado e incompleto ejemplo.

Esta es de las clases que hay que tomar a prueba de fe. ¿Qué se debe hacer con el script? de todas formas para automatizar algo hay que hacer el curso de bash porque a mi parecer esta clase nos dejó igual.

Es útil saber también que si ocupa ejecutar comandos de consola dentro del Script, en vez de usar “$(cd dirname)”, puede usar ver imagen esto le puede ayudar a hacer el código más legible, o le puede ayudar a entender el código de alguien más en el futuro 😉
Nota: ese símbolo NO es una comilla, se escribe como “alt gr + ] + espacio”

Estaba por escribir que no se entendió nada de la clase, cuando me doy cuenta que en realidad no se explico nada, no es que yo no entendí.
No comprendo como del video anterior que se empezó con lo básico de Bash, llegamos a este como si en medio faltarían como 10 videos mas.

Copy.bash

#Este script lo hará desde un cron por lo cual necesita la variable especifica que es el path desde donde va a correr y se añaden las rutas posibles donde se #podría ejecutar

#!/bin/bash
# Shell script para obtener una copia desde MySQL
# Desarrollado por JE
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

#Set -e : detiene el script si encuentra errores en caso de fallo

set -e

#declaracion de dos variables de sólo lectura
#en la primera obtiene el nombre del directorio y obtiene desde bash_source (var del sistema) si no #aloja ningun resultado ejecuta pwd
#en la segunda solo obtiene el nombre del script

readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly SCRIPT_NAME="$(basename "$0")"

#en bash script todo se ejecuta de manera ascyncrona lo primero que se crea es la función run

run
make_backup

#verifica si se encuentra instalado el paquete por medio del nombre que llego por parametro $1
#si el comando command -v name no da algo especifico llama a la funcion log_error y le envia el #mensaje de error

function assert_is_installed {
	local readonly name="$1"
	if [[ ! $(command -v ${name})]]; then
		log_error "The binary '$name' is required but it isn't in our system"
		exit 1
}

#vuelve a llamar a otra función llamada log mandando como parametros “ERROR” y el mensaje #generado anteriormente

function log_error {
	local readonly message "$1"
	log "ERROR" "$message"
}

#imprime el error concatenando el mensaje generado $1 el ERROR $2 con el nivel de error $SCRIPTNAME añadiendo la fecha actual en el formato establecido

function  log {
	local readonly level="$1"
	local readonly message="$2"
	local readonly timestamp=$(date +"%Y-%m-%d %H:%M:%S") >&2 echo -e "${timestamp} [${level}] [$SCRIPT_NAME] ${message}"
		
}

#llama a la funcion assert_is_installed para verificar si se encuentra instalado el software especifico

function run {
	assert_is_installed "mysql"
	assert_is_installed "mysqldump"
	assert_is_installed "gzip"
	assert_is_installed "aws"
}

Perdon, pero lamentablemente no se termino de entender nada, que lamentable que den toda esta info, sin especificarla o darla por sobre entendida! muy mal !!!

En esta clase sino entendí nada 😦

Otra cosa, el script está lleno de errores xD Aún no comprendo muy bien el lenguaje bash, tengo conocimientos ultra básicos, pero al tratar de correrlo me da errores de sintaxis, por ejemplo, al final de cada nombre de función debería ir paréntesis “()”, está llamando a funciones antes de definirlas (Es bash, no JavaScript!) Algo que se me hizo muy raro fue el hecho de usar comillas dobles dentro de comillas dobles, que también da error, en fin, algún día corregiré este script jaja

Hay formas mas sencillas de hacer una copia de base de datos en mysql, además mysqldump se instala con mysql no?, y gzip es una herramienta básica… y si no tiene mysql no tiene sentido hacer una copia de algo que no existe.

Lamentablemente no entendí nada, este profesor no es muy didactico, debería darse el tiempo de explicar un poco y no decir que se vea otros cursos.

Vale, básicamente al usar $() con paréntesis podemos mandar a llamar comandos y al usar ${} con llaves podemos traernos los valores de variables

En este curso se aprende más leyendo los aportes de los demás que mirando los videos. ¡Gracias a todos!

Script con un poquito de documentación:

#!/bin/bash
# Shell script to get a copy from MySQL

# Paths from which the script can be called from
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# If something goes wrong, exit the script
set -e

# Script directory
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"         # Linux code: $()
readonly SCRIPT_NAME="$(basename "$0")"

# Call the following functions (Note: In bash everything runs asynchronous)
run
make_backup

function assert_is_installed {
	# Get the first parameter
    local readonly name="$1"

    # Validates if the command has an output
	if [[ ! $(command -v ${name})]]; then
        # If the output is empty, calls the log_error frunction and exit the script
		log_error "The binary '$name' is required but it isn't in our system"
		exit 1
}

function log_error {
	local readonly message "$1"
	log "ERROR" "$message"          # Pass 2 parameters to the log function
}

function  log {
	local readonly type="$1"
	local readonly message="$2"

    # Notes:
        # Redirections (>)
        # Errors (2)
	local readonly timestamp=$(date +"%Y-%m-%d %H:%M:%S") >&2 echo -e "${timestamp} [${type}] [$SCRIPT_NAME] ${message}"
}

function run {
    # check requirements
	assert_is_installed "mysql"
	assert_is_installed "mysqldump"
	assert_is_installed "gzip"
	assert_is_installed "aws"
}

En esta clase no se hace una buena explicación para que los y las estudiantes podamos entender y eventualmente replicar este código. El profesor debería ser más didáctico al elegir los códigos que va a utilizar para que deje un conocimiento en las personas que miran el video.

Por qué razón se debe definir siempre #!/bin/bash ?
Entiendo que si no se define el interprete de los comandos del script será el que esté por defecto en el sistema.

Buena clase, Subió mucho la barra de la dificultad en un solo tiro. Aprendí que tengo mucho por aprender. Muy Interesante.

pregunta pequeña, “:” es el separador entre las distintas rutas que se puede ejecutar ?

No pues esto está en chino antiguo 😦

No lo vi comentado, pero la razón por la que se redefine la variable de entorno $PATH es porque se ejecutará el script desde el crontab de la sesión de usuario ($ crontab -e), lo cual es importante aclarar puesto que de haberse configurado el crontab para todo el sistema (/etc/crontab) entonces sí podría acceder a la variable de entorno $PATH.

Lo anterior sucede porque existen dos tipos de sesiones de shell; la primera, llamada Login-Shell, sucede cuando el shell solicita el usuario y contraseña; y la segundda, llamada Non-Login-Shell, sucede cuando la shell ya sabe de que usuario se trata, y entonces asume esta información. Según el tipo de sesión la shell consultará distintos archivos que le permitirán construir sus variables de entorno y su configuración como shell.

En el siguiente ejemplo se demuestra cual es el estado de $PATH llamándose al script en primer lugar desde un crontab definido por el usuario, y luego, ejecutando el mismo script pero de forma manual. Como es visible, el tipo de sesión en shell establecida afectará a $PATH porque esta se construye en base a dicho tipo:

Repitiendo el mismo ejercicio pero configurando el crontab como una ejecución del sistema (modificando el archivo /etc/crontab), se puede observar como se establece un tipo de sesión de shell que permite que $PATH tenga un valor más completo:

Existen varias formas de atacar este comportamiento, y lo que hizo el profesor en el video es de las más sencillas pero también de las menos elegantes porque hay que estar escribiendo lo mismo en cada script que crontab ejecute.

¯_(ツ)_/¯

Mis notas

#!/bin/bash
# Shell scrips para obtener una copia de seguridad de una base de datos Mysql
# Desarrollado por Tobias Sanjuan

PATH=/usr/local/sbin:/usr/local/bin:/sbun:/bin:/usr/sbin:/usr/bin

set -e

readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly SCRIPT_NAME="$(basename "$0")"

# Dos funciones especificas
run
meke_backup

# Esta es la funcion de si el paquete esta instalado.
function assert_is_installed {
        # Solo optendra un nombre y ese nombre sera lo que le llege por parametro (los 4 posteriores).
        local redonly name="$1"

        # El siguiente if verifica si el paquete esta instalado o no.
        # Si el comando de la variable name que tenemos no esta instalado que tire el error.
        if [[ ! $(command -v ${name}) ]]; then
        # log_error es una funcion.
        log_error "The binario '$name' se requiere pero no esta en nuestro sistema"
        exit 1
}

function log_error {
        local readonly message "$1"
        #Se hace otro log porque seguramente no va a ser un error sino que otro tipo de interferencia
        log "ERROR" "$message"
}

function log {
        local readonly level="$1"
        local readonly message="$2"
        local readonly timestano=$(date + "%Y-%m-%d %H:%M:%S")>&2 echo -e "${timestamp} [${level}] [$SCRIPT_NAME] ${message}"
}

# Codigo de la funcion run, donde se invoca otra funcion que verifica si lo que voy a nesesitar
# para el scrip esta instalado.
function run {
        assert_is_installed "mysql"
        # El siguiente se encarga de realizar las copias.
        assert_is_installed "msqldump"
        # El siguiente es un suftware nesesario para comprimir.
        assert_is_installed "gzip"
        # Nesesitaremos un cloud provider.
        assert_is_installed "aws"
}

# Todo esto fue para hacer la verificacion de los binarios en tu S.O

“” = ?
$ = variable del sistema
() = instruction
[] = valor
[[]] = ?
{} = ?

assert_is_installed “” = nombre dado por ?

super! muchas gracias 😃

Muy interesante.

Esta clase a mi entender esta fuera del alcance de este curso, normalmente los backups de base de datos, los hacemos desde herramientas especializadas las cuales ya existen, imgenense que deban hacer un script para hacer un backup, de cualquier BD 😃

Creo que le hace falta una actualizada a este curso, muchos temas a mi parecer y a lo que veo en comentarios están mal explicados, nos hace falta mas contexto de muchas cosas

Espero q en la siguiente clase lo ejecuten, me quedé con las ganas de verlo corriendo.

Esto se puede hacer con cualquier lenguaje de programacion de backend. Yo particularmente uso mucho PHP para automatizar tareas en Linux. De hecho esto mismo lo he hecho con PHP y lo ejecuto con un cronjob. Puedes usar cualquier lenguaje de scripting para eso. Sin embargo hacerlo con bash es lo mas “nativo” y directo porque posiblemente los otros lenguaje pueden llegar a ejecutar comandos bash.

Una recomendación, ojo con los archivos con timestamps con el caracter dos puntos ( : )… si se quieren copiar esos archivos a otro S.O. como un Windows, pueden causar problemas. Mejor separar con guiones u otra cosa, o no hacerlo.

me perdí

Bueno a estas alturas no hay que asumir que podemos entender el codigo , pienso que se pudo hacer con un codigo mas sencillo y explicado.

Nota mental: tomar curso de Bash aquí en Platzi

Si lo desean, pueden usar visual studio para codear bash, mediante ssh se conectan, con la extension Remote SSH, para codear es mucho mas comodo que VIM.
https://code.visualstudio.com/docs/remote/ssh-tutorial

Clase de automatizar y enredar ;.(

Es tremendo el poder de bash

bash para realizar la copia de bases de mysql

Necesito el curso de script bash

Buen aporte.