ASO07. - Scripting en Sistemas Operativos
ASO07. - Scripting en Sistemas Operativos
Caso práctico
En un avance en el conocimiento de los
administradores de equipos, el departamento de
informática afronta cómo formar a los componentes
del departamento para capacitarles en la creación
de guiones o scripts en los distintos equipos, y con
distintos sistemas operativos que tenemos en la
empresa.
Todos están de acuerdo en que son las personas más adecuadas para formar
al departamento en el diseño, e implementación según necesidades de
programas scripts o guiones a implantar y según las necesidades en equipos
Windows o GNU/Linux.
Con esta unidad se pretende que conozcas los conceptos propios sobre integración de
comandos y variables de entorno en su variante de programas de scripting en sistemas
operativos tanto propietarios, por ejemplo Windows, como libres, por ejemplo GNU/Linux.
Caso práctico
Vindio y Laro se ponen manos a la obra. ¿Cómo?
Actualizando sus conocimientos empezando por los
nuevos entornos shell que existen.
Para acceder a realizar tareas de shell, como comandos u órdenes, debemos habilitar un
terminal.
¿Cómo se hace? Bien, depende del sistema operativo que utilicemos. En Windows
podremos utilizar la orden powershell en la opción de ejecutar programa, y obtendremos una
imagen similar a la que tenemos un poco más abajo.
GNU/Linux:
Windows:
A día de hoy, Powershell está siendo adoptado como intérprete de comandos principal en
todos los sistemas Windows. Mucho más potente y con herramienta de edición y depurador
incluidos.
Powershell en la Wikipedia
Caso práctico
Siguiendo con la dinámica de preparación de
documentación por parte de Laro y Vindio, estos
revisan la sintaxis y estructura de las distintas
instrucciones de los lenguajes de scripts que se
utilizarán en las distintas ponencias.
Como todo lenguaje, debe cumplir con unos requisitos tales como emplear la sintaxis
correcta, que no tenga errores, no sólo sintácticos sino también lógicos.
#!/bin/bash
# misdatos.sh
# muestra datos relativos al usuario que lo invoca
#
echo "MIS DATOS."
echo " Nombre: "$LOGNAME
echo "Directorio: "$HOME
echo -n "Fecha: "
date
echo
# fin misdatos.sh
Este script muestra datos que tiene el sistema acerca del usuario que ha ejecutado el script:
su nombre de inicio de sesión ($LOGNAME), su carpeta de inicio, y la fecha actual.
Para saber más
En el siguiente enlace podrás estudiar las estructuras del lenguaje de scripts
para los distintos tipos de shell de GNU/Linux.
Estructuras del lenguaje script para los distintos tipos de shell en GNU/Linux
Autoevaluación
¿Qué entendemos por "shell"?
Sí fenomenal, es cierto.
Solución
1. Opción correcta
2. Incorrecto
3. Incorrecto
4. Incorrecto
2.1.- Variables de entorno.
No debemos olvidar que, para interactuar más eficientemente
con el sistema operativo, debemos tener un sistema cómodo
para comunicarnos más fiablemente y conseguir que esas
rutinas que implementamos sean lo más eficientes posibles.
Esto lo conseguimos, por ejemplo, con la utilización de las
variables de entorno.
¿Qué son las variables? Es el nombre interno que le damos a una porción de memoria
donde almacenamos un dato.
Y, ¿una variable de entorno? Una variable de entorno es un objeto designado para contener
información usada por una o más aplicaciones. Algunos usuarios encuentran esto un poco
extraño o inmanejable. Sin embargo esto no es cierto: usando variables de entorno hace
que cualquiera pueda cambiar una opción de configuración para una o más aplicaciones
fácilmente. En Windows, podremos observar las variables de entorno por defecto en las
claves de registro HKEY_CURRENT_USER\Environment y del sistema en
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment. No obstante, igual
que en GNU/Linux, podemos leer todas las variables de entorno de nuestro equipo
ejecutando, mediante Powershell, el cmdlet Get-ChildItem Env:, o manejando directamente la
variable $env.
En GNU/Linux
Si ejecutamos set obtendremos todas las variables de entorno del sistema.
Autoevaluación
¿Los scripts pueden utilizar y manipular las variables de entorno?
Sí, pero deben asignársela a una variable propia del programa.
No, sólo se utilizan como información al usuario.
Sí, si lo pasamos como parámetro al programa de script.
Sí, se pueden utilizar y manipular.
Solución
1. Incorrecto
2. Incorrecto
3. Incorrecto
4. Opción correcta
Autoevaluación
¿En GNU/Linux podemos usar variables de entorno?
Sí.
Sí, pero solo el usuario root.
Solución
1. Opción correcta
2. Incorrecto
3. Incorrecto
4. Incorrecto
2.2.- Paso de parámetros.
Hemos visto cómo trabajar con las variables del sistema, pero no
es la única forma que tenemos de intercambiar datos con nuestros
scripts. En muchas ocasiones, sabemos que los comandos del
sistema reciben parámetros que modifican su ejecución: bien
ficheros desde los que reciben datos, ficheros para almacenar
resultados, u opciones que modifican la ejecución del comando.
Esto, por supuesto, se aplica también a los scripts que nosotros
mismos creamos.
Debes conocer
Puedes aprender todo acerca de los parámetros en scripts de Bash en el
siguiente enlace:
Scripting en Powershell
2.3.- Redirección, tuberías y filtros.
Redirección: Normalmente, se
utilizan como flujos de entrada y
sálida estándares el teclado
(entrada) y la ventana de shell Danielpr85 (Dominio público)
Cuando hablamos de filtros y Bash, es importante hablar también de comandos como awk y
sed.
Debes conocer
En los siguientes enlaces, tenemos información abundante sobre lo que
hemos visto en este punto sobre Bash.
Canalización en Powershell
Debes conocer
En el siguiente enlace tenemos información sobre estructuras repetitivas en
Bash:
Ciclos en Bash
Caso práctico
Uno de los inconvenientes con los que se encontrarán
los desarrolladores de scripts o guiones, comentan
Vindio y Laro, será saber cómo pueden depurar los
distintos lenguajes de scripts que deberán utilizar.
Para activar la ejecución de nuestros scripts locales, basta con ejecutar el siguiente
comando:
Set-ExecutionPolicy RemoteSigned
En el caso de GNU/Linux no requiere extensión pero suele utilizarse una extensión más
bien por reconocimiento a simple vista más que como imprescindible. La extensión que
suele utilizarse es ".sh". Siguiendo con el ejemplo anterior sería "direccionar.sh". En GNU/Linux,
las extensiones no tienen la importancia que tienen en Windows; el script podría tener otra
extensión, o ninguna, y seguiría siendo igual de válido.
Para ejecutar un programa en el shell de GNU/Linux debemos realizarlo con la orden sh. Por
ejemplo: sh direccionar.sh.
Cuando tenemos un shell script o fichero por lotes grande y observamos, en su ejecución,
que está fallando, normalmente empleamos el comando "echo" para imprimir una traza y ver
por donde se queda el script.
Sin embargo, para depurar el código, el comando sh que utilizamos para "lanzar" un guión
tiene un parámetro que nos permite visualizar los movimientos del guión, el valor de sus
variables, etc.
Debes conocer
Depurar el código sirve para ver como se ejecuta paso por paso el
script o programa, qué valores toman sus variables, si se ha cometido
un fallo y saber en qué parte del código ha ocurrido, etc. No es algo
que se deba hacer obligatoriamente con cada script que se programe,
pero facilita mucho a la hora de buscar los problemas que surgen a la
hora de programar.
Por ejemplo:
Como ya dijimos antes, Visual Studio Code también lleva herramientas para
trabajar fácilmente con Powershell. En el siguiente enlace, explica cómo.
Solución
1. Incorrecto
2. Incorrecto
3. Opción correcta
4. Incorrecto
Autoevaluación
Sólo Windows necesita una extensión para identificar los scripts.
¿Verdadero o falso?
Verdadero.
Falso.
Muy bien, has visto que hay diferencias entre Windows y GNU/Linux.
No es correcto, ¿GNU/Linux desde cuando necesita una extensión de
archivos?
Solución
1. Opción correcta
2. Incorrecto
Autoevaluación
¿Cuándo se puede utilizar, en GNU/Linux, extensiones de archivo?
Nunca.
No son necesarias, pero el usuario puede utilizarlas como referencia.
Solo si son scripts o guiones, por ejemplo documentos html.
Solución
1. Incorrecto
2. Opción correcta
3. Incorrecto
4.- Particularidades de Windows.
Caso práctico
A diferencia de GNU/Linux, Windows mantiene una
base de datos llamada registro, comenta Laro. Con lo
cual, Vindio se salva de esta parte de ponencia.
A lo que responde Laro que ya lo tenía valorado. Alain Bachellier (CC BY-NC-
Contará cómo afecta al sistema, dónde encontrarlo en SA)
¿Quieres un ejemplo? Utilizamos el comando SET para crear nuevas variables de entorno y
probamos si podemos aplicar lo asignado.
Vamos a indicar como habilitar las extensiones de comandos si éstas no están habilitadas.
Esto se realiza con el flag o bandera enableextensions.
Los módulos hacen falta, por ejemplo, para trabajar con Directorio Activo directamente con
Powershell. Los comandos asociados a AD en Powershell se encuentran almacenados en
el módulo "Active Directory", y es posible que haya que instalarlo para poder hacer uso de
ellos.
El cmdlet Get-Module nos muestra los módulos que tenemos instalados, y con Import-Module
podemos importar los que necesitemos.
Debes conocer
En este enlace, podemos aprender a trabajar con los módulos de Powershell:
importarlos, quitarlos, buscar los disponibles...
En este otro enlace, vemos cómo trabajar con el registro de Windows desde
Powershell
Sabemos que accedemos al registro mediante las órdenes regedit.exe o regedt32.exe. ¿Pero
podemos acceder a dicho registro mediante un fichero de script? Sí, podemos.
¿Cómo podemos acceder al registro? Pondremos un ejemplo para que se entienda bien.
Queremos conocer la ruta de acceso a los programas mediante un script escrito en
Powershell:
Autoevaluación
GNU/Linux utiliza, como motor de base de datos de registro, Mysql.
¿Verdadero o falso?
Verdadero.
Falso.
Solución
1. Incorrecto
2. Opción correcta
5.- Tareas administrativas.
Caso práctico
Siguiendo con el enfoque práctico por parte de
Vindio y Laro, quieren plantear situaciones en las
que puede ser interesante tener un pequeño
programa hecho en script para realizar alguna tarea
sencilla y cotidiana que permita ver el alcance y
potencia que pueden llegar a tener este tipo de
programas de scripts.
¿Qué entendemos por tareas administrativas? Son aquellas que se realizan de forma
repetitiva o rutinaria pero, podríamos llamarlo así, obligatorias. Un ejemplo, realizar copias
de seguridad de un dispositivo de almacenamiento masivo a otro. Podemos hacerlo de
forma manual, escribiendo los comandos con sus parámetros correspondientes o bien
realizamos un script o guión que realice esas tareas de forma automática. Si a esto
añadimos una tarea programada, prácticamente nos despreocupamos de realizar la tarea,
sólo nos queda comprobar si se ha realizado correctamente.
Algunas de las ventajas que se obtienen de estas tareas programadas son las siguientes:
Para hacer algo parecido en GNU/Linux (tareas administrativas en el inicio del sistema),
existe un script inicial donde se les asignan, por defecto, varios valores a todos los usuarios,
/etc/profile. Aparte de este archivo de inicio, tenemos, en el área de trabajo del usuario, un
script de inicio llamado .bashrc que se ejecutará cuando se acceda a través de terminal. Y
otro de salida, .bash_logout que se lanzará cuando el usuario dé por terminada la sesión.
Editando esos ficheros, podemos añadir tareas a nuestro arranque sin problema.
#!/bin/bash
mount -t smbfs -o username=usuario1 //192.168.0.168/datos-red /datos-red
Este script, que ha de ser invocado por el superusuario, es capaz de montar una unidad
remota de Samba en una carpeta local, a nombre del usuario indicado. Nos pedirá la
contraseña, pero también se la podemos pasar a través de un archivo oculto con las
credenciales, y pasarle el nombre de usuario por argumento en lugar de que sea siempre
"usuario1". Es una versión muy simple, y admite muchas mejoras.
Una de las grandes ventajas del uso de scripts, es que no hay que realizar ningún tipo de
adaptación de nuestro sistema para poder ejecutarlos. Eso sí, los permisos y privilegios del
programa deben ser adecuados a la tarea que deben realizar. ¿Qué queremos decir?
Pongamos un ejemplo que lo clarifique. Si una tarea la debe realizar el supervisor del
equipo, el sistema asume la autoría como del supervisor independientemente de quién sea
el usuario propietario del programa en sí. Ahora bien, si el programa tiene como propietario
al supervisor, ningún usuario deberá poder ejecutarlo. Por ejemplo, un apagado planificado,
o una actualización, son tareas que sólo puede ejecutar el administrador del sistema, y no
cualquier usuario, y eso tendremos que tenerlo en cuenta.
En algunos scripts, será necesario comprobar si el usuario que los está utilizando es el
administrador o no, antes de poner en marcha las tareas; por ejemplo, una actualización del
sistema, un apagado o reinicio del servidor..
#Requires -RunAsAdministrator
# Código reutilizable
function Test-Administrator
{
[OutputType([bool])]
param()
process {
[Security.Principal.WindowsPrincipal]$user = [Security.Principal.WindowsIdentity]::G
return $user.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator);
}
}
if(-not (Test-Administrator))
{
# Aquí pondremos el código oportuno para mostrar el mensaje de error que estimemos o
Write-Error "Este script debe ser ejecutado por el usuario Administrador.";
exit 1;
}
$ErrorActionPreference = "Stop";
En GNU/Linux Bash
En Bash, también podemos comprobar fácilmente si el usuario que ha ejecutado el
script es root o no, y actuar en consecuencia. Un ejemplo de código válido para ello
sería el siguiente:
#!/bin/bash
if [[ $(id -u) -ne 0 ]] ; then
echo "Este script debe ser ejecutado por el usuario root"
exit 1
fi
Debes conocer
En este sitio de Microsoft tienes un buen montón de scripts de Powershell
para realizar tareas administrativas de ejemplo; principalmente, gestión de
procesos, servicios y equipos.
Caso práctico
Laro y Vindio quieren afrontar y enfocar, en sus
respectivas ponencias, cómo acceder a los directorios
activos de los sistemas operativos: en Windows con el
Active Directory y en GNU/Linux con LDAP.
Otro ejemplo. Este script está realizado en Powershell y genera varios usuarios en la unidad
organizativa "remotos".
#Aquí le teclearemos la Ruta donde se encuentra el Fichero *.CSV que contendrá los datos de l
[String]$Ruta = Read-Host “Trayectoria donde se Localiza el archivo USUARIOS.csv”
#En la siguiente sentencia le indicamos que vamos a usar una Unidad Organizativa llamada “rem
$ou=”OU=remotos” + “,” + (Get-ADDomain).DistinguishedName
$dominio=(Get-ADDomain).DNSRoot
#Importamos el Fichero CSV y posteriormente creará los Usuarios dentro del Dominio Actual y d
Import-Csv -Path $Ruta | foreach-object {$UPN = $_.CUENTA + “@” + “$dominio”
New-ADUser -SamAccountName $_.CUENTA -UserPrincipalName $UPN -Name $_.NOMBRE -DisplayName $_.
Previo a la creación del script, es necesario crear un fichero con los datos de estos nuevos
usuarios que vamos a introducir, un fichero .csv. Esta forma de trabajar es muy común
cuando trabajamos con scripts. En el siguiente enlace, se explica cómo crear un fichero
adecuado para este script, y más datos sobre su uso:
#! /bin/bash
David Schoen / lyte (Dominio público)
clear
# Leemos usuario y grupo, también podrían pasarse por argumentos<b
read -p "Introduce grupo... " group<br># Buscamos el usuario en el
if `grep -e "^$user:.*" /etc/passwd >/dev/null`
then<br># Si existe el usuario, hay que ver si existe el grupo
if `grep -e "^$group:.*" /etc/group >/dev/null`
then
echo "Usuario y grupo ya existen en el sistema"
# Si el usuario no existía, miramos el grupo<br>elif `grep -e "^$g
then
echo "usuario no existe, grupo si!!"
else
echo "Ni grupo ni usuario existen"
fi
En este otro script, añade una foto por defecto a los usuarios que no tuvieran una
previamente. Lo que hace es generar un fichero .ldif, que después podrá ser procesado por
LDAP sin problemas.
######################################
#!/bin/bash
PHOTO=/tmp/tux.jpg
IFS=$'\n'
Debes conocer
En este enlace, encontramos desarrollado y bien documentado un script que
sirve para crear usuarios nuevos en LDAP. Podemos encontrar muchos
ejemplos de este tipo en Github.