Programación de scripts
Desarrolladores y administradores, es hora de simplificar su jornada laboral. Con esta práctica guía, utilicen scripts para resolver tediosos problemas de TI con menos esfuerzo y menos código. Aprenderán sobre los lenguajes de scripting más populares: Bash, PowerShell y Python. Dominarán técnicas importantes como trabajar con Linux, cmdlets, expresiones regulares, JSON, SSH, Git y mucho más. Utilicen scripts para automatizar diferentes escenarios, desde copias de seguridad y procesamiento de imágenes hasta la administración de máquinas virtuales. ¡Descubran lo que se puede hacer con solo 10 líneas de código!
- Aprenda a trabajar con lenguajes de programación como Bash, PowerShell y Python.
- Conozca su caja de herramientas de scripting: cmdlets, expresiones regulares, filtros, tuberías y API REST.
- Automatice tareas clave, como copias de seguridad, actualizaciones de bases de datos, procesamiento de imágenes y extracción de datos web.
Aprenderás sobre:
- Lenguajes de scripting:
Principiantes, obtengan el curso intensivo que necesitan sobre Bash (y su alternativa, Zsh), PowerShell y la sintaxis de Python para realizar tareas de scripting.
- Técnicas de scripting:
Aprenda a escribir scripts exitosos siguiendo las instrucciones de expertos y ejemplos prácticos. Utilice comandos para procesar archivos de texto, funciones para manejar archivos JSON y XML, cron para automatizar la ejecución de scripts, SSH para ejecutar código y mucho más.
- Ejemplos de scripts:
¡Vea el scripting en acción! Repase aplicaciones concretas del scripting: copia de seguridad de datos, procesamiento de imágenes, web scraping, API REST, mantenimiento de bases de datos, escenarios en la nube y administración de máquinas virtuales.
Aspectos Destacados:
- Bash y Zsh
- Caja de herramientas de Linux
- PowerShell y cmdlets
- Python y pip
- JSON, XML e INI
- SSH, VS Code y Git
- Automatización con cron
- Automatización de copias de seguridad
- Procesamiento de imágenes
- Web scraping
- Scripting en la nube
- Máquinas virtuales
Ver Tabla de Contenidos Completa
- Prefacio
- ¿Bash, PowerShell o Python?
- Acerca de este libro
- Herramientas de scripting e inteligencia artificial
- La programación como competencia básica para un trabajo eficiente en TI
- PARTE I Lenguajes de scripting
- 1 Scripting: hacer una sola cosa
- 1.1 ¿Qué significa «scripting»?
- 1.1.1 Scripting frente a programación
- 1.1.2 Lenguajes y código Glue
- 1.1.3 Haz una cosa y hazla bien
- 1.2 Lenguajes de scripting
- 1.2.1 Bash y Zsh
- 1.2.2 PowerShell
- 1.2.3 Python
- 1.2.4 Muchas similitudes, aún más diferencias
- 1.3 La agonía de elegir
- 2 Diez veces diez líneas
- 2.1 Corrector ortográfico Markdown (Bash)
- 2.2 Ordenar imágenes por fecha (PowerShell)
- 2.3 Conversión de un archivo JSON a formato XML (Python)
- 2.4 Copias de seguridad diarias del servidor (Bash)
- 2.5 Web scraping (Python)
- 2.6 Registro de datos meteorológicos (Python)
- 2.7 Limpieza de Microsoft Hyper-V (PowerShell)
- 2.8 Análisis estadístico de un archivo de registro (Bash)
- 2.9 Carga de archivos en la nube (PowerShell)
- 2.10 Clonación de máquinas virtuales (Bash)
- 3 Bash y Zsh
- 3.1 Terminal, Shell y Bash
- 3.1.1 Determinación del shell actual
- 3.2 Instalación
- 3.2.1 Uso de Bash en una máquina virtual
- 3.2.2 Subsistema de Windows para Linux
- 3.2.3 Git Bash
- 3.2.4 Docker
- 3.2.5 Configuración de Bash (/etc/profile y .bashrc)
- 3.3 Ejecutar comandos de manera interactiva
- 3.3.1 Manejo del terminal
- 3.3.2 Ayuda en línea
- 3.3.3 Referencia de comandos
- 3.4 Zsh como alternativa a Bash
- 3.4.1 Instalación
- 3.4.2 Configuración de Zsh (/etc/zshrc y .zshrc)
- 3.4.3 Oh My Zsh
- 3.5 El primer script Bash
- 3.5.1 Hash Bang (Shebang)
- 3.5.2 Variantes de Shebang
- 3.5.3 Hacer el script ejecutable (chmod +x)
- 3.5.4 ¡Hola, mundo!
- 3.5.5 Reglas sintácticas elementales
- 3.5.6 Un ejemplo «real»: script de copia de seguridad
- 3.5.7 Ejecutar scripts sin ./
- 3.6 Ejecutar comandos
- 3.6.1 Ejecución en serie
- 3.6.2 Ejecución condicional de comandos
- 3.6.3 Ejecutar comandos en segundo plano
- 3.6.4 Ejecutar comandos en una subshell
- 3.7 Entrada estándar y salida estándar
- 3.7.1 Redireccionamiento de entrada y salida
- 3.7.2 El operador Pipe
- 3.7.3 Redirigir y mostrar salidas al mismo tiempo
- 3.8 Globbing, extensión de llaves y manejo de nombres de archivos y directorios
- 3.8.1 Globbing recursivo
- 3.8.2 Acceso a directorios importantes
- 3.8.3 Extensión de la férula
- 3.8.4 Nombres de archivos y directorios con espacios
- 3.9 Variables
- 3.9.1 Inicialización y eliminación de variables
- 3.9.2 Declaración de variables
- 3.9.3 Realizar cálculos en Bash
- 3.9.4 Matrices
- 3.9.5 Variables predefinidas
- 3.9.6 Variables de entorno
- 3.10 Cuerdas
- 3.10.1 Comillas simples frente a comillas dobles
- 3.10.2 Salida de cadenas (echo)
- 3.10.3 Colores
- 3.10.4 Introducción o lectura de cadenas de caracteres (lectura)
- 3.10.5 Mecanismos de sustitución y expansión
- 3.10.6 Sustitución de parámetros
- 3.10.7 Heredocs y Herestrings
- 3.10.8 La barra invertida
- 3.11 Sucursales
- 3.11.1 si se utiliza la notación corta con && o ||
- 3.11.2 Condiciones
- 3.11.3 Ramas con mayúsculas
- 3.11.4 Análisis de parámetros mediante caso
- 3.12 Bucles
- 3.12.1 Procesamiento de nombres de archivo con espacios
- 3.12.2 mientras y hasta que
- 3.12.3 Bucles sobre archivos de texto
- 3.13 Funciones
- 3.14 Protección contra errores
- 3.14.1 Detección de errores
- 3.14.2 Cancelación en caso de errores
- 3.14.3 salida
- 3.14.4 Respuesta a señales (trampa)
- 3.14.5 Tiempo de espera
- 4 PowerShell
- 4.1 Instalación
- 4.1.1 Instalación en Linux
- 4.1.2 Instalación en macOS
- 4.1.3 Limitaciones de PowerShell en Windows frente a Linux/macOS
- 4.1.4 Configuración
- 4.2 Terminal de Windows
- 4.2.1 Configuración
- 4.2.2 Funcionamiento
- 4.3 Llamada a cmdlets y funciones
- 4.3.1 cmdlets
- 4.3.2 La terminología verbo-sustantivo
- 4.3.3 Alias
- 4.3.4 Parámetros y opciones
- 4.3.5 Splatting
- 4.3.6 Funciones
- 4.3.7 Ejecución de comandos convencionales
- 4.3.8 Ayuda en línea
- 4.4 Combinación de comandos
- 4.4.1 Cadenas de mando
- 4.4.2 Declaraciones multilínea
- 4.4.3 Manejo de caracteres especiales
- 4.5 El primer guion
- 4.5.1 ¡Hola, mundo!
- 4.5.2 Problemas con la política de ejecución
- 4.5.3 Configuración de un directorio de scripts personalizado
- 4.5.4 Ejecución de scripts en Linux y macOS
- 4.5.5 Ejemplo: Limpieza del directorio de descargas
- 4.5.6 Diferencias entre las versiones de PowerShell
- 4.6 Variables, cadenas y objetos
- 4.6.1 Tipos de datos
- 4.6.2 Cálculo y comparación
- 4.6.3 Cuerdas
- 4.6.4 Sustitución de comandos
- 4.6.5 Objetos
- 4.6.6 Montaje de objetos personalizados
- 4.6.7 Variables predefinidas
- 4.6.8 Variables de entorno
- 4.7 Matrices y tablas hash
- 4.7.1 Creación y procesamiento de matrices personalizadas
- 4.7.2 Tablas hash
- 4.8 Redirección de salida
- 4.8.1 Corrientes
- 4.8.2 Redirección de salida
- 4.8.3 Duplicación de salida (objeto Tee)
- 4.8.4 (No) dar formato a la salida
- 4.8.5 Sin redirección de entrada
- 4.9 Bucles
- 4.9.1 ForEach-Object
- 4.9.2 for, while, do-while y do-until
- 4.10 Sucursales
- 4.10.1 Distinciones de casos utilizando switch
- 4.11 Funciones y parámetros
- 4.11.1 Resultados de la función
- 4.11.2 devolución
- 4.11.3 Parámetros
- 4.11.4 Llamada a funciones
- 4.11.5 Procesamiento de la entrada estándar
- 4.11.6 Variantes sintácticas
- 4.12 Módulos
- 4.12.1 Directorios de módulos
- 4.12.2 Módulos para expertos
- 4.13 Protección contra errores
- 4.13.1 Establecer modo estricto
- 4.13.2 Abortar scripts en caso de error
- 4.13.3 Separación de los mensajes de error del resto de la salida
- 4.13.4 Protección contra errores mediante try/catch
- 4.13.5 Finalización prematura de la ejecución del script (Salir)
- 5 Python
- 5.1 Instalación de Python
- 5.1.1 Ventanas
- 5.1.2 macOS
- 5.2 Familiarizarse con Python en una ventana de terminal
- 5.3 Programación de scripts personalizados
- 5.4 Reglas sintácticas elementales
- 5.4.1 Elementos de bloque
- 5.4.2 Comentarios
- 5.5 Números
- 5.5.1 Flotadores
- 5.5.2 Números aleatorios
- 5.6 Cuerdas
- 5.6.1 Cadenas sin procesar
- 5.6.2 Procesamiento de cadenas
- 5.6.3 Corte en rodajas
- 5.6.4 Impresión y entrada
- 5.6.5 Formateo de salidas
- 5.7 Listas
- 5.7.1 Comprensión de listas
- 5.7.2 Mapa y filtro
- 5.8 Tuplas, conjuntos y diccionarios
- 5.8.1 Conjuntos
- 5.8.2 Diccionarios
- 5.9 Variables
- 5.9.1 Asignaciones
- 5.9.2 Tipos de datos
- 5.9.3 ¿Mutable o inmutable?
- 5.10 Operadores
- 5.10.1 Combinación de tareas y evaluación
- 5.11 Ramas (si)
- 5.11.1 Condiciones
- 5.11.2 Notación abreviada con if
- 5.12 Bucles (for y while)
- 5.12.1 break, continue y else
- 5.12.2 Bucles sobre rangos numéricos (range)
- 5.12.3 Bucles sobre los caracteres de una cadena
- 5.12.4 Bucles sobre listas, tuplas y conjuntos
- 5.12.5 Bucles sobre diccionarios
- 5.12.6 Bucles sobre los parámetros de un script
- 5.12.7 Globbing en Windows
- 5.12.8 Bucles sobre las líneas de un archivo de texto
- 5.12.9 Bucles sobre todos los archivos de un directorio
- 5.13 Funciones
- 5.13.1 Variables globales y locales
- 5.13.2 Parámetros
- 5.13.3 Parámetros opcionales
- 5.13.4 Número variable de parámetros
- 5.13.5 Funciones lambda
- 5.14 Procesamiento de archivos de texto
- 5.14.1 Ejemplo: Análisis de un archivo CSV
- 5.14.2 Ejemplo: Creación de comandos SQL
- 5.15 Protección contra errores
- 5.16 Funciones del sistema
- 5.16.1 Acceso a los parámetros del programa
- 5.16.2 Acceso a la entrada estándar y la salida estándar
- 5.16.3 Salir de un programa
- 5.16.4 Ejecución de comandos de Linux
- 5.16.5 Resultados del procesamiento
- 5.16.6 Ejecutar comandos a través del shell
- 5.16.7 Error durante una llamada de comando
- 5.16.8 Espera (suspensión)
- 5.17 Módulos
- 5.17.1 Importar
- 5.17.2 Distribución de scripts personalizados en varios archivos
- 5.18 Instalación de módulos adicionales con pip
- 5.18.1 Instalación de pip
- 5.18.2 Aplicación de pip
- 5.18.3 Problemas con pip en Windows
- 5.18.4 Problemas con pip en Linux
- 5.18.5 requisitos.txt
- 5.18.6 pipenv
- PARTE II Técnicas y herramientas de trabajo
- 6 Caja de herramientas de Linux
- 6.1 Directorios y archivos
- 6.1.1 Listar, copiar, mover y eliminar archivos
- 6.2 Búsqueda de archivos
- 6.2.1 Búsqueda de texto con grep
- 6.3 Comprimir y archivar archivos
- 6.3.1 Archivado de archivos con tar
- 6.3.2 Archivos ZIP
- 6.4 Uso de privilegios de root
- 6.4.1 Privilegios de sudo solo para cuentas seleccionadas
- 6.4.2 Problemas con la redirección de salida
- 6.4.3 Derechos de acceso
- 6.4.4 Gestión de procesos
- 6.4.5 Terminación de procesos
- 6.4.6 Procesos en segundo plano y servicios del sistema
- 6.4.7 Archivos de registro
- 6.4.8 Determinación de la memoria libre
- 6.4.9 Determinación de otra información del sistema
- 6.5 Instalación del software
- 6.5.1 Actualización del software
- 6.5.2 Instalación de paquetes adicionales
- 6.6 Otros comandos
- 7 cmdlets para PowerShell
- 7.1 Directorios y archivos
- 7.1.1 Listado, copia, traslado y eliminación de archivos
- 7.1.2 Lectura y redacción de textos
- 7.1.3 Entrada y salida de texto
- 7.2 Búsqueda de archivos
- 7.2.1 Búsqueda en archivos de texto
- 7.2.2 Texto frente a objetos
- 7.3 Comprimir y archivar archivos
- 7.3.1 Comprimir los resultados de búsqueda
- 7.4 Gestión de procesos
- 7.4.1 Ejecución de otros scripts de PowerShell
- 7.4.2 Ejecutar comandos en segundo plano
- 7.4.3 Administración de servicios
- 7.4.4 Trabajar en otras computadoras
- 7.5 Base de datos de registro e información del sistema
- 7.5.1 Determinación de la información del sistema
- 7.5.2 Evaluación del sistema de registro
- 7.6 Procesamiento de resultados de cmdlets
- 7.6.1 Select-Object y Sort-Object
- 7.6.2 Where-Object
- 7.6.3 Objeto de grupo
- 7.6.4 ForEach-Item
- 7.6.5 Objeto de medición
- 7.6.6 Formateo y exportación de resultados de cmdlets
- 7.7 Otros cmdlets
- 7.8 Instalación de módulos adicionales
- 7.8.1 Listado de módulos, comandos y fuentes de paquetes
- 7.8.2 NuGet y winget
- 7.9 Alias estándar
- 8 Análisis de textos con filtros y tuberías
- 8.1 grep, sort, cut y uniq
- 8.1.1 grep
- 8.1.2 wc
- 8.1.3 corte
- 8.1.4 ordenar
- 8.1.5 Cabeza y cola
- 8.1.6 uniq
- 8.1.7 tr
- 8.1.8 awk y sed
- 8.2 Ejemplo: Análisis de datos estadísticos
- 8.2.1 Extracción de datos mediante script
- 8.3 Ejemplo: análisis de ping
- 8.3.1 Llamada ping mediante script
- 8.4 Ejemplo: Análisis de registros de Apache
- 8.4.1 Extracción de direcciones IP
- 8.4.2 Identificación de páginas populares
- 8.5 Archivos CSV
- 8.5.1 Procesamiento de archivos CSV con Python
- 8.5.2 Procesamiento de archivos CSV en PowerShell
- 9 Expresiones regulares
- 9.1 Reglas sintácticas para expresiones regulares
- 9.2 Grupos y alternativas
- 9.2.1 Cuantificadores
- 9.2.2 Sobre la codicia (codicioso frente a perezoso)
- 9.2.3 Alfa y Omega
- 9.2.4 Páginas de ejercicios y hojas de referencia rápida
- 9.2.5 Ejemplo: Reconocer una fecha
- 9.2.6 Ejemplo: reconocimiento de direcciones IPv4
- 9.2.7 Ejemplo: reconocimiento de direcciones de correo electrónico
- 9.3 Expresiones regulares en Bash (grep, sed)
- 9.3.1 Operador de comparación Bash para expresiones regulares
- 9.3.2 Filtrar texto con grep
- 9.3.3 El editor de flujo «sed»
- 9.3.4 Buscar y reemplazar con sed
- 9.3.5 Ejemplo de sed: manipulación de rutas de archivos de imagen
- 9.4 Expresiones regulares en PowerShell
- 9.4.1 Los operadores de coincidencia y sustitución
- 9.4.2 Seleccionar cadena
- 9.4.3 Ejemplo: validación de entradas
- 9.4.4 Ejemplo: Lista de figuras
- 9.5 Expresiones regulares en Python (módulo re)
- 9.5.1 Ejemplo: Verificación de una dirección MAC
- 9.5.2 Ejemplo: Anonimizar un archivo de registro
- 10 JSON, XML e INI
- 10.1 JSON en PowerShell
- 10.1.1 Ejemplo: Guardar entradas del registro de eventos en formato JSON
- 10.1.2 Ejemplo: Análisis de consultas de dominio
- 10.1.3 Ejemplo: Conversión entre CSV y JSON
- 10.2 JSON y Python
- 10.2.1 Ejemplo: Recopilación de cumpleaños
- 10.2.2 Ejemplo: Determinación de días festivos
- 10.3 JSON en Bash
- 10.3.1 Visualización interactiva de archivos JSON con fx
- 10.4 XML en PowerShell
- 10.4.1 Tipo de datos XML
- 10.4.2 Seleccionar XML
- 10.4.3 ConvertTo-Xml, Export-Clixml e Import-Clixml
- 10.5 XML y Python
- 10.5.1 Ejemplo: Creación de un diccionario para códigos de país
- 10.5.2 Ejemplo: análisis de una fuente RSS
- 10.5.3 Ejemplo: Extracción de direcciones MAC de archivos de máquinas virtuales
- 10.6 XML en Bash
- 10.6.1 xmllint
- 10.6.2 XMLStarlet
- 10.7 Archivos INI
- 10.7.1 Python
- 10.7.2 PowerShell
- 10.7.3 Bash
- 11 Ejecutar scripts automáticamente
- 11.1 cron
- 11.1.1 /etc/crontab
- 11.1.2 Archivos crontab personales
- 11.1.3 Directorios por hora, diarios, semanales y mensuales
- 11.1.4 Alternativas a cron
- 11.1.5 Inicio automático de trabajos en macOS
- 11.2 Ejemplo: Monitoreo del servidor web
- 11.2.1 Pruebas y solución de problemas
- 11.2.2 Monitoreo real
- 11.3 Programador de tareas de Microsoft Windows
- 11.3.1 Solución de problemas
- 11.3.2 Configuración de tareas mediante cmdlets
- 11.4 Ejemplo: Guardar tipos de cambio
- 11.5 Seguimiento de los cambios en el sistema de archivos
- 11.5.1 inotify
- 11.5.2 Alternativas a inotify
- 12 SSH
- 12.1 Instalación del cliente y el servidor SSH
- 12.1.1 Linux
- 12.1.2 macOS
- 12.1.3 Ventanas
- 12.1.4 Uso de un editor en una sesión SSH
- 12.1.5 Protección de un servidor SSH
- 12.2 Trabajar con SSH
- 12.2.1 Verificación del anfitrión
- 12.2.2 Posibles problemas y sus causas
- 12.2.3 Ejecutar comandos de Linux y macOS
- 12.2.4 Ejecutar comandos de Windows
- 12.2.5 SSH Remoting en PowerShell
- 12.3 scp y rsync
- 12.3.1 Copiar elemento con SSH Remoting
- 12.3.2 rsync
- 12.4 Autenticación SSH con claves
- 12.4.1 Generación de un par de claves
- 12.4.2 Almacenamiento del componente público de la clave en el servidor (macOS y Linux)
- 12.4.3 Almacenamiento del componente público de la clave en el servidor (Windows)
- 12.5 Ejemplo: Subir imágenes a un servidor web Linux
- 12.5.1 Medidas preparatorias
- 12.5.2 Script Bash
- 12.5.3 Script de PowerShell
- 12.6 Ejemplo: Análisis de máquinas virtuales
- 13 Código de Visual Studio
- 13.1 Introducción
- 13.1.1 Comparación entre VS Code, VSCodium y Visual Studio
- 13.1.2 ¡Piensa en términos de directorios, no de archivos!
- 13.2 Extensiones de VS Code específicas para cada lenguaje
- 13.2.1 Extensión PowerShell
- 13.2.2 Extensión Python
- 13.2.3 Extensiones Bash/Shell
- 13.3 Remoto: extensión SSH
- 13.3.1 Aplicación del control remoto: extensión SSH
- 13.3.2 Limitaciones
- 14 Git
- 14.1 Curso intensivo de Git
- 14.1.1 Tareas de preparación
- 14.1.2 El primer repositorio
- 14.1.3 El primer compromiso
- 14.1.4 Compromisos adicionales
- 14.1.5 Configuración del repositorio en una segunda computadora
- 14.1.6 Estado de Git
- 14.1.7 Excluir archivos de Git (.gitignore)
- 14.1.8 Transferencia de código existente a un nuevo repositorio
- 14.2 Manejo correcto de la configuración y las contraseñas
- 14.2.1 ¿Cuál es el mejor método?
- 14.2.2 Ejemplo
- 14.3 Automatización de Git
- 14.3.1 Controlar GitHub de forma remota con gh
- 14.4 Ganchos de Git
- 14.4.1 Ejemplo: Detectar archivos sin versionar antes de la confirmación
- PARTE III Aplicaciones y ejemplos
- 15 copias de seguridad
- 15.1 Sincronización de directorios con almacenamiento externo
- 15.1.1 Script de PowerShell con robocopy
- 15.1.2 Ideas para mejorar
- 15.1.3 Script Bash con rsync
- 15.2 Copia de seguridad de WordPress
- 15.3 Copia de seguridad de SQL Server
- 15.3.1 Copia de seguridad y compresión de todas las bases de datos mediante script
- 16 Procesamiento de imágenes
- 16.1 Manipulación de archivos de imagen
- 16.1.1 Instalación de ImageMagick
- 16.1.2 Probando ImageMagick
- 16.1.3 Ejemplo: convert2eps (variante Bash)
- 16.1.4 Ejemplo: convert2eps (variante de PowerShell)
- 16.2 Ordenar fotos por fecha de captura
- 16.2.1 Instalación y prueba de ExifTool
- 16.2.2 Ejemplo de Bash
- 16.2.3 Ejemplo de PowerShell
- 16.3 Conversión de metadatos Exif a comandos SQL
- 16.3.1 PyExifTool
- 16.3.2 EXIF2SQL
- 16.3.3 Opciones de mejora
- 17 Web Scraping
- 17.1 Limitaciones
- 17.2 Web scraping, rastreo web y minería de datos
- 17.3 Descarga de sitios web con wget
- 17.3.1 Ejemplo 1: Descarga de imágenes vinculadas directamente
- 17.3.2 Ejemplo 2: Descarga de todos los archivos PDF vinculados en el sitio web
- 17.3.3 Ejemplo 3: Creación de una copia local del sitio web
- 17.4 Extracción de datos web con expresiones regulares
- 17.5 Web scraping con Beautiful Soup
- 17.5.1 Beautiful Soup y solicitudes
- 17.5.2 ¡Hola, Beautiful Soup!
- 17.5.3 Ejemplo: Determinación de una lista de los títulos más vendidos de la editorial Rheinwerk
- 17.6 Web scraping con Requests-HTML
- 17.6.1 Ejemplo: Análisis del estado de GitHub
- 17.7 Extracción de datos web con PowerShell
- 18 Uso de API REST
- 18.1 Herramientas
- 18.2 API de muestra para probar
- 18.3 Implementación de API REST personalizadas
- 18.4 curl y wget
- 18.4.1 rizo
- 18.4.2 wget
- 18.4.3 Uso de API REST en scripts Bash
- 18.5 Uso de API REST en PowerShell
- 18.6 Ejemplo: Determinación del clima actual
- 18.7 Uso de API REST en Python
- 18.8 Ejemplo: Determinación de los precios de la electricidad y representación gráfica de los mismos
- 18.8.1 API de aWATTar
- 18.8.2 Análisis de los datos
- 18.8.3 Matplotlib
- 18.8.4 Control del consumo de energía
- 19 Bases de datos
- 19.1 Actualización y mantenimiento de bases de datos
- 19.1.1 PowerShell y sqlcmd
- 19.2 Creación de una nueva cuenta de cliente
- 19.2.1 Datos de la cuenta
- 19.2.2 Estructura del script
- 19.3 Almacenamiento de metadatos Exif en una base de datos
- 19.3.1 PyMySQL
- 19.3.2 Guardar metadatos Exif
- 19.4 Importación de datos JSON a una tabla
- 20 Programación en la nube
- 20.1 CLI de AWS
- 20.1.1 Instalación en Linux y macOS
- 20.1.2 Configuración
- 20.1.3 Primeros pasos
- 20.1.4 Cifrado de archivos
- 20.2 Ejemplo: carga de archivos de copia de seguridad cifrados en la nube
- 20.3 Módulo PowerShell de AWS
- 20.3.1 Primeros pasos
- 20.3.2 Copia de archivos
- 20.4 Ejemplo: Descarga de archivos grandes desde un sitio web a la nube
- 20.4.1 Preparativos
- 20.4.2 Script
- 20.4.3 Limitaciones
- 21 máquinas virtuales
- 21.1 Configuración y ejecución de máquinas virtuales (KVM)
- 21.1.1 Clonación de máquinas virtuales
- 21.1.2 Inicio y apagado de máquinas virtuales
- 21.1.3 Ejecución de scripts en varias máquinas virtuales
- 21.2 Automatización de la configuración de red (KVM)
- 21.3 Control de Hyper-V
- 21.3.1 Clonación de máquinas virtuales
- El autor
- Índice
Scripting
Developers and admins, it’s time to simplify your workday. With this practical guide, use scripting to solve tedious IT problems with less effort and less code! Learn about popular scripting languages: Bash, PowerShell, and Python. Master important techniques such as working with Linux, cmdlets, regular expressions, JSON, SSH, Git, and more. Use scripts to automate different scenarios, from backups and image processing to virtual machine management. Discover what’s possible with only 10 lines of code!
- Learn to work with scripting languages such as Bash, PowerShell, and Python
- Get to know your scripting toolbox: cmdlets, regular expressions, filters, pipes, and REST APIs
- Automate key tasks, including backups, database updates, image processing, and web scraping
You'll learn about:
- Scripting Languages:
Beginners, get the crash course you need in Bash (and its alternative, Zsh), PowerShell, and Python syntax to perform scripting tasks.
- Scripting Techniques:
Learn to write successful scripts by following expert guidance and practical examples. Use commands for processing text files, functions for handling JSON and XML files, cron for automating script execution, SSH for running code, and more.
- Scripting Examples:
See scripting in action! Walk through concrete applications of scripting: data backup, image processing, web scraping, REST APIs, database maintenance, cloud scenarios, and virtual machine administration.
Key Highlights:
- Bash and Zsh
- Linux toolbox
- PowerShell and cmdlets
- Python and pip
- JSON, XML, and INI
- SSH, VS Code, and Git
- Automation with cron
- Backup automation
- Image processing
- Web scraping
- Cloud scripting
- Virtual machines
View Full Table of Contents
- Preface
- Bash, PowerShell, or Python?
- About This Book
- Scripting and AI Tools
- Scripting as a Core Competence for Efficient IT Work
- PART I Scripting Languages
- 1 Scripting: Doing One Thing
- 1.1 What Does Scripting Mean?
- 1.1.1 Scripting versus Programming
- 1.1.2 Glue Languages and Glue Code
- 1.1.3 Do One Thing and Do It Well
- 1.2 Scripting Languages
- 1.2.1 Bash and Zsh
- 1.2.2 PowerShell
- 1.2.3 Python
- 1.2.4 Many Similarities, Even More Differences
- 1.3 The Agony of Choice
- 2 Ten Times Ten Lines
- 2.1 Markdown Spell Checker (Bash)
- 2.2 Sorting Images by Date (PowerShell)
- 2.3 Converting a JSON File to XML Format (Python)
- 2.4 Daily Server Backups (Bash)
- 2.5 Web Scraping (Python)
- 2.6 Logging Weather Data (Python)
- 2.7 Microsoft Hyper-V Cleanup (PowerShell)
- 2.8 Statistical Analysis of a Logging File (Bash)
- 2.9 Uploading Files to the Cloud (PowerShell)
- 2.10 Cloning Virtual Machines (Bash)
- 3 Bash and Zsh
- 3.1 Terminal, Shell, and Bash
- 3.1.1 Determining the Current Shell
- 3.2 Installation
- 3.2.1 Using Bash in a Virtual Machine
- 3.2.2 Windows Subsystem for Linux
- 3.2.3 Git Bash
- 3.2.4 Docker
- 3.2.5 Bash Configuration (/etc/profile and .bashrc)
- 3.3 Running Commands Interactively
- 3.3.1 Operating the Terminal
- 3.3.2 Online Help
- 3.3.3 Command Reference
- 3.4 Zsh as an Alternative to Bash
- 3.4.1 Installation
- 3.4.2 Zsh Configuration (/etc/zshrc and .zshrc)
- 3.4.3 Oh My Zsh
- 3.5 The First Bash Script
- 3.5.1 Hash Bang (Shebang)
- 3.5.2 Shebang Variants
- 3.5.3 Making the Script Executable (chmod +x)
- 3.5.4 Hello, World!
- 3.5.5 Elementary Syntax Rules
- 3.5.6 A “Real” Example: Backup Script
- 3.5.7 Running Scripts without ./
- 3.6 Running Commands
- 3.6.1 Serial Execution
- 3.6.2 Conditional Command Execution
- 3.6.3 Running Commands in the Background
- 3.6.4 Running Commands in a Subshell
- 3.7 Standard Input and Standard Output
- 3.7.1 Redirecting Input and Output
- 3.7.2 The Pipe Operator
- 3.7.3 Redirecting and Displaying Outputs at the Same Time
- 3.8 Globbing, Brace Extension, and Handling File and Directory Names
- 3.8.1 Recursive Globbing
- 3.8.2 Access to Important Directories
- 3.8.3 Brace Extension
- 3.8.4 Filenames and Directory Names with Spaces
- 3.9 Variables
- 3.9.1 Initializing and Deleting Variables
- 3.9.2 Declaring Variables
- 3.9.3 Performing Calculations in Bash
- 3.9.4 Arrays
- 3.9.5 Predefined Variables
- 3.9.6 Environment Variables
- 3.10 Strings
- 3.10.1 Single versus Double Quotation Marks
- 3.10.2 Outputting Strings (echo)
- 3.10.3 Colors
- 3.10.4 Entering or Reading Character Strings (read)
- 3.10.5 Substitution and Expansion Mechanisms
- 3.10.6 Parameter Substitution
- 3.10.7 Heredocs and Herestrings
- 3.10.8 The Backslash
- 3.11 Branches
- 3.11.1 if Short Notation with && or ||
- 3.11.2 Conditions
- 3.11.3 Branches with case
- 3.11.4 Parameter Analysis via case
- 3.12 Loops
- 3.12.1 Processing Filenames with Spaces
- 3.12.2 while and until
- 3.12.3 Loops over Text Files
- 3.13 Functions
- 3.14 Error Protection
- 3.14.1 Detecting Errors
- 3.14.2 Canceling in Case of Errors
- 3.14.3 exit
- 3.14.4 Responding to Signals (trap)
- 3.14.5 Timeout
- 4 PowerShell
- 4.1 Installation
- 4.1.1 Installation on Linux
- 4.1.2 Installation on macOS
- 4.1.3 Limitations of PowerShell on Windows versus Linux/macOS
- 4.1.4 Configuration
- 4.2 Windows Terminal
- 4.2.1 Configuration
- 4.2.2 Operation
- 4.3 Calling cmdlets and Functions
- 4.3.1 cmdlets
- 4.3.2 The Verb-Noun Terminology
- 4.3.3 Aliases
- 4.3.4 Parameters and Options
- 4.3.5 Splatting
- 4.3.6 Functions
- 4.3.7 Running Conventional Commands
- 4.3.8 Online Help
- 4.4 Combining Commands
- 4.4.1 Chains of Commands
- 4.4.2 Multiline Statements
- 4.4.3 Dealing with Special Characters
- 4.5 The First Script
- 4.5.1 Hello, World!
- 4.5.2 Trouble with the Execution Policy
- 4.5.3 Setting Up a Custom Script Directory
- 4.5.4 Running Scripts on Linux and macOS
- 4.5.5 Example: Cleaning Up the Downloads Directory
- 4.5.6 Differentiating Between PowerShell Versions
- 4.6 Variables, Strings, and Objects
- 4.6.1 Data Types
- 4.6.2 Calculating and Comparing
- 4.6.3 Strings
- 4.6.4 Command Substitution
- 4.6.5 Objects
- 4.6.6 Assembling Custom Objects
- 4.6.7 Predefined Variables
- 4.6.8 Environment Variables
- 4.7 Arrays and Hash Tables
- 4.7.1 Creating and Processing Custom Arrays
- 4.7.2 Hash Tables
- 4.8 Output Redirection
- 4.8.1 Streams
- 4.8.2 Output Redirection
- 4.8.3 Duplicating Output (Tee-Object)
- 4.8.4 (Not) Formatting the Output
- 4.8.5 No Input Redirection
- 4.9 Loops
- 4.9.1 ForEach-Object
- 4.9.2 for, while, do-while, and do-until
- 4.10 Branches
- 4.10.1 Case Distinctions Using switch
- 4.11 Functions and Parameters
- 4.11.1 Function Results
- 4.11.2 return
- 4.11.3 Parameters
- 4.11.4 Calling Functions
- 4.11.5 Processing Standard Input
- 4.11.6 Syntax Variants
- 4.12 Modules
- 4.12.1 Module Directories
- 4.12.2 Modules for Experts
- 4.13 Error Protection
- 4.13.1 Set-StrictMode
- 4.13.2 Aborting Scripts on Errors
- 4.13.3 Separating Error Messages from Other Output
- 4.13.4 Error Protection Using try/catch
- 4.13.5 Terminating the Script Execution Prematurely (Exit)
- 5 Python
- 5.1 Installing Python
- 5.1.1 Windows
- 5.1.2 macOS
- 5.2 Getting to Know Python in a Terminal Window
- 5.3 Programming Custom Scripts
- 5.4 Elementary Syntax Rules
- 5.4.1 Block Elements
- 5.4.2 Comments
- 5.5 Numbers
- 5.5.1 Floats
- 5.5.2 Random Numbers
- 5.6 Strings
- 5.6.1 Raw Strings
- 5.6.2 Processing Strings
- 5.6.3 Slicing
- 5.6.4 print and input
- 5.6.5 Formatting Outputs
- 5.7 Lists
- 5.7.1 List Comprehension
- 5.7.2 map and filter
- 5.8 Tuples, Sets, and Dictionaries
- 5.8.1 Sets
- 5.8.2 Dictionaries
- 5.9 Variables
- 5.9.1 Assignments
- 5.9.2 Data Types
- 5.9.3 Mutable or Immutable?
- 5.10 Operators
- 5.10.1 Combining Assignment and Evaluation
- 5.11 Branches (if)
- 5.11.1 Conditions
- 5.11.2 Short Notation with if
- 5.12 Loops (for and while)
- 5.12.1 break, continue, and else
- 5.12.2 Loops over Number Ranges (range)
- 5.12.3 Loops over the Characters of a String
- 5.12.4 Loops over Lists, Tuples, and Sets
- 5.12.5 Loops over Dictionaries
- 5.12.6 Loops over the Parameters of a Script
- 5.12.7 Globbing on Windows
- 5.12.8 Loops over the Lines of a Text File
- 5.12.9 Loops over All Files in a Directory
- 5.13 Functions
- 5.13.1 Global and Local Variables
- 5.13.2 Parameters
- 5.13.3 Optional Parameters
- 5.13.4 Variable Number of Parameters
- 5.13.5 Lambda Functions
- 5.14 Processing Text Files
- 5.14.1 Example: Analyzing a CSV File
- 5.14.2 Example: Creating SQL Commands
- 5.15 Error Protection
- 5.16 System Functions
- 5.16.1 Access to the Program Parameters
- 5.16.2 Access to Standard Input and Standard Output
- 5.16.3 Exiting a Program
- 5.16.4 Calling Linux Commands
- 5.16.5 Processing Results
- 5.16.6 Running Commands through the Shell
- 5.16.7 Error during a Command Call
- 5.16.8 Waiting (sleep)
- 5.17 Modules
- 5.17.1 import
- 5.17.2 Distributing Custom Scripts across Multiple Files
- 5.18 Installing Additional Modules Using pip
- 5.18.1 Installing pip
- 5.18.2 Applying pip
- 5.18.3 pip Problems with Windows
- 5.18.4 pip Problems with Linux
- 5.18.5 requirements.txt
- 5.18.6 pipenv
- PART II Work Techniques and Tools
- 6 Linux Toolbox
- 6.1 Directories and Files
- 6.1.1 Listing, Copying, Moving, and Deleting Files
- 6.2 Finding Files
- 6.2.1 Text Search Using grep
- 6.3 Compressing and Archiving Files
- 6.3.1 Archiving Files Using tar
- 6.3.2 ZIP Files
- 6.4 Using Root Privileges
- 6.4.1 sudo Privileges for Selected Accounts Only
- 6.4.2 Issues with Output Redirection
- 6.4.3 Access Rights
- 6.4.4 Managing Processes
- 6.4.5 Terminating Processes
- 6.4.6 Background Processes and System Services
- 6.4.7 Logging Files
- 6.4.8 Determining Free Memory
- 6.4.9 Determining Other System Information
- 6.5 Software Installation
- 6.5.1 Updating Software
- 6.5.2 Installing Additional Packages
- 6.6 Other Commands
- 7 cmdlets for PowerShell
- 7.1 Directories and Files
- 7.1.1 Listing, Copying, Moving, and Deleting Files
- 7.1.2 Reading and Writing Text
- 7.1.3 Inputting and Outputting Text
- 7.2 Finding Files
- 7.2.1 Searching Text Files
- 7.2.2 Text versus Objects
- 7.3 Compressing and Archiving Files
- 7.3.1 Compressing Search Results
- 7.4 Process Management
- 7.4.1 Launching Other PowerShell Scripts
- 7.4.2 Running Commands in the Background
- 7.4.3 Managing Services
- 7.4.4 Working on Other Computers
- 7.5 Registration Database and System Information
- 7.5.1 Determining System Information
- 7.5.2 Evaluating the Logging System
- 7.6 Processing cmdlet Results
- 7.6.1 Select-Object and Sort-Object
- 7.6.2 Where-Object
- 7.6.3 Group-Object
- 7.6.4 ForEach-Item
- 7.6.5 Measure-Object
- 7.6.6 Formatting and Exporting cmdlet Results
- 7.7 Other cmdlets
- 7.8 Installing Additional Modules
- 7.8.1 Listing Modules, Commands, and Package Sources
- 7.8.2 NuGet and winget
- 7.9 Standard Aliases
- 8 Analyzing Texts with Filters and Pipes
- 8.1 grep, sort, cut, and uniq
- 8.1.1 grep
- 8.1.2 wc
- 8.1.3 cut
- 8.1.4 sort
- 8.1.5 head and tail
- 8.1.6 uniq
- 8.1.7 tr
- 8.1.8 awk and sed
- 8.2 Example: Statistical Data Analysis
- 8.2.1 Data Extraction via Script
- 8.3 Example: ping Analysis
- 8.3.1 ping Call via Script
- 8.4 Example: Apache Log Analysis
- 8.4.1 Extracting IP Addresses
- 8.4.2 Identifying Popular Pages
- 8.5 CSV Files
- 8.5.1 Processing CSV Files Using Python
- 8.5.2 Processing CSV Files in PowerShell
- 9 Regular Expressions
- 9.1 Syntax Rules for Regular Expressions
- 9.2 Groups and Alternatives
- 9.2.1 Quantifiers
- 9.2.2 On Greed (Greedy versus Lazy)
- 9.2.3 Alpha and Omega
- 9.2.4 Exercise Pages and Cheat Sheets
- 9.2.5 Example: Recognizing a Date
- 9.2.6 Example: Recognizing IPv4 Addresses
- 9.2.7 Example: Recognizing Email Addresses
- 9.3 Regular Expressions in Bash (grep, sed)
- 9.3.1 Bash Comparison Operator for Regular Expressions
- 9.3.2 Filtering Text Using grep
- 9.3.3 The ""sed"" Stream Editor
- 9.3.4 Searching and Replacing Using sed
- 9.3.5 sed Example: Manipulating Paths of Image Files
- 9.4 Regular Expressions in PowerShell
- 9.4.1 The match and replace Operators
- 9.4.2 Select-String
- 9.4.3 Example: Input Validation
- 9.4.4 Example: List of Figures
- 9.5 Regular Expressions in Python (re Module)
- 9.5.1 Example: Verifying a MAC Address
- 9.5.2 Example: Anonymizing a Logging File
- 10 JSON, XML, and INI
- 10.1 JSON in PowerShell
- 10.1.1 Example: Saving Event Log Entries in JSON Format
- 10.1.2 Example: Analyzing Domain Queries
- 10.1.3 Example: Converting between CSV and JSON
- 10.2 JSON and Python
- 10.2.1 Example: Collecting Birthdays
- 10.2.2 Example: Determining Holidays
- 10.3 JSON in Bash
- 10.3.1 Viewing JSON Files Interactively Using fx
- 10.4 XML in PowerShell
- 10.4.1 XML Data Type
- 10.4.2 Select-Xml
- 10.4.3 ConvertTo-Xml, Export-Clixml, and Import-Clixml
- 10.5 XML and Python
- 10.5.1 Example: Creating a Dictionary for Country Codes
- 10.5.2 Example: Analyzing an RSS Feed
- 10.5.3 Example: Extracting MAC Addresses from Virtual Machine Files
- 10.6 XML in Bash
- 10.6.1 xmllint
- 10.6.2 XMLStarlet
- 10.7 INI Files
- 10.7.1 Python
- 10.7.2 PowerShell
- 10.7.3 Bash
- 11 Running Scripts Automatically
- 11.1 cron
- 11.1.1 /etc/crontab
- 11.1.2 Personal crontab Files
- 11.1.3 Hourly, Daily, Weekly, and Monthly Directories
- 11.1.4 Alternatives to cron
- 11.1.5 Starting Jobs Automatically on macOS
- 11.2 Example: Web Server Monitoring
- 11.2.1 Testing and Troubleshooting
- 11.2.2 Real Monitoring
- 11.3 Microsoft Windows Task Scheduler
- 11.3.1 Troubleshooting
- 11.3.2 Setting Up Tasks via cmdlets
- 11.4 Example: Saving Exchange Rates
- 11.5 Tracking File System Changes
- 11.5.1 inotify
- 11.5.2 Alternatives to inotify
- 12 SSH
- 12.1 Installing the SSH Client and Server
- 12.1.1 Linux
- 12.1.2 macOS
- 12.1.3 Windows
- 12.1.4 Using an Editor in an SSH Session
- 12.1.5 Securing an SSH Server
- 12.2 Working with SSH
- 12.2.1 Host Verification
- 12.2.2 Potential Issues and Their Cause
- 12.2.3 Running Linux and macOS Commands
- 12.2.4 Running Windows Commands
- 12.2.5 SSH Remoting in PowerShell
- 12.3 scp and rsync
- 12.3.1 Copy-Item with SSH Remoting
- 12.3.2 rsync
- 12.4 SSH Authentication with Keys
- 12.4.1 Generating a Key Pair
- 12.4.2 Storing the Public Component of the Key on the Server (macOS and Linux)
- 12.4.3 Storing the Public Component of the Key on the Server (Windows)
- 12.5 Example: Uploading Images to a Linux Web Server
- 12.5.1 Preparatory Measures
- 12.5.2 Bash Script
- 12.5.3 PowerShell Script
- 12.6 Example: Analyzing Virtual Machines
- 13 Visual Studio Code
- 13.1 Introduction
- 13.1.1 Comparing VS Code, VSCodium, and Visual Studio
- 13.1.2 Think in Terms of Directories, Not Files!
- 13.2 Language-Specific VS Code Extensions
- 13.2.1 PowerShell Extension
- 13.2.2 Python Extension
- 13.2.3 Bash/Shell Extensions
- 13.3 Remote – SSH Extension
- 13.3.1 Applying the Remote – SSH Extension
- 13.3.2 Limitations
- 14 Git
- 14.1 Git Crash Course
- 14.1.1 Preparation Tasks
- 14.1.2 The First Repository
- 14.1.3 The First Commit
- 14.1.4 Additional Commits
- 14.1.5 Setting Up the Repository on a Second Computer
- 14.1.6 Git Status
- 14.1.7 Excluding Files from Git (.gitignore)
- 14.1.8 Transferring Existing Code to a New Repository
- 14.2 Handling Settings and Passwords Correctly
- 14.2.1 What’s a Better Method?
- 14.2.2 Example
- 14.3 Git Automation
- 14.3.1 Controlling GitHub Remotely Using gh
- 14.4 Git Hooks
- 14.4.1 Example: Detecting Unversioned Files Before the Commit
- PART III Applications and Examples
- 15 Backups
- 15.1 Synchronizing Directories to External Storage
- 15.1.1 PowerShell Script with robocopy
- 15.1.2 Ideas for Improvement
- 15.1.3 Bash Script with rsync
- 15.2 WordPress Backup
- 15.3 SQL Server Backup
- 15.3.1 Backing Up and Compressing all Databases via Script
- 16 Image Processing
- 16.1 Manipulating Image Files
- 16.1.1 Installing ImageMagick
- 16.1.2 Trying Out ImageMagick
- 16.1.3 Example: convert2eps (Bash Variant)
- 16.1.4 Example: convert2eps (PowerShell Variant)
- 16.2 Sorting Photos by Date Taken
- 16.2.1 Installing and Trying Out ExifTool
- 16.2.2 Bash Example
- 16.2.3 PowerShell Example
- 16.3 Converting Exif Metadata to SQL Commands
- 16.3.1 PyExifTool
- 16.3.2 EXIF2SQL
- 16.3.3 Options for Enhancement
- 17 Web Scraping
- 17.1 Limitations
- 17.2 Web Scraping, Web Crawling, and Data Mining
- 17.3 Downloading Websites Using wget
- 17.3.1 Example 1: Downloading Directly Linked Images
- 17.3.2 Example 2: Downloading all PDF Files Linked on the Website
- 17.3.3 Example 3: Creating a Local Copy of the Website
- 17.4 Web Scraping with Regular Expressions
- 17.5 Web Scraping with Beautiful Soup
- 17.5.1 Beautiful Soup and Requests
- 17.5.2 Hello, Beautiful Soup!
- 17.5.3 Example: Determining a List of Top Titles from Rheinwerk Publishing
- 17.6 Web Scraping with Requests-HTML
- 17.6.1 Example: Analyzing the GitHub Status
- 17.7 Web Scraping with PowerShell
- 18 Using REST APIs
- 18.1 Tools
- 18.2 Sample APIs to Try Out
- 18.3 Implementing Custom REST APIs
- 18.4 curl and wget
- 18.4.1 curl
- 18.4.2 wget
- 18.4.3 Using REST APIs in Bash Scripts
- 18.5 Using REST APIs in PowerShell
- 18.6 Example: Determining the Current Weather
- 18.7 Using REST APIs in Python
- 18.8 Example: Determining Electricity Prices and Displaying Them Graphically
- 18.8.1 aWATTar API
- 18.8.2 Analysis of the Data
- 18.8.3 Matplotlib
- 18.8.4 Controlling the Energy Consumption
- 19 Databases
- 19.1 Updating and Maintaining Databases
- 19.1.1 PowerShell and sqlcmd
- 19.2 Creating a New Customer Account
- 19.2.1 Account Data
- 19.2.2 Structure of the Script
- 19.3 Storing Exif Metadata in a Database
- 19.3.1 PyMySQL
- 19.3.2 Saving Exif Metadata
- 19.4 Importing JSON Data into a Table
- 20 Scripting in the Cloud
- 20.1 AWS CLI
- 20.1.1 Installation on Linux and macOS
- 20.1.2 Configuration
- 20.1.3 Getting Started
- 20.1.4 Encrypting Files
- 20.2 Example: Uploading Encrypted Backup Files to the Cloud
- 20.3 AWS PowerShell Module
- 20.3.1 Getting Started
- 20.3.2 Copying Files
- 20.4 Example: Offloading Large Files from a Website to the Cloud
- 20.4.1 Preparations
- 20.4.2 Script
- 20.4.3 Limitations
- 21 Virtual Machines
- 21.1 Setting Up and Running Virtual Machines (KVMs)
- 21.1.1 Cloning Virtual Machines
- 21.1.2 Starting and Shutting Down Virtual Machines
- 21.1.3 Running Scripts on Multiple Virtual Machines
- 21.2 Automating the Network Configuration (KVMs)
- 21.3 Controlling Hyper-V
- 21.3.1 Cloning Virtual Machines
- The Author
- Index