Tutorial Shell Scripts PDF
Tutorial Shell Scripts PDF
El da a da de un administrador de Sistemas, ya sea de una importantsima red o de un modesto servidor, esta lleno de tareas repetitivas y generalmente tediosas. Para facilitar nuestra tarea existen los scripts. Pequeos programas cuya finalidad es precisamente automatizar y encadenar tareas relacionadas con los sistemas.
1. Introduccin
Antes de empezar a meternos de lleno en el mundo de la programacin de Shell-Script, haremos una pequea introduccin, explicando los conceptos mas sencillos y realizando un breve resumen acerca de la historia de las shells, los diferentes tipos... Tambin explicaremos el Crontab para la automatizacin de tareas.
La programacin en shell-script es muy til para resolver tareas repetitivas, tpicas de los Administradores. Son ficheros de texto que contienen comandos y son directamente ejecutables por el sistema.
2. Shell en Windows
La shell de comandos de los sistemas operativos Windows utiliza el intrprete de comandos Cmd.exe, que carga aplicaciones y dirige el flujo de informacin entre ellas. Entra en Inicio/ejecutar y escribe cmd para iniciar una nueva instancia del intrprete de comandos. Puedes utilizar el shell para automatizar tareas rutinarias, tales como las copias de seguridad o la administracin de los perfiles de usuarios. Siempre se ha he tenido la idea de que la shell de Windows es bastante limitada en comparacin con UNIX ( la ausencia de comandos como grep o awk...) Para comenzar, podemos probar a escribir el comando, color 57, para cambiar el color del smbolo del sistema al color blanco y el fondo a prpura. Una vez que hemos probado que la shell, "nos hace caso", podemos probar el resto de comandos ejecutables en la shell de Windows.
A continuacin muestro en una tabla los principales comandos: COMANDO :ETIQ %NUM CALL CLS ECHO FOR GOTO IF PAUSE REM SHIFT DESCRIPCION Identifica una posicin de salto Introduce parmetros en el fichero Llama a otro fichero Batch Borra la pantalla Visualiza en pantalla una secuencia de caracteres Repite un nmero determinado de veces un mismo proceso Salta y ejecuta una nueva lnea indicada por una etiqueta Se utiliza para saltos condicionales Detiene momentneamente la ejecucin de un fichero Introduce un comentario ;@ Evita que una lnea aparezca por pantalla
2.1 Argumentos
Si preparamos un script para windows o unix podemos hacerlo de tal manera que sea capaz de ejecutarse recibiendo argumentos en el momento de su llamada. Por ejemplo podemos crear un script de copia de seguridad que reciba como parmetros la carpeta origen y la carpeta destino. Los argumentos que recibe un batch, son recibidos de la siguiente forma: nombre_script argumento1 argumento2 argumento3 siendo: %0 = nombre del archivo %1 = argumento1 %2 = argumento2 %3 = argumento3 Podemos borrar el contenido de un parmetro con el comando SHIFT.
C:Documents and Settingsjavi>set ALLUSERSPROFILE=C:Documents and SettingsAll Users.WINDOWS APPDATA=C:Documents and SettingsjaviDatos de programa CLASSPATH=.;C:Archivos de programaJavaj2re1.4.2libextQTJava.zip CommonProgramFiles=C:Archivos de programaArchivos comunes COMPUTERNAME=-JAVI-PORTATIL
ComSpec=C:WINDOWSsystem32cmd.exe FP_NO_HOST_CHECK=NO HOMEDRIVE=C: HOMEPATH=Documents and Settingsjavi LOGONSERVER=JAVI-PORTATIL NUMBER_OF_PROCESSORS=1 OS=Windows_NT Path=C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Archivos de prog ramaQuickTimeQTSystem;C:Archivos de programaArchivos comunesAdobeAGL PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH PROCESSOR_ARCHITECTURE=x86 PROCESSOR_IDENTIFIER=x86 Family 6 Model 9 Stepping 5, GenuineIntel PROCESSOR_LEVEL=6 PROCESSOR_REVISION=0905 ProgramFiles=C:Archivos de programa PROMPT=$P$G QTJAVA=C:Archivos de programaJavaj2re1.4.2libextQTJava.zip SESSIONNAME=Console SystemDrive=C: SystemRoot=C:WINDOWS TEMP=C:DOCUME~1javiCONFIG~1Temp TMP=C:DOCUME~1javiCONFIG~1Temp USERDOMAIN=JAVI-PORTATIL USERNAME=javi USERPROFILE=C:Documents and Settingsjavi windir=C:WINDOWS
Por ejemplo, la variable COMSPEC nos indica la ubicacin del interprete de comandos DOS, que suele ser command.com (C:WINDOWSsystem32cmd.exe). En PATH se guardan las rutas donde DOS debe buscar comandos o programas a ejecutar y en PROMPT es el smbolo de sistema que indica al usuario que puede introducir texto. En nuestro caso se muestra la ruta donde se encuentra y el signo de mayor que.
2.3 Ejemplo
Para empezar haremos un script muy muy sencillo. Pongmonos en la situacin de que somos administradores y queremos que se haga una copia de seguridad de ciertas carpeta. Pues esta tarea es tan sencilla como crear un archivo ejemplo.bat con el siguiente contenido.
Notas - Si lo que quisieramos copiar fuera un archivo, en vez de usar XCOPY usaramos COPY. - La variable de entorno SystemDrive, nos devuelve la letra del disco duro. No sera necesario usar esta variable si conocemos la ruta, pero he considerado didctico introducirlo en este ejemplo. - La opcin /E es para especificar que deseo copiar directorios y subdirectorios, incluyendo los que estan vacos. - La opcin /I es para especificar que queremos crear un subdirectorio si no existe, ya que si no lo pones, nos preguntara. - Para mas informacin acerca de las opciones , teclear XCOPY /?.
Tendramos que seguir los siguientes pasos para crear nuestra tarea programada: Ir a Inicio/Ejecutar y escriba cmd. En la consola que se abre, escriba net start, para ver el listado con los servicios que se estan ejecutando actualmente. 1. Si el Programador de tareas no aparece en nuestra lista, tecle net start "task scheduler".
2. En el smbolo del sistema, escriba: at hora /interactive | /every:fecha,... /next:fecha,... comando y, a continuacin, presione ENTRAR
Por ejemplo, si quisiesemos que se ejecutase en nuestro equipo a una hora: C:Documents and Settingspepito>at 11:20 c:/ejemplo.bat Se ha agregado un nuevo trabajo con identificador = 1
Si queremos ver las tareas pendientes: C:Documents and Settingspepito>at Estado ID Da Hora Lnea de comando ----------------------------------------------------------------------1 Hoy 11:20 c:/ejemplo.bat
Si quieres saber qu Shells tienes instalados en tu distribucin GNU/Linux slo tienes que teclear el comando: cat /etc/shells cat /etc/shell (dependiendo de la distribucin que tengas instalada).
En mi caso, la salida de este comando es la siguiente: # /etc/shells: valid login shells /bin/ash /bin/bash /bin/csh /bin/sh /usr/bin/es /usr/bin/ksh /bin/ksh /usr/bin/rc /usr/bin/tcsh /bin/tcsh /usr/bin/zsh /bin/sash /bin/zsh /usr/bin/esh /bin/rbash /usr/bin/screen
Para saber que tipo de Shell estamos usando, tecleamos el siguiente comando en una consola de Linux:
Para cambiar el tipo de Shell que se esta usando usaremo el comando: root@ubuntu:~# chsh
Es importante tambin saber que un script puede ejecutarse en primer o en segundo plano:
Primer plano (foreground): se lanza introduciendo el nombre del script, pero hasta que el script no termine no se devolver el control de la shell al usuario. Segundo plano (background):se lanza igual pero aadiendo a continuacin &. El control de la shell pasa inmediatamente al usuario( normalmente usado para procesos de larga duracin)
Cronolgicamente, la siguiente shell fue la c-shell o csh, desarrollada por el unix BSD de Berkeley. Y cmo su nombre indica, usa comandos muy parecidos al lenguaje de programacin C. Tambin existe una shell llamada tcsh, que es una especie de c-shell mejorada, siendo capaz de chequear ficheros, completar nombres de variables, aliases. No suele venir incluida en las instalaciones estndar.
En 1986, David Korn en los laboratorios AT&T program la korn- shell (ksh) que naci de juntar lo mejor de la bourne shell y la c-shell.
En la mayora de los sistemas Linux, viene por defecto la shell bash (Bourne-Again-shell, en referencia al inventor de la primera Shell). Esta Shell posee toda la funcionalidad del sh con caractersticas avanzadas de C Shell, por eso cualquier script escrito para una shell sh correr perfectamente. La shell bash fu programada por desarrolladores del proyecto GNU. La ventaja principal es su potencia y que es gratuita. Por este motivo nosotros usaremos esta shell .
3.2.1 Variables
Para asignar un valor a una variable: valor=7
A continuacin se muestra una tabla con una serie de variables especiales que nos sern de utilidad a la hora de escribir nuestros scripts: VARIABLE $0 $n $PS1 $# $* $? $$ $! DESCRIPCION Nombre del Shell-Script que se est ejecutando. Parmetro o argumento pasado al Shell-Script en la posicin n, n=1,2,... Prompt Nmero de argumentos. Lista de todos los argumentos. Salida del ltimo proceso ejecutado. Nmero de identificacin del proceso (PID) Nmero del ltimo proceso invocado por la shell
Por defecto, cuando asignamos un valor a una variable, es local, es decir, es conocida por esa shell, pero si se abre otra shell a partir de la que estamos, estas nuevas 'subshells' desconocen el valor de las variables que hemos asignado anteriormente.
En cambio, las variables del entorno estn disponibles para las subshells. Es decir los valores de estas variables son conocidos por los procesos hijos de la shell. Para hacer que una variable se almacene en el rea de Entorno, se utiliza el siguiente comando: root@ubuntu:~# export nombre=javi
Debemos saber que una variable exportada NO es lo mismo que una variable global, sino una copia, ya que podr ser modificada pero volver a tener su anterior valor cuando salga de la subshell.
Cmo ya sabemos, existe un conjunto de variables de entorno predefinidas, que a continuacin listamos en esta tabla: COMANDO PATH HOME USER PWD LOGNAME TERM SHELL PS1, PS2, PS3, PS4 DESCRIPCION Camino de bsqueda de rdenes Directorio de trabajo del usuario Usuario que establecila sesin Ruta completa del directorio de trabajo actual Nombre del usuario que ejecuta la shell Tipo de terminal. Shell que est ejecutndose Prompts
3.2.3 Entrecomillado
Debido a que la shell bash puede usar nombres simblicos que representan valores, como el path del directorio personal, necesitaremos conocer la diferencia entre los distintos tipos de entrecomillado, el simple, el doble y el uso de las sencuencias de escape (). Entrecomillado simple Nos sirve para hacer que la shell tome lo encerrado entre l como una expresin literal, ya sean variables, comodines u otras expresiones entrecomilladas. Es decir el contenido no es interpretado por la shell.
Para entenderlo mejor, imaginemos que deseamos crear una carpeta de nombre * (asterisco). Si lo intentamos, es decir si tecleamos mkdir *, nos dar error. Sin embargo si escribimos mkdir '*', el intrprete de comandos tomar el carcter comodn (*) como un literal y no como un comodn, y
Entrecomillado doble
Permiten la sustitucin de parmetros, la sustitucin de comandos y la evaluacin de expresiones aritmticas, pero ignoran los caracteres tubera, sustituciones de tilde, expansin de caracteres comodines, aliases y la divisin de palabras va delimitadores. Las comillas simples dentro de las comillas dobles no tienen efecto. Se puede incluir comillas dobles dentro de una cadena con comillas dobles anteponiendo . Es decir, se produce sustitucin de variable (el signo del dolar se interpreta) por ejemplo, podremos ejecutar ls "$BASH" y nos devolver correctamente el tipo de shell (/bin/bash), pero si hacemos ls "*", el comodin ser tomado como un literal.
Sencuencias de escape () Una barra inclinada inversa no entrecomillada, es decir , preserva el valor literal del siguiente carcter que lo acompaa.
A continuacin se muestra una tabla para que fcilmente veamos la diferencia entre un tipo de entrecomillado y otro:
3.2.4 Ejecucin
Existe dos formas de ejecutar los scripts: Anteponiendo sh, source o bien "." al nombre del script.
Dando permiso de ejecucin y a continuacin, invocndolo con su nombre anteponiendo la ruta donde se encuentra el script:
root@ubuntu:~# ./ejemplo.sh
En caso de que el directorio donde se encuentra el script este en el PATH, se podra ejecutar introduciendo simplemente el nombre.
3.2.5 Parmetros
Un shell-script soporta argumentos o parmetros de entrada. Desde el interior del script se referencian mediante las variables especiales $i con i=1, 2, ..., NumeroArgumentos. Es decir, si lanzamos el siguiente script: root@ubuntu:~# ejemploScript uno dos gato
Tendremos que el primer parmetro es uno, el segundo dos y el tercero gato, referencindolos en el script como $1, $2 y $3 respectivamente. Recordemos como ya vimos anteriormente que la variable $0 hace referencia al nombre del script.
Tambin podemos escribirlos en la shell con el comando "set": root@ubuntu:~# set parametro1 parametro2 parametro3 root@ubuntu:~# echo $2 parametro2
Con el comando "shift", podemos desplazar, es decir borrar varias posiciones: root@ubuntu:~# set parametro1 parametro2 parametro3 root@ubuntu:~# shift 2 root@ubuntu:~# echo $1 parametro3
Con "shift 2" hacemos que desaparezca el valor de $1 y $2, y que ahora $1 valga lo que estaba en $3.
Veamos un ejemplo que ejecutara el comando who todos los martes a las once y media de la noche, guardando la salida en fichero.txt::
30 23 * * 2 /usr/bin/who >> /home/fichero.txt El formato de las entradas de crontab es el siguiente: [minutos] [hora] [da] [mes] [dia_de_semana] [comando]
Minutos: (0-59): Es el minuto exacto en el que quieres que se ejecute la tarea Hora: (0-23) La hora exacta en formato de 24 horas Da: (1-31) Valor numrico del da del mes Mes: (1-12) Valor numrico del mes Da de la semana: (0-6), siendo 1=Lunes, 2=Martes,... 6=sbado y 0=Domingo: Valor numrico del da de la semana Usuario: usuario que ejecuta el comando, sino se pone, se usa root por defecto Comando: comando a lanzar Para especificar todos los valores posibles de una variable se utiliza el asterisco (*). Para agregar, quitar o modificar tareas en el crontab usaremos: root@ubuntu:~#crontab -e
que abrir el editor (el que hayamos definido en la variable de entorno $EDITOR) y cargar el archivo crontab correspondiente al usuario que est logueado.
Adems con los siguientes comandos tambin podremos: crontab -r: elimina el fichero crontab del usuario. crontab -u usuario: aplica una de las opciones anteriores para un usuario determinado. crontab fich: instala el fichero fich como crontab del usuario. Ahora veamos un ejemplo de cmo ejecutar nuestro script cada 20 minutos y que la salida se guarde en un log: 20 * * * * /home/script.sh >> mylog.log es importante no olvidar poner permisos de ejecucin al script (con el comando chmod).