Administrador de Linux: secuencias de comandos de Shell

Introducción a Bash Shell

Al igual que las versiones de GNU Linux, los shells vienen en muchas variedades y varían en compatibilidad. El shell predeterminado en CentOS se conoce como Bash o Bourne Again Shell. Bash shell es una versión moderna y modificada de Bourne Shell desarrollada por Stephen Bourne. Bash fue el reemplazo directo del Thompson Shell original en el sistema operativo Unix desarrollado en Bell Labs por Ken Thompson y Dennis Ritchie (Stephen Bourne también fue empleado de Bell Labs)

Todo el mundo tiene un caparazón favorito y cada uno tiene sus puntos fuertes y sus dificultades. Pero en su mayor parte, Bash será el shell predeterminado en todas las distribuciones de Linux y el más comúnmente disponible. Con experiencia, todos querrán explorar y usar un caparazón que sea mejor para ellos. Sin embargo, al mismo tiempo, todos también querrán dominar el shell Bash.

Otros shells de Linux incluyen: Tcsh, Csh, Ksh, Zsh y Fish.

Desarrollar habilidades para usar cualquier shell de Linux a un nivel experto es extremadamente importante para un administrador de CentOS. Como mencionamos anteriormente, a diferencia de Windows, Linux en su esencia es un sistema operativo de línea de comandos. Un shell es simplemente una interfaz de usuario que permite a un administrador (o usuario) emitir comandos al sistema operativo. Si un administrador de sistema Linux fuera un piloto de una aerolínea, usar el caparazón sería similar a sacar el avión del piloto automático y agarrar los controles manuales para un vuelo más maniobrable.

Un shell de Linux, como Bash, se conoce en términos de informática como un Command Line Interpreter. Microsoft Windows también tiene dos intérpretes de línea de comandos llamados DOS (que no debe confundirse con el sistema operativo DOS original) y PowerShell.

La mayoría de las carcasas modernas como Bash proporcionan constructspermitiendo scripts de shell más complejos para automatizar tanto tareas comunes como complejas.

Las construcciones incluyen:

  • Control de flujo de scripts (ifthen y else)
  • Operaciones de comparación lógica (mayor que, menor que, igualdad)
  • Loops
  • Variables
  • Parámetros que definen la operación (similar a interruptores con comandos)

Uso de secuencias de comandos de Shell frente a lenguaje de secuencias de comandos

A menudo, cuando piensan en realizar una tarea, los administradores se preguntan: ¿Debería usar un script de shell o un lenguaje de script como Perl, Ruby o Python?

Aquí no hay una regla establecida. Solo existen diferencias típicas entre shells y lenguajes de scripting.

Cáscara

Shell permite el uso de comandos de Linux como sed , grep , tee , cat y todas las demás utilidades basadas en la línea de comandos en el sistema operativo Linux. De hecho, casi cualquier utilidad de línea de comandos de Linux se puede programar en su shell.

Un gran ejemplo de uso de un shell sería un script rápido para verificar una lista de hosts para la resolución de DNS.

Nuestro sencillo script Bash para comprobar los nombres DNS -

#!/bin/bash 
for name in $(cat $1);
   do 
      host $name.$2 | grep "has address" 
   done 
exit

pequeña lista de palabras para probar la resolución DNS en -

dns 
www 
test 
dev 
mail 
rdp 
remote

Salida contra el dominio google.com -

[rdc@centos ~]$  ./dns-check.sh dns-names.txt google.com
-doing dns
dns.google.com has address 172.217.6.46
-doing www
www.google.com has address 172.217.6.36
-doing test
-doing dev
-doing mail
googlemail.l.google.com has address 172.217.6.37
-doing rdp
-doing remote

[rdc@centos ~]$

Aprovechando los comandos simples de Linux en nuestro shell, pudimos hacer un script simple de 5 líneas para auditar los nombres DNS de una lista de palabras. Esto habría llevado un tiempo considerable en Perl, Python o Ruby incluso cuando se usaba una biblioteca DNS bien implementada.

Lenguaje de escritura

Un lenguaje de scripting dará más control fuera del shell. El script Bash anterior usó un envoltorio alrededor del comando del host de Linux . ¿Qué pasaría si quisiéramos hacer más y crear nuestra propia aplicación como host para interactuar fuera del shell? Aquí es donde usaríamos un lenguaje de secuencias de comandos.

