Técnicas de Programación de la Shell de Linux para Administradores

Técnicas de Programación de la Shell de Linux para Administradores

Realizado por
PEDRO LOPEZ SOTO
Dirigido por
FRANCISCO R. VILLATORO MACHUCA y LAWRENCE MANDOW ANDALUZ

DEPARTAMENTO DE LENGUAJES Y CIENCIAS DE LA COMPUTACIÓN
UNIVERSIDAD DE MÁLAGA
MÁLAGA, NOVIEMBRE 2005

Índice de Contenidos
Capítulo 1. Introducción…………………………………………………………………………………………………………….1
1.1. Objetivos del Proyecto ……………………………………………………………………………………………………..1
1.2. Contenidos de la Memoria…………………………………………………………………………………………………3
Capítulo 2. Estudio Histórico y Práctico de la Evolución de las Shells ……………………………………………..5
2.1. UNIX. Un Comienzo………………………………………………………………………………………………………..5
2.2. Shell. Una Evolución………………………………………………………………………………………………………10
2.2.1 Shell Bourne. El Gran ‘Daddy’…………………………………………………………………………………..12
2.2.2 C Shell. El Valor de ser Diferente ……………………………………………………………………………..13
2.2.3 Shell Korn. El Retorno a las Tradiciones ……………………………………………………………………14
2.2.4 Shell POSIX. Adaptándose al Estándar………………………………………………………………………16
2.2.5 Shell Bash. En Busca de la Libertad…………………………………………………………………………..17
2.3. Conclusiones ………………………………………………………………………………………………………………..19
Capítulo 3. Comparativa Funcional de las Shells de Unix……………………………………………………………..21
3.1. Criterios Técnicos………………………………………………………………………………………………………….21
3.1.1 Histórico de Comandos ……………………………………………………………………………………………21
3.1.2 Edición de la Línea de Comandos ……………………………………………………………………………..24
3.1.3 Seguimiento Invisible de Enlaces Simbólicos ……………………………………………………………..25
3.1.4 Completado de Nombres de Ficheros, Comandos, Usuarios, Hosts y Variables ………………26
3.1.5 Facilidades para el uso del Prompt de Usuario…………………………………………………………….30
3.1.6 Evaluación de Expresiones Aritméticas y Lógicas……………………………………………………….33
3.1.7 Manejo de Variables………………………………………………………………………………………………..40
3.1.8 Sentencias de Control de Flujo de la Ejecución …………………………………………………………..47
3.1.9 Redirección de Entrada y Salida. Pipes ………………………………………………………………………50
3.1.10 Funciones………………………………………………………………………………………………………………54
3.1.11 Shells Libres …………………………………………………………………………………………………………..55
3.1.12 Diferencias Entre Shell Posix y Shell Korn…………………………………………………………………56
3.2. Conclusiones ………………………………………………………………………………………………………………..57
Capítulo 4. Técnicas Básicas de la Programación Shell…………………………………………………………………61
4.1. Comenzando a Crear un Script…………………………………………………………………………………………61
4.1.1 Ejecutar un Script ……………………………………………………………………………………………………63
4.1.2 Comentarios…………………………………………………………………………………………………………..66
4.1.3 Uso de Variables en un Script. Arrays. Variables Especiales ………………………………………..66
4.2. Comunicación con un Script ……………………………………………………………………………………………72
4.2.1 Argumentos de un Script ………………………………………………………………………………………….72
4.2.2 Sentencia read………………………………………………………………………………………………………73
4.2.3 Opciones y Argumentos con getopts……………………………………………………………………..74
4.3. Variables. Aritmética, Lógica y Cadenas …………………………………………………………………………..78
4.3.1 Aritmética y Lógica …………………………………………………………………………………………………78
4.3.2 Manejo de Cadenas………………………………………………………………………………………………….78
4.4. Condiciones………………………………………………………………………………………………………………….79
4.4.1 Cortocircuitos …………………………………………………………………………………………………………79
4.4.2 Condicional if……………………………………………………………………………………………………….81
4.4.3 Condicional case…………………………………………………………………………………………………..82
4.5. Bucles ………………………………………………………………………………………………………………………….84
4.5.1 while y until …………………………………………………………………………………………………….84
4.5.2 for………………………………………………………………………………………………………………………85
4.5.3 select………………………………………………………………………………………………………………..87
4.5.4 break y continue………………………………………………………………………………………………89
4.6. Funciones …………………………………………………………………………………………………………………….89
4.6.1 Definición de Funciones…………………………………………………………………………………………..89
4.6.2 Argumentos y Entorno de Funciones …………………………………………………………………………90
4.6.3 Finalización de Funciones ………………………………………………………………………………………..91
4.6.4 Librerías de Funciones …………………………………………………………………………………………….91
4.7. Flujo de Datos. Entrada y Salida ………………………………………………………………………………………92
4.8. Traps y Señales……………………………………………………………………………………………………………..93
Capítulo 5. Expresiones Regulares, sed y awk …………………………………………………………………………..97
5.1. Introducción …………………………………………………………………………………………………………………97
5.2. Expresiones regulares. grep …………………………………………………………………………………………..97
5.3. Comando sed ……………………………………………………………………………………………………………..100
5.3.1 sustituir ……………………………………………………………………………………………………………….101
5.3.2 Borrar………………………………………………………………………………………………………………….103
5.3.3 Imprimir………………………………………………………………………………………………………………104
5.3.4 Leer…………………………………………………………………………………………………………………….105
5.3.5 Escribir ……………………………………………………………………………………………………………….105
5.4. Comando awk ……………………………………………………………………………………………………………..106
5.4.1 Procesamiento de líneas en awk………………………………………………………………………………107
5.4.2 Campos definidos dentro de una línea………………………………………………………………………108
5.4.3 Operadores en los patrones……………………………………………………………………………………..109
5.4.4 Procesamiento pre-entrada y post-entrada…………………………………………………………………109
5.4.5 Impresión de valores con awk. Salida formateada……………………………………………………..110
5.4.6 Variables……………………………………………………………………………………………………………..111
5.4.7 Operadores y funciones ………………………………………………………………………………………….111
5.5. Programas sed y awk…………………………………………………………………………………………………..112
Capítulo 6. Aplicaciones para administración con la Shell Bash …………………………………………………..115
6.1. Análisis del Número de Argumentos de un Script: argumentos.sh ………………………………116
6.2. Bombardeo con Mails a un Servidor de Correo: mailbomb.sh……………………………………….116
6.3. Backups del Sistema en Cdrom: cdbackup.sh……………………………………………………………..117
6.4. Grabación en cd de una Imagen de Cdrom en formato .iso: grabacd.sh………………………….119
6.5. Representación de un Cursor en Pantalla: cursor.sh…………………………………………………….120
6.6. Ejemplo de uso del Script cursor.sh: usacursor.sh……………………………………………………..121
6.7. Escáner de red: escanea_ip.sh ………………………………………………………………………………..121
6.8. Escáner de red: escanea_ip_2.sh…………………………………………………………………………….122
6.9. Backup y Eliminación de Ficheros log: logrotate.sh…………………………………………………123
6.10. Conversión de Nombres de Ficheros a Caracteres Minúsculas: minusculas.sh………….125
6.11. Desglose de un Nombre Completo de directorio o Fichero en sus Componentes: path.sh126
6.12. Difusión de un Correo a Múltiples Usuarios: broadmail.sh ……………………………………..127
6.13. Desglose de un Fichero de Base de Datos en sus Componentes: cortafichero.sh …….128
6.14. Ejecución de un ftp a una Máquina Remota sin Intervención Manual : ftpremoto.sh ….130
6.15. Renombrado de Ficheros de Imágenes en Formato .jpg: renombra.sh ………………………..131
6.16. Gestión de Paquetes de Instalación en Formato .rpm: maneja_rpm.sh………………………..132
6.17. Petición de Usuario y Contraseña Para Scripts: login.sh …………………………………………..137
6.18. Eliminación de Segmentos de Memoria Compartida en el Sistema: rm_shmem.sh…………138
6.19. Selección de la Shell Para una Sesión Interactiva de Trabajo: selecciona_shell.sh..139
6.20. Agenda Personal: agenda.sh ………………………………………………………………………………….141
6.21. Creación de una Cuenta de Usuario: nuevousuario.sh……………………………………………143
6.22. Listado de los Usuarios de un Sistema: usuarios.sh………………………………………………..145
6.23. Ejemplo de Sentencia getopts: opciones.sh ……………………………………………………….146
6.24. Distribución de Ficheros en Múltiples Servidores: copia_array_remoto.sh …………..147
6.25. Kit Para Implantación de Aplicaciones en Servidores en Cluster: clustertoolkit.sh.148
6.26. Conversión de Ficheros en Formato .lj a Postscript y a Formato Pdf: lj-ps-pdf.sh…….150
6.27. Generación de un Informe de Totales: formatea.awk……………………………………………….151
Capítulo 7. Conclusiones ………………………………………………………………………………………………………..153
BIBLIOGRAFíA……………………………………………………………………………………………………………………….155
Apéndice A. Contenidos del CD adjunto ……………………………………………………………………………………….159

