Bases del sistema operativo

1

Aviso de renovación del curso

2

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

3

Distribuciones más utilizadas de Linux

4

Instalación de Ubuntu Server

5

Instrucciones para instalar CentOS

6

Gestión del árbol de directorios

7

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

8

Interacción con archivos y permisos

9

Conociendo las terminales en linux

10

Manejo y monitoreo de procesos y recursos del sistema

11

Monitoreo de recursos del sistema

Instalación y manejo de software en Linux

12

Análisis de los parámetros de red

13

Administración de paquetes acorde a la distribución

14

Manejo de paquetes en sistemas basados en Debian

15

Administración de software con YUM y RPM para CentOS

16

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

Administración de usuarios

17

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

18

Creando y manejando cuentas de usuario en el sistema operativo

19

Entendiendo la membresía de los grupos

20

Usando PAM para el control de acceso de usuarios

Servicios en el sistema operativo

21

Autenticación de clientes y servidores sobre SSH

22

Configurando DNS con bind

23

Arranque, detención y recarga de servicios

24

NGINX y Apache en Ubuntu server

25

Instalación y configuración de NGINX

26

¿Qué es NGINX Amplify?

27

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

28

Monitoreo de MySQL con Nagios

29

Configuración de Nagios

30

Los logs, nuestros mejores amigos

31

Otros servicios de logs

Bash scripting

32

Las bases de bash

33

Las variables y su entorno de ejecución

34

Automatizando tareas desde la terminal

35

Automatizando la copia de seguridad

36

Crontab

Asegurando tu servidor

37

Entendiendo la gestión de vulnerabilidades

38

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

39

El firewall y sus reglas

40

Escaneo de puertos con NMAP y NIKTO desde Kali Linux

41

Lynis: Herramientas de auditoria de seguridad en Linux

Proyecto

42

Configuración de Node.js en un ambiente productivo

43

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

Bonus: Linux en Azure

44

Aprende sobre Linux en Azure

45

Despliegue de una aplicación web MEAN

46

Crea una máquina virtual en la nube de Azure

Conclusiones

47

Lo que aprendiste sobre servidores linux

No tienes acceso a esta clase

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

Automatizando tareas desde la terminal

34/47
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 46

Preguntas 7

Ordenar por:

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

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

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.

Se debió dar el curso de bash y regex primero

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"
}

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.

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

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.

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

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”

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 !!!

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 esta clase sino entendí nada 😦

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.

No pues esto está en chino antiguo 😦

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"
}

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.

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.

¯_(ツ)_/¯

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.

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

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

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 😃

Para el comando set -e, me gusto este video, es ingles pero tiene subtitulos y la explicacion es clara https://www.youtube.com/watch?v=aqvc9kYnz0U

Veo que muchas veces se quejan de que el profesor no esplica palabra por palabra todo lo que hace, para los que venimos aprendiendo linux sabemos lo dificil que es conseguir contenido en español y de calidad que de verdad te sume a un trabajo real(este curso lo hace) ademas de que este curso no esta marcado como un nivel basico por lo que se supone que se tiene un conocimiento basico de bash y el resto de los temas, si bien entiendo qeu hay temas que se pueden preparar mejor o lecturas pesadas linux tambien se prende asi, adjunto un canal que en lo personal me sumo bastamte para linux pero en ingles https://www.youtube.com/c/NetworkChuck

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.