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 鈥淭he 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 鈥渓a 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 鈥渁lt 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 鈥淓RROR鈥 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 鈥渘ativo鈥 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.