Descarga:

Técnicas de Programación de la Shell de Linux para Administradores

Curso de Administración de Sistemas GNU/Linux

jEsuSdA liberó un curso de Administración de Sistemas GNU/Linux que ya está disponible para descargarlo en PDF o seguir el curso online en presentaciones desde su web, con un contenido muy interesante:

  1. Introducción
  2. Instalación
  3. Primeros Pasos
  4. Administración básica I
  5. Administración básica II

Mis más sinceras felicitaciones por el buen trabajo que ha hecho y por liberarlo para que muchas personas puedan disfrutar del curso.

Saludos ;)

Como defragmentar una partición XFS

Lamentablemente, no todo es color de rosa con XFS y por lo tanto, habrá que defragmentarlo. Si bien no es como defragmentar NTFS en Windows, es algo que tenemos que tener en cuenta para evitar que el sistema “se pete o casque el disco duro.” A no desilusionarse, no es nada complicado.

Quiero decir, antes que nada, que ésto es meramente una tarea de mantenimiento simple en cualquier sistema o servidor web y no es una contra importante como para no utilizar el sistema XFS. De cualquier manera, sepan que es una tarea simple y fácil de hacer.

Lo primero es tener instalado xfsdump:

  • Para instalar xfsdump en sistemas Debian usamos:
