Python para sysadmins

Para automatizar muchas de las tareas que realizan los administrador de sistemas es necesario crear scripts. Éstos se pueden crear en distintos lenguajes de programación, por ejemplo bash. En este apartado vamos a introducir las posibilidades que nos ofrece python para crear script de administración.

Módulo os

El módulo os nos permite acceder a funcionalidades dependientes del Sistema Operativo. Sobre todo, aquellas que nos refieren información sobre el entorno del mismo y nos permiten manipular la estructura de directorios.

Descripción Método
Saber si se puede acceder a un archivo o directorio os.access(path, modo_de_acceso)
Conocer el directorio actual os.getcwd()
Cambiar de directorio de trabajo os.chdir(nuevo_path)
Cambiar al directorio de trabajo raíz os.chroot()
Cambiar los permisos de un archivo o directorio os.chmod(path, permisos)
Cambiar el propietario de un archivo o directorio os.chown(path, permisos)
Crear un directorio os.mkdir(path[, modo])
Crear directorios recursivamente os.mkdirs(path[, modo])
Eliminar un archivo os.remove(path)
Eliminar un directorio os.rmdir(path)
Eliminar directorios recursivamente os.removedirs(path)
Renombrar un archivo os.rename(actual, nuevo)
Crear un enlace simbólico os.symlink(path, nombre_destino)
>>> import os
>>> os.getcwd()
'/home/jose/github/curso_python3/curso/u40'
>>> os.chdir("..")
>>> os.getcwd()
'/home/jose/github/curso_python3/curso'

El módulo os también nos provee del submódulo path (os.path) el cual nos permite acceder a ciertas funcionalidades relacionadas con los nombres de las rutas de archivos y directorios.

Descripción Método
Ruta absoluta os.path.abspath(path)
Directorio base os.path.basename(path)
Saber si un directorio existe os.path.exists(path)
Conocer último acceso a un directorio os.path.getatime(path)
Conocer tamaño del directorio os.path.getsize(path)
Saber si una ruta es absoluta os.path.isabs(path)
Saber si una ruta es un archivo os.path.isfile(path)
Saber si una ruta es un directorio os.path.isdir(path)
Saber si una ruta es un enlace simbólico os.path.islink(path)
Saber si una ruta es un punto de montaje os.path.ismount(path)

Ejecutar comandos del sistema operativo. Módulo subprocess

Con la función system() del módulo os nos permite ejecutar comandos del sistema operativo.

>>> os.system("ls")
curso  modelo.odp  README.md
0

La función nos devuelve un código para indicar si la instrucción se ha ejecutado con éxito.

Tenemos otra forma de ejecutar comandos del sistema operativo que nos da más funcionalidad, por ejemplo nos permite guardar la salida del comando en una variable. Para ello podemos usar el módulo subprocess

>>> import subprocess
>>> subprocess.call("ls")
curso  modelo.odp  README.md
0
>>> salida=subprocess.check_output("ls")
>>> print(salida.decode())
curso
modelo.odp
README.md
>>> salida=subprocess.check_output(["df","-h"])

Módulo shutil

El módulo shutil de funciones para realizar operaciones de alto nivel con archivos y directorios. Dentro de las operaciones que se pueden realizar está copiar, mover y borrar archivos y directorios; y copiar los permisos y el estado de los archivos.

Descripción Método
Copia un fichero complero o parte shutil.copyfileobj(fsrc, fdst[, length])
Copia el contenido completo (sin metadatos) de un archivo shutil.copyfile(src, dst, *, follow_symlinks=True)
copia los permisos de un archivo origen a uno destino shutil.copymode(src, dst, *, follow_symlinks=True)
Copia los permisos, la fecha-hora del último acceso, la fecha-hora de la última modificación y los atributos de un archivo origen a un archivo destino shutil.copystat(src, dst, *, follow_symlinks=True)
Copia un archivo (sólo datos y permisos) shutil.copy(src, dst, *, follow_symlinks=True)
Copia archivos (datos, permisos y metadatos) shutil.move(src, dst, copy_function=copy2)
Obtiene información del espacio total, usado y libre, en bytes shutil.disk_usage(path)
Obtener la ruta de un archivo ejecutable shutil.chown(path, user=None, group=None)
Saber si una ruta es un enlace simbólico shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None)

Módulos sys

El módulo sys es el encargado de proveer variables y funcionalidades, directamente relacionadas con el intérprete.

Algunas variables definidas en el módulo:

Variable Descripción
sys.argv Retorna una lista con todos los argumentos pasados por línea de comandos. Al ejecutar python modulo.py arg1 arg2, retornará una lista: ['modulo.py', 'arg1', 'arg2']
sys.executable Retorna el path absoluto del binario ejecutable del intérprete de Python
sys.platform Retorna la plataforma sobre la cuál se está ejecutando el intérprete
sys.version Retorna el número de versión de Python con información adicional

Y algunos métodos:

Método Descripción
sys.exit() Forzar la salida del intérprete
sys.getdefaultencoding() Retorna la codificación de caracteres por defecto

Ejecución de scripts con argumentos

Podemos enviar información (argumentos) a un programa cuando se ejecuta como un script, por ejemplo:

#!/usr/bin/env python	
import sys
print("Has instroducido",len(sys.argv),"argumento")
suma=0
for i in range(1,len(sys.argv)):
	suma=suma+int(sys.argv[i])
print("La suma es ",suma)

$  python3 sumar.py 3 4 5
Has introducido 4 argumento
La suma es  12

Ejercicios

Realiza un script en python que realice la siguiente función:

  1. Muestra el directorio de trabajo.
  2. Muestra cuantos usuarios hay definido en el sistema
  3. Muestra los usuarios conectados al equipo.
  4. Script que lea el nombre de un usuario, si existe dice si es administrador o no, si no existe da un mensaje de error. Realiza el script leyendo el usuario por teclado, y realiza otra versión indicándolo como parámetro.
  5. Pasa por parámetros una dirección ip y un nombre de máquina e inserta en /etc/hosts (en la tercera línea) la resolución estática. Si no se introducen dos parámetros se da un error.
  6. Para crear un usuario “a mano”:

    • Editar /etc/passwd y agregar una nueva linea por cada nueva cuenta. Teniendo cuidado con la sintaxis. Debería hacer que el campo de la contraseña sea ‘*’, de esta forma es imposible ingresar al sistema.
    • De forma similar, edite /etc/group para crear también un grupo.
    • Crea el directorio Inicio del usuario con el comando mkdir.
    • Copia los archivos de /etc/skel al nuevo directorio creado
    • Corrige la pertenencia del dueño y permisos con los comandos chown y chmod (Ver paginas de manual de los respectivos comandos). La opción -R es muy útil. Los permisos correctos varían un poco de un sitio a otro, pero generalmente los siguientes comandos harán lo correcto:
     	cd /home/nuevo-nombre-de-usuario
     	chown -R nombre-de-usuario:group .
     	chmod -R 755 .
    
    • Asigne una contraseña con el comando passwd
    • Crea un script python que cree un usuario, para ello debe recibir el nombre de usuario y nombre completo por parámetros, por defecto se pone uid y gid a 2000. Mejorar el programa para que:
    • Da un error si se intenta dar de alta un usuario que ya existe
    • Al ir dando de alta a distintos usuarios vaya incrementando automáticamente el uid y el gid a partir de 2000