Además, con un lenguaje de secuencias de comandos altamente mantenido, sabemos que nuestras acciones funcionarán en diferentes sistemas en su mayor parte. Python 3.5, por ejemplo, funcionará en cualquier otro sistema que ejecute Python 3.5 con las mismas bibliotecas instaladas. No es así, si queremos ejecutar nuestro script BASH tanto en Linux como en HP-UX.

A veces, las líneas entre un lenguaje de secuencias de comandos y un shell potente se pueden difuminar. Es posible automatizar las tareas de administración de CentOS Linux con Python, Perl o Ruby. Hacerlo es realmente un lugar común. Además, los desarrolladores adinerados de scripts de shell han creado un demonio de servidor web simple, pero funcional, en Bash.

Con experiencia en lenguajes de programación y automatización de tareas en shells, un administrador de CentOS podrá determinar rápidamente por dónde empezar cuando necesite resolver un problema. Es bastante común comenzar un proyecto con un script de shell. Luego, avance a un lenguaje de secuencias de comandos (o compilado) a medida que el proyecto se vuelve más complejo.

Además, está bien utilizar un lenguaje de script y un script de shell para diferentes partes de un proyecto. Un ejemplo podría ser un script de Perl para raspar un sitio web. Luego, use un script de shell para analizar y formatear con sed , awk y egrep . Finalmente, use un script PHP para insertar datos formateados en la base de datos MySQL usando una GUI web.

Con algo de teoría detrás de los shells, comencemos con los bloques de construcción básicos para automatizar tareas desde un shell Bash en CentOS.

Entrada Salida y Redirección

Procesando stdout a otro comando -

[rdc@centos ~]$ cat ~/output.txt | wc -l 
6039 
[rdc@centos ~]$

Arriba, hemos pasado cat'sstoud a wc para su procesamiento con el carácter de tubería . wc luego procesó la salida de cat , imprimiendo el recuento de líneas de output.txt en la terminal. Piense en el carácter de tubería como una "tubería" que pasa la salida de un comando, para ser procesada por el siguiente comando.

Los siguientes son los conceptos clave para recordar cuando se trata de la redirección de comandos:

Número Descriptor de archivo Personaje
0 entrada estándar <
1 salida estándar >
2 Error estándar
añadir stdout >>
asignar redirección Y
tubería stdout en stdin |

Introdujimos esto en el capítulo uno sin hablar mucho sobre redirección o asignación de redirección. Al abrir una terminal en Linux, su shell se ve como el destino predeterminado para:

  • entrada estándar <0
  • salida estándar> 1
  • error estándar 2

Veamos cómo funciona esto:

[rdc@centos ~]$ lsof -ap $BASHPID -d 0,1,2 
 COMMAND   PID   USER    **FD**   TYPE DEVICE   SIZE/OFF   NODE      NAME 
 bash    13684    rdc    **0u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **1u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **2u**   CHR  136,0      0t0     3      /dev/pts/0
 
[rdc@centos ~]$

/ dev / pts / 0 es nuestro pseudo terminal. CentOS Linux mira esto y piensa en nuestra aplicación de terminal abierta como una terminal real con el teclado y la pantalla conectados a través de una interfaz en serie. Sin embargo, como un hipervisor abstrae el hardware a un sistema operativo / dev / pts abstrae nuestro terminal a las aplicaciones.

Desde el comando lsof anterior , podemos ver bajo elFDcolumna que los tres descriptores de archivo están configurados en nuestro terminal virtual (0,1,2). Ahora podemos enviar comandos, ver la salida del comando, así como cualquier error asociado con el comando.

A continuación se muestran ejemplos de STDIN y STDOUT:

STDOUT

[root@centosLocal centos]# echo "I am coming from Standard output or STDOUT." >
output.txt && cat output.txt
I am coming from Standard output or STDOUT. 
[root@centosLocal centos]#

También es posible enviar stdout y stderr a archivos separados -

bash-3.2# find / -name passwd 1> good.txt 2> err.txt
bash-3.2# cat good.txt
/etc/pam.d/passwd
/etc/passwd
bash-3.2# cat err.txt 
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
bash-3.2#