apt-get install xfsdump
yum install xfsdump

Ahora vamos a ver cuantas de nuestras particiones deben ser defragmentadas:

xfs_db -r /dev/PARTICION

se abrirá un prompt, ahí debemos escribir:

frag

Nos indicara el porcentaje de framgentación del sistema de archivos XFS. Por la red se dice que cuando alcance el 10% debe ser defragmentado. Yo he defragmentado sistemas con un 6% y tardó un poco, supongo que debe depender de las caracterísiticas del equipo.

No es algo complicado, pero recomiendo hacerlo todo modo mono-usuario (runlevel 1) (recovery mode, se selecciona al arranque.)

Ahora sí, pasamos a defragmentar (suponiendo que lo necesitamos):

xfs_fsr -v /dev/PARTICION 

Recordad que en PARTICION irá nuestra partición en cuestión: hda1, sda2, etc.
Eso es todo, nada complicado. A no preocuparse, no tarda lo mismo que Windows y depende de nuestro equipo y porcentaje de fragmentación.

Redireccionar puertos en Linux usando SSH

En algunas ocasiones necesitamos acceder a algún servicio o aplicación que usa un puerto diferente al que por defecto tenemos permitido.

Imaginemos que estamos usando en nuestro trabajo nuestro portatil con Ubuntu y queremos actualizar repositorios o usar facebook, messenguer, etc … Estos servicios usan un puerto determinado que en principio si no podemos usar directamente se debe a la existencia en la red de un firewall que esta capando un puerto determiando.

Pues bien utilizando SSH , nos enseñana como podremos crear un tunel sobre dicho servidor externo y evitar el firewall, usando nuestra máquina como servidor local y redireccionando todas las salidas sobre el puerto especificado, es bastante sencillo y nos saltaremos el cortafuegos gustosamente:

El ejemplo que vamos a utilizar es el saltarnos un firewall, en nuestra red que capa el puerto que utiliza ubuntu para actualizar unos repositorios en un host concreeto.

Imaginemos que deseaba agregar el repositorio UbuntuGis para instalar algunos paquetes del mismo (Grass y Quantum GIS entre otros), pero al añadirlo:

sudo add-apt-repository ppa:ubuntugis/ppa

Si hay un firewal en la red que capa dicho puerto obtendriamos el siguiente error::
Executing: gpg –ignore-time-conflict –no-options –no-default-keyring –secret-keyring /etc/apt/secring.gpg –trustdb-name /etc/apt/trustdb.gpg –keyring /etc/apt/trusted.gpg –primary-keyring /etc/apt/trusted.gpg –keyserver keyserver.ubuntu.com –recv 6B827C12C2D425E227EDCA75089EBE08314DF160
gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.com
gpgkeys: HTTP fetch error 7: couldn’t connect to host
gpg: no valid OpenPGP data found.
gpg: Total number processed: 0

Executing: gpg –ignore-time-conflict –no-options –no-default-keyring –secret-keyring /etc/apt/secring.gpg –trustdb-name /etc/apt/trustdb.gpg –keyring /etc/apt/trusted.gpg –primary-keyring /etc/apt/trusted.gpg –keyserver keyserver.ubuntu.com –recv 6B827C12C2D425E227EDCA75089EBE08314DF160gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.comgpgkeys: HTTP fetch error 7: couldn’t connect to hostgpg: no valid OpenPGP data found.gpg: Total number processed: 0

* Está capando el puerto 11371, el que usa el servidor de claves en la dirección: keyserver.ubuntu.com

Ahora bien para solucionar esto mediante un tunel con SSH hariamos lo siguiente:

1. Editamos el fichero /etc/hosts (como superusuario), en concreto la siguiente línea:
127.0.0.1 localhost keyserver.ubuntu.com

2. Guardamos y teniendo en cuenta que disponemos un servidor externo con un servidor SSH y sin restricciones en cuanto a firewall se refiere, lanzamos SSH con un tunel sobre el puerto 11371 local y redireccionando la salida sobre la dirección especificada (keyserver.ubuntu.com) y el mismo puerto. Tan sencillo como la siguiente línea (en este caso estoy usando el servidor de mi universidad, y nombre_usuario el nombre de mi usuario en el servidor ts.uco.es):

ssh nombre_usuario@ts.uco.es -L 11371:keyserver.ubuntu.com:11371

3. Nos autenticamos en el servidor y ya estamos preparados para agregar el repositorio, esta vez satisfactoriamente:

      blogofsysadmins.com@asubuntu:~$ sudo add-apt-repository ppa:ubuntugis/ppa
      [sudo] password for ahornero:
      Executing: gpg –ignore-time-conflict –no-options –no-default-keyring –secret
      keyring /etc/apt/secring.gpg –trustdb-name /etc/apt/trustdb.gpg –keyring
      /etc/apt/trusted.gpg –primary-keyring /etc/apt/trusted.gpg –keyserver
      keyserver.ubuntu.com –recv
      6B827C12C2D425E227EDCA75089EBE08314DF160
      gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.com
      gpg: key 314DF160: “Launchpad ubuntugis-stable” not changed
      gpg: Total number processed: 1
      gpg:              unchanged: 1

¡Y listo!, ya tenemos una bonita forma de evitar un cortafuegos para un uso concreto, en este caso agregar un repositorio.

Error en Plesk: Espacio insuficiente en /migration del servidor fuente de la migración

Vaya tela…. este error persiste y persiste en las versiones de Plesk …

Síntomas
La migración de un dominio Parallels Plesk Panel finaliza sin ningún error. De todas formas, el dominio no presenta ningún archivo html.

Causa

La causa de este problema es una cantidad de espacio de disco insuficiente en el directorio /migration del servidor fuente.

El Administrador de Migraciones de Parallels Plesk Panel carga el Agente de Migración al servidor fuente. El Agente de Migración es un script perl que realiza el volcado de los datos, usando /migration en el servidor fuente como directorio temporal para la migración. Si el directorio /migration ya no dispone de más espacio o se encuentra en una partición de tamaño limitado, los datos no se volcan debido a esta insuficiencia de espacio de disco.

Puede comprobar el tamaño de la partición ejecutando el comando «df -h». Por ejemplo:

~# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda1 950M 254M 649M 29% / <- la partición es demasiado pequeña

/dev/sda2 4.7G 1.6G 3.1G 35% /usr

/dev/sda3 100G 60G 41G 60% /var

/dev/sda4 4.7G 5.5M 4.7G 1% /home

~#

La partición “/” donde se encuentra el directorio /migration es demasiado pequeña. Tar no puede volcar los datos debido a la insuficiencia de espacio de disco.

Resolución

Le recomendamos liberar el directorio /migration en el servidor fuente. También puede transferir el directorio a una partición de mayor capacidad.

Por ejemplo, creemos el directorio de migración en otra partición que tenga espacio suficiente:

source~# mkdir /home/migration

Entonces creeamos un vínculo simbólico:

source~# rm -rf /migration

source~# ln -s /home/migration/ /migration

Y yasta amigos a migrar dominios a saco de servidor a servidor….