Al buscar en todo el sistema de archivos, se encontraron dos errores. Cada uno se envió a un archivo separado para su posterior lectura, mientras que los resultados devueltos se colocaron en un archivo de texto separado.

Enviar stderr a un archivo de texto puede ser útil cuando se hacen cosas que generan una gran cantidad de datos en el terminal, como compilar aplicaciones. Esto permitirá la lectura de errores que podrían perderse del historial de retroceso del terminal.

Una nota al pasar STDOUT a un archivo de texto son las diferencias entre >> y >. El doble ">>" se agregará a un archivo, mientras que la forma singular golpeará el archivo y escribirá nuevos contenidos (por lo que se perderán todos los datos anteriores).

STDIN

[root@centosLocal centos]# cat < stdin.txt
Hello,
I am being read form Standard input, STDIN.

[root@centosLocal centos]#

En el comando anterior, el archivo de texto stdin.txt fue redirigido al comando cat que hizo eco de su contenido en STDOUT .

El carácter de tubería "|"

El carácter de tubería tomará la salida del primer comando, pasándola como una entrada al siguiente comando, permitiendo que el comando secundario realice operaciones en la salida.

Ahora, "canalicemos" la salida estándar de cat a otro comando:

[root@centosLocal centos]# cat output.txt | wc -l
2
[root@centosLocal centos]#

Arriba, wc realiza cálculos sobre la salida de cat que se pasó de la tubería. El comando de tubería es particularmente útil cuando se filtra la salida de grep o egrep -

[root@centosLocal centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l  
9000 
[root@centosLocal centos]#

En el comando anterior, pasamos cada número de 4 dígitos a wc desde un archivo de texto que contiene todos los números de 65535 pasados ​​a través de un filtro egrep .

Redirigir la salida con &

La salida se puede redirigir utilizando el &personaje. Si queremos dirigir la salida tanto STDOUT como STDERR, en el mismo archivo, se puede lograr de la siguiente manera:

[root@centosLocal centos]# find / -name passwd > out.txt 2>&1
[root@centosLocal centos]# cat out.txt  
find: /dev/fd/3: Not a directory 
find: /dev/fd/4: Not a directory 
/etc/passwd

[root@centosLocal centos]#

Redirigir usando el &El carácter funciona así: primero, la salida se redirige a out.txt . En segundo lugar, STDERR o el descriptor de archivo 2 se reasigna a la misma ubicación que STDOUT, en este caso out.txt .

La redirección es extremadamente útil y es útil al resolver problemas que surgen al manipular archivos de texto grandes, compilar código fuente, redirigir la salida en scripts de shell y emitir comandos complejos de Linux.

Si bien es potente, la redirección puede complicarse para los administradores de CentOS más nuevos. La práctica, la investigación y las preguntas ocasionales en un foro de Linux (como Stack Overflow Linux) ayudarán a resolver soluciones avanzadas.

Construcciones de caparazón de golpe

Ahora que tenemos una buena idea de cómo funciona el shell Bash , aprendamos algunas construcciones básicas, de uso común, para escribir scripts. En esta sección exploraremos:

  • Variables
  • Loops
  • Conditionals
  • Control de bucle
  • Leer y escribir en archivos
  • Operaciones matemáticas básicas

Sugerencias para la resolución de problemas de BASH

BASH puede ser un poco complicado en comparación con un lenguaje de programación dedicado. Algunas de las mayores dificultades en los scripts BASH se deben a que se escapan incorrectamente o no se escapan las operaciones del script que se pasan al shell. Si ha revisado un guión varias veces y no funciona como se esperaba, no se preocupe. Esto es común incluso entre quienes usan BASH para crear scripts complejos a diario.

Una búsqueda rápida en Google o registrarse en un foro de expertos de Linux para hacer una pregunta conducirá a una resolución rápida. Es muy probable que alguien se haya encontrado con el problema exacto y ya se haya resuelto.

Los scripts BASH son un gran método para crear rápidamente scripts potentes para todo, desde la automatización de tareas de administración hasta la creación de herramientas útiles. Convertirse en un desarrollador de guiones BASH de nivel experto requiere tiempo y práctica. Por lo tanto, use scripts BASH siempre que sea posible, es una gran herramienta para tener en su caja de herramientas de administración de CentOS.