Vous êtes sur la page 1sur 43

Manual Linux prctico

CONTENIDO
1. INTRODUCCION
1.1. HISTORIA
2. CONCEPTOS BASICOS
3. INSTALACION DE LINUX
4. CONCEPTOS BASICOS DE TERMINAL.
5. COMANDOS DEL SHELL
5.1.

COMANDOS DE MANIPULACION DE DIRECTORIOS

5.2.

COMANDOS DE MANEJO DE ARCHIVOS

5.3. COMANDOS DE VISUALIZACION DE ARCHIVOS Y OTROS


COMANDOS
6. PERNISOS CON EL COMANDO chmod
7. REDIRECCIONAMIENTO Y TUBERIAS (PIPES)
8. EDITOR DE TEXTOS vim
9. USUARIOS
9.1.

TIPOS DE USUARIOS

9.2.

CREACION DE USUARIOS

10.

COMANDO su

11.

INTRODUCCION AL SHELL SCRIPT I

11.1. VARIAVLES
11.2. CONCEPTO DE VALOR DE RETORNO
11.3. EVALUACION DE CONDICIONES

12.

ESTRUCTURAS DE FLUJO

13.

SHELL SCRIPT II

14.

ENTORNO GRAFICO DE LINUX

En esta parte te ponemos al da sobre qu es GNU/Linux y algunos pequeos


detalles que hay que conocer acerca de l antes de comenzar a instalarlo o
usarlo.
INTRODUCCION
Las caractersticas ms notables son:

Proviene de UNIX, con caractersticas similares, y es casi un derivado de


l.
Es parte del proyecto GNU, lo que significa, entre otras muchas cosas,
que es libre y que muchas veces no ests obligado a pagar por l.
Puedes usarlo de modo gratuito y adems puedes modificar su cdigo
fuente, para adaptarlo a tus propias necesidades o para contribuir en su
continuo desarrollo, en el que toman parte programadores de todo el
mundo.
Es potente, seguro y estable. Debido a ello resulta un sistema operativo
ideal para servidores ya que cumple muy bien esta funcin aunque como
sistema operativo de oficina, de escritorio o de publicacin tambin es
excelente.
Es un sistema multiusuario real, multitarea y funciona de manera muy
productiva en redes.
Forma de trabajo. Kernel o ncleo del SO realiza las tareas de ms bajo
nivel como acceso a la maquina, manejo de memoria, etc. Interprete de
comandos: BOURNE SHELL SH, REDUCED SHELL , CSHEL y otros.

HISTORIA
El creador de Linux. Su nombre es Linus Torvalds. Puede decirse que Linus
Trovalds cre este sistema operativo en 1991. Escribi un KERNEL (parte
principal de un sistema operativo) y lo dej a disposicin de sus amigos y luego
de toda la Internet para que cualquiera pudiese mejorarlo.
Algn tiempo ms tarde, para adaptar el sistema operativo y facilitar la
instalacin, nacieron las compaas distribuidoras de Linux. Entre ellas

destacan RedHat, Debian, Caldera, SuSE, Mandrake... Estas distribuidoras


pueden cobrar por ofrecer sus productos en CD o en algn otro soporte, pero
deben poner su cdigo a disposicin del pblico. Actualmente Linus Torvalds
sigue coordinando el trabajo de los programadores de todo el mundo en el
ncleo del sistema operativo para mejorarlo y adaptarlo al nuevo hardware.
Cabe la posibilidad de preguntarse cul es la mejor distribucin de Linux?
GNU/Linux tiene muchas distribuciones, y por lo general, no existe una
distribucin mejor que las dems, cada una de ellas tiene sus puntos a favor en
determinados aspectos. As, Debian es una distribucin que no es realmente
comercial en s como lo son la mayora de las otras. Mandrake, tiene una
mquina con recursos suficientes, ofrece una instalacin y configuracin
sencilla y un entorno grfico personalizado ideal para no perderse al principio.
Puedo tener Windows y Linux en la misma mquina? Claro! Como veremos
ms adelante la clave est en particionar el disco duro, para que Windows use
una parte y Linux use otra, de manera que no interfieran. Tambin como
veremos despus, el cargador de arranque de Linux te permitir elegir qu
sistema operativo iniciar.
CONCEPTOS BASICOS
El arranque.- Es lo que pasa cuando nuestra mquina arranca y tenemos que
elegir un sistema operativo. En el principio del disco duro o MBR o en una
particin queda instalado con Linux un cargador de arranque. Los dos ms
usados son LILO (LInux LOader) y GRUB, que nos permite escoger cualquiera
de los sistemas operativos que se encuentren instalados en nuestro equipo.
Sistema de archivos.- forma de escribir los datos en el disco duro. El sistema
de archivos nativo de Linux es el EXT2. Otros ms conocidos son EXT3,
ReiserFS y XFS.
Estructura de directorios en Linux

Directo
rio

Descripcin

Es la raz del sistema de directorios. Aqu se monta la particin


principal Linux EXT.

/etc

Contiene los archivos de configuracin de la mayora de los programas.

/home

Contiene los archivos personales de los usuarios.

/bin

Contiene comandos bsicos y muchos programas.

/dev

Contiene archivos simblicos que representan partes del hardware,

Directo
rio

Descripcin
tales como discos duros, memoria...

/mnt

Contiene subdirectorios donde se montan (se enlaza con) otras


particiones de disco duro, CDROMs, etc.

/tmp

Ficheros temporales o de recursos de programas.

/usr

Programas y libreras instalados con la distribucin

/
Programas y libreras instalados por el administrador
usr/local
/sbin

Comandos administrativos

/lib

Libreras varias y mdulos ("trozos") del kernel

/var

Datos varios como archivos de log (registro de actividad) de


programas, bases de datos, contenidos del servidor web, copias de
seguridad...

/proc

Informacin temporal sobre los procesos del sistema (explicaremos


esto ms en profundidad posteriormente).

Nombres de archivos
Los nombres de archivos en Linux (como en todos los UNIX) distinguen
maysculas de minsculas.
En Linux los archivos no tienen por qu tener una extensin. La suelen tener a
modo orientativo, pero no es en absoluto necesario. Linux sabe qu contiene
cada archivo independientemente de cul sea su extensin. Pueden tener
hasta ms de 200 caracteres. Los ficheros y directorios ocultos en Linux
comienzan su nombre por un punto (.)
Software adicional para linux
El software para Linux lo podemos encontrar de dos formas: en un paquete
binario o en un paquete con su cdigo fuente.
Los paquetes binarios
Existen varios tipos de paquetes binarios. Todos tienen una caracterstica en
comn, y es que contienen cdigo de mquina, no cdigo fuente, por eso cada
tipo de procesador necesita su propia versin de cada paquete. Al haber varias
distribuciones de Linux existen varios tipos de paquetes binarios, habiendo

varias distribuciones que comparten sistema de paquetes. Los ms comunes


son:
o

Los paquetes RPM: Los usan las distribuciones RedHat, Caldera,


Madrake, SuSE y TurboLinux entre otras. Su uso est muy extendido y es
posible instalar este tipo de paquetes mediante la aplicacin rpm. El
nombre
de
los
paquetes
rpm
es
del
tipo
nombredelpaquete_version_plataforma.rpm
Los paquetes Debian (deb): Los usa la distribucin Debian y sus
derivadas. Los paquetes Debian se suelen nombrar de la forma
nombredelpaquete_version_plataforma.deb
Los paquetes tgz de Slackware los usa la distribucin del mismo nombre,
y siguen los principios de los dos anteriores.

Los paquetes de cdigo fuente


Estos paquetes contienen los archivos que salen del ordenador del
programador o programadores, lo que quiere decir que ya hay que aportar algo
de nuestra parte para utilizar los programas que contienen. El proceso de
instalacin de este tipo de paquetes implica tambin una COMPILACIN.
Son tambin de amplio uso los Source RPM, que son paquetes RPM pero que en
vez de ser binarios, llevan cdigo fuente.
Meta-Paquetes
Conocemos por meta-paquete a aquellos paquetes en los cuales no hay cdigo
fuente, o binarios, sino reglas sobre CMO construir e instalar dicho paquete.
Estos
paquetes
los
usan
distribuciones
como
Gentoo
Linux
(http://www.gentoo.org), Linux From Scratch (http://www.linuxfromscratch.com)
y algunos otros sistemas operativos como FreeBSD (http://www.freebsd.org).
Los usuarios y los permisos de archivos

Linux es un sistema operativo multiusuario. Cada usuario generalmente tiene su carpeta de


usuario en /home/usuario. Por defecto slo puede escribir, modificar y borrar archivos
dentro de esta carpeta. Ningn otro usuario (excepto root) puede acceder a los archivos que
hay en este directorio, ni si quiera puede ver cules son. Este usuario -por defecto- puede
leer en el resto de las carpetas que hay en el sistema de archivos excepto en la de root y las
de otros usuarios. Y quin es ese tal root? En cualquier sistema UNIX, root es "el que todo
lo puede". Es la excepcin que confirma la regla, es el superusuario todopoderoso de estos
sistemas. Cuando hagas login como root en una mquina GNU/Linux, siente el poder bajo
tus teclas. Recuerda que tu mquina Linux es tan segura como segura sea tu contrasea de
root.
Qu son los permisos? Todos y cada uno de los archivos y directorios del rbol jerrquico
que monta nuestro sistema Linux tienen permisos. Estos permisos dicen, para cada usuario
del sistema, si puede ejecutarlo, si puede ver su contenido o si puede borrarlo o modificarlo.

El arranque de Linux II
Cuando el kernel ya ha montado el sistema de archivos, comienzan a
inicializarse algunos procesos llamados "daemons" (demonios). Cada uno de
estos demonios se inicia cuando el sistema arranca y durante su vida va a
controlar un proceso determinado, y va a permanecer en segundo plano
(transparente para el usuario), no vamos a notar que se est ejecutando a
menos que pidamos informacin a este proceso, lo detengamos o lo
reiniciemos. Algunos de estos demonios son, por ejemplo, el servidor web, el
servidor de correo, el cortafuegos, el servidor de nombres DNS... y muchos
otros que gestionan varias tareas, en su mayora servicios de servidor de red
para servir de host a otras mquinas. Cuando todos esos demonios se hayan
cargado, aparecer ante nosotros una lnea de texto de login (autentificacin
en un sistema) o bien una ventana de login grfico.
Nombramiento de dispositivos y particiones
Debemos saber de qu manera nombra Linux a los discos duros que tenemos
conectados a nuestra mquina y sobre todo a sus particiones. Todos los discos
duros (IDE) comienzan su nombre como hd. Un ejemplo de nombre completo
de disco duro sera hda y de la primera particin de ese disco duro sera hda1.
La 'a' significa que ese disco duro est conecatdo al IDE1 como maestro. Si
fuera esclavo tendra la 'b', y si estuviera conectado al IDE2 como maestro, la
'c', y si estuviera al IDE2 como esclavo, la 'd'.
El nmero 1 indica que es la primera particin (primaria y no lgica) del disco
duro en cuestin. La segunda geomtricamente hablando (primaria) sera la 2 y
as sucesivamente. La primera particin lgica de un disco duro se nombra con
el nmero 5, independientemente de si pertenece a la primaria 1, 2, 3 4. La
segunda se nombrara con un 6 y as sucesivamente.
Por el momento es suficiente saber lo que significa hda1 o hdd2 o hdc5.
Elegir la distribucin que instalaremos
En la primera instalacin de Linux, tendrs que elegir una distribucin que no
sea demasiado avanzada y te permita instalar sin grandes dificultades. Hoy
esto no es dificl, puesto que la mayora de distribuciones se instalan de
manera muy sencilla. Podramos elegir entre una de las siguientes:
o

Mandrake Linux: Esta distribucin de Linux es de las ms amigables si


nos estamos acercando a Linux la primera vez, calificada por muchos (y
creemos que acertadamente) como la ms sencilla para iniciarnos. La
nica "pega" (que no lo es realmente) de esta distribucin es que
instalar un montn de cosas que puede que no necesitemos, pero es el
precio de una instalacin sencilla. Es por esto por lo que deberamos
tener una mquina potente para instalar esta distribucin sin que se nos
vaya arrastrando. Ofrece un escritorio muy agradable y completo,

adems de varios asistentes sencillos para cambiar la configuracin del


hardware.
La web oficial de Mandrake nos permite descargarnos su paquete.
Deberemos buscar las imgenes ISO (archivos .iso) y descargarlas.
o

RedHat/Fedora Linux: Fedora es la distribucin libre (gratuita) de la


compaa RedHat, y RedHat Linux es su distribucin comercial. Ambas
son similares, sobre todo dedicada al usuario medio. Podran ser la
segunda distribucin ms sencilla.

INSTALACION DE LINUX
Situaciones importantes dentro de la instalacin:
- Verificar el hardware bsico, DD 8GB, 800 MHZ, RAM 128, CDROM, otros.
-Instalacin en una nueva particin. Opcional con arranque dual.
- Instalacin mediante el uso de una maquina virtual.
- Particionamiento del sistema. Particionamiento automatico o manual con DISK
DRUID: /HOME, /, SWAP, /boot
- Nivel de seguridad: alto, intermedio, ningn firewall
- contrasea del root
- paquetes a instalar. Editores, interfaz grafica KDE o GNOME, lenguajes, etc.
- Servicios luego de la instalacin pueden configurarse. ftp, http, etc
TERMINAL O SHELL
Primero haremos un estudio de los comandos mas usados en Linux en modo
texto es decir utilizando un terminal.
Una TERMINAL (o un SHELL, o un INTRPRETE DE COMANDOS, ambos casi
sinnimos de TERMINAL) es una ventana que nos permite digitar comandos.
La manera ms habitual de administrar una mquina Linux (instalar paquetes,
ver los registros de actividad, crear o modificar usuarios...) suele hacerse desde
un terminal o intrprete de comandos, que es en modo texto, y generalmente
nos muestra un PROMPT. Un prompt es lo que el intrprete de comandos
escribe automticamente en cada lnea antes de que nosotros podamos darle
instrucciones mediante COMANDOS.
Aparte de dar instrucciones a nuestra mquina, desde una terminal podremos
editar textos, archivos de configuracin, apagar y reiniciar el sistema, instalar
nuevos programas, leer el correo y muchas cosas ms. Aprenderemos que los
sistemas grficos no son imprescindibles.

Conceptos bsicos de la terminal BASH


Cuando arranquemos nuestra mquina con Linux y termine de cargar todos los
procesos inciales, o bien veremos una pantalla grfica de login o una de texto.
Es posible que no podamos acceder a la primera terminal porque quizs est
siendo utilizada por los procesos de login grfico si es que ya hemos ingresado
desde all. Las terminales se suelen nombrar tty0 para la primera, tty1 para la
segunda, y as sucesivamente.
Consideraciones sobre:
-Directorio padre ..
-Directorio raz /
-Directorio actual .
-Directorio casa HOME
COMANDOS

cmd opc path/archivos

Ls listan los contenidos de directorio. Dir, vdir


Opciones
-l formato ampliado
-a ocultos
-t clasifica por hora
Ejemplos ls,

ls a*,

ls /home/*

Mkdir crea directorios


Ejemplos

mkdir programas
Mkdir programas/java programas/visual

Ejercicio: crear una estructura jerrquica de directorios


rmdir borra directorios vacios
ejemplo rmdir programas
cd cambia de directorios
sintaxis cd path/directorio
ejemplo
cd /home
cd ..
cd .
cd
cd $HOME
pwd imprime el nombre del directorio actual y su ruta completa
cp copia ficheros y directorios
sintaxis cp path/origen/archivo path/destino
ejemplos cp /bin/name /home/usuario

ejercicios: planteada la estructura de directorios copiar archivos de diferentes


ubicaciones
rm borra ficheros o directorios
sintaxis
rm opciones fichero
-i pide confirmacin
-f no pide confirmacin
-r borra recursivamente arboles de directorio
ejemplo rm f programas/*
mv mueve renombra ficheros
sintaxis cp -opciones path/origen/archivo path/destino/archivo
-f no pide confirmacin
-i pide confirmacin cuando destino existe
Ln crea enlaces entre ficheros (accesos directos)
Sintaxis ln opcion archivo archivo_nuevo
-f omite los mensajes del sistema
Ejemplo cp /bin/tar .
mv tar hola
ln hola enlace
find sirve para buscar archivos

cat

sintaxis

find [path ] -opciones [expresiones]


-name
el archivo a buscar
-perm
ficheros con tales permisos
-type ficheros de tal tipo

Ejemplos

find
-name hola
find / -name hola
Find -perm 777

visualiza archivos
sintaxis cat -opciones archive
-u salida sin buffer
-v imprime los caracteres
Ejemplo cat archive
Cat archivo1 archivo2
redireccionamiento
Cat u ) nombres
.- escribir el contenido del archivo

more se utiliza para filtrar archivos un nmero determinado en pantalla


ejemplo ls /bin | more
cat archivoLargo |more

OTROS COMANDOS
Date despliega la fecha
nl
numero de lneas de un archivo
wc
cuenta el nmero de lneas, palabras y caracteres de un archivo
ls > listado
wc -c listado
wc -l listado
echo saca un mensaje en pantalla
clear borra pantalla
sort ordena archivos de texto
sort -n archivo
sort -r archivo
grep busca cadena en un archivo
grep juan nombres
man ayuda
mail despliega mensajes del usuario
write escrib un mensaje a un usuario
ps
lista los procesos actuales
-a todos
-all listado largo
-e informacin de todos los procesos que se ejecutan ahora
-ef formato largo
-eA formato largo
-x presenta el estado de cada proceso
pstree presenta los procesos en forma de arbol
Kill

mata procesos
Kill -9 pid
Cal
calendario
Who indica el o los usuarios conectados
passwd cambiar clave
mesg autoriza o no recibir mensajes -n -y
sleep suspende la ejecucin en segundos
PERMISOS CON EL COMANDO chmod
Permite cambiar los atributos de lectura, escritura y ejecucin de un archivo o
directorio
Sintaxis chmod UGO nombre_archivo
P numero que cambia los permisos del propietario
G numero que cambia los permisos del grupo
O numero que cambia los permisos del otros
-r w x r w x r w x
421421421
P
G
O
X=1
W=2
R=4

Ejemplo chmod 734 archivo

Otra forma de cambiar los atributos mediante el modo simblico:


u ususario
g grupo
o otros
a todos
+ aade
- quita
= asigna
Ejemplo chmod a=r,u+w,o+x archivo
chmod go=x archivo
chmod a+rwx archivo
Redireccionamiento y tuberas (pipes)
Redirecciona la entrada y salida estndar
Ejemplos
pwd > archivo
cat > archivo
cat u >> archivo
who | wc l
cat nombres | sort +1
cat nombres | sort +n
cat archive | grep luis
grep luis | archivo
EDITOR DE TEXTOS VIM BASICO

VIM es un editor de textos para Linux. Es un derivado de VI, VIM significa VI iMproved,
es decir, el mismo editor VI pero mejorado. Y en este captulo aprenderemos a hacer un uso
bsico de este fabuloso editor.
VIM tiene dos grandes modos para funcionar, el modo de edicin y el modo comandos.
Para pasar del modo comandos (que es en el que se inicia VIM) al modo edicin, pulsamos
la tecla I o Insert. Para pasar del modo edicin al modo comandos pulsaremos la tecla Esc.
Para iniciar VIM, haremos lo siguiente:
$ vim <fichero>

VIM iniciar en el 'Modo Edicin' que explicar en la siguiente seccin.

Modo Edicin

Este es el modo en el que podremos editar un texto, o crear uno nuevo... Si pulsamos la
tecla I o Insert otra vez cambiaremos el modo Insert por el modo Replace. No creo que
haya que explicar mucho las diferencias entre insertar texto o reemplazar el texto. Para
movernos por el fichero podemos utilzar las flechas,Re.Pg y Av.Pg.
Nota

Para volver al modo comandos, sirve con pulsar la tecla Esc.


Modo comandos

Este es el modo ms interesante de VIM, con l podemos hacer cosas muy curiosas, como
por ejemplo, activar el resaltado de sintaxis, deshacer, abrir un nuevo fichero, guardar, etc..
En la siguiente tabla explicar los comandos que pueden resultar ms interesantes.
Tabla 4.1. Comandos ms usuales en VIM

Comando

Ejemplo de uso
(si aplica)

Descripcin

:w

Guarda el buffer en el fichero

:w [fichero]

Guarda el buffer en fichero (como un


:w ~/ficherito
Save as...)

:q

Salir de VIM

--

:q!

Salir de VIM sin guardar los cambios

--

:wq

Salvar y guardar

--

:u

Deshacer

--

Ctrl-R (^R)

Rehacer

--

:d :dN

Borrar la lnea corriente o borrar N


-lneas a partir de la actual.

:syntax [ on | off ]

Activa/Desactiva
sintaxis

el

resaltado

--

de

:syntax on

Comando

Descripcin

Ejemplo de uso
(si aplica)

:s/[patrn]/
[reemplazo]/g

Sustituye [patrn] por [reemplazo] en


s/hoal/hola/g
la lnea actual.

:![comando]
[argumentos]

Ejecuta [comando] pasndole los :!gcc -g -O0 -o


argumentos [argumentos] en el shell prueba prueba.c

:+[nmero]

Baja [nmero] lneas

:+256

:-[nmero]

Sube [nmero] lneas

:-12

:[nmero]

Va a la lnea [nmero]

:1207

:+/[patrn]

Busca [patrn] en el documento

:+/donde te metes

El modo especial: VISUAL

Para entrar a este modo tenemos que pulsar v en el modo comandos. Para salir de el
pulsaremos Esc.
El modo VISUAL nos permitir eliminar grandes bloques de texto sin tener que ir borrando
lnea a lnea. Para ello entraremos en el modo VISUAL (pulsando v) y nos moveremos con
los cursores para seleccionar el bloque que queremos eliminar. Una vez tenemos
seleccionado el bloque, pulsamos Supr y ya est, VIM nos informar de que hemos
eliminado un bloque de "n" lneas.
Ejercicios:
-crear un archivo que incluya las siguientes columnas: numero apellido nombre telfono.

Usuarios
Linux es un sistema multiusuario por lo que es necesario la administracin (segura) de los
distintos usuarios que van a hacer uso de los recursos del sistema. De momento no vamos a
dar grandes nociones de seguridad, pero s una introduccin a los tipos de usuarios y qu
privilegios deben tener.
Dentro de un sistema existen al menos 3 tipos de usuarios.

Usuarios normales con ms o menos privilegios que harn uso de los recursos del
sistema. Son generalmente inexpertos y propensos a causar problemas.
Simplemente deben poder usar algunos programas y disponer de un directorio de
trabajo.
Usuarios de Sistema son aquellos encargados de los demonios del sistema. Estos
usuarios tendrn los privilegios necesarios para poder hacer su tarea, gestionar estos
usuarios es de gran importancia. (configurar servicios del sistema).
ROOT l lo puede todo, en principio no hay restricciones para L.

Otro concepto que lleva a esta otra clasificacin es, el de los usuarios de los servicios del
host. Este tipo de usuarios simplemente accede remotamente a algunos servicios de nuestra
mquina, tales como correo-electrnico o FTP. Esto nos lleva a definir:

Usuarios de login. Estos primeros, pueden hacer login en el sistema y usar una shell
en l. Es decir, tienen una shell vlida de inicio generalmente, /bin/bash.
Usuarios sin login. Este tipo de usuarios, bien son usuarios de sistema, o bien
usuarios de los servicios del host. En ambos casos no pueden hacer login en el
sistema directamente ni usar un shell. En otras palabras, no tienen asignado un shell
vlido. Su misin, es "poseer" algunos archivos y directorios del sistema, y
manejarlos restringidamente a travs de algunos programas (el servidor FTP, el
servidor de correo electrnico, etc. darn a los usuarios de los servicios del host los
privilegios suficientes: almacenar mensajes, etc.). En el caso de los usuarios de
sistema, poseern adems algunos procesos.

Administracin de Usuarios.

La administracin de usuarios se realiza en todas las distribuciones de manera muy


parecida, dada la herencia UNIX, aunque en el fondo todas hacen lo mismo.
Cmo aadir un usuario al sistema? Hay que seguir una serie de pasos que relatamos a
continuacin. Pero antes veremos la estructura de los archivos que vamos a tocar.

- Archivo que mantiene la base de datos de los usuarios del sistema y


tiene la siguiente forma:
/etc/passwd

nombre_de_usuario:password(si
es
x):uid:gid:comentario:home_del_usuario:shell

shadow

ser

Estos campos son:

o
o

Nombre de Usuario - Es el nombre con el


Password - La palabra de paso necesaria

que entrar en el sistema.


para entrar (cifrada). Si nuestro
sistema usa shadow (explicado despus), este campo ser una x

UID

GID

Comentario

home_del_usuario

Shell

- (User ID) Nmero que lo identifica en el sistema, recordemos que los


ordenadores se llevan mejor con los nmeros.
- (Group ID) Nmero que identifica al grupo principal al que pertenece
el usuario.
- Opcional, si es necesario aclarar algo, esto solo es para el
administrador, pues el sistema no lo usa.
- Ruta absoluta del directorio de trabajo del usuario.

- Intrprete de comandos del usuario, que ser el que use


inmediatamente despus de entrar en el sistema, por defecto es /bin/bash.
Para usuarios sin login, aunque puede que ahora no lo necesites, la shell no
vlida tpica para poner en este campo es /bin/false.

/etc/group

- Archivo de los grupos del sistema. El archivo tiene la siguiente

estructura:
nombre_grupo:password:GID:lista_usuarios

- Por defecto con los comandos habituales se crea un


grupo con el mismo nombre que el usuario creado, aunque pueden existir
otros grupos con nombres especficos.
password - Se usa para dar a una serie de individuos un mismo directorio
con una cuenta comn.
Nombre del Grupo

- (Group ID) Nmero de Identificacin en el Sistema del grupo.

GID

lista de usuarios

que pertenecen al grupo, separados por comas.

- Para sistemas que usen shadow, que no es ms que una medida de


seguridad. Los sistemas que no usan shadow guardan el password en /etc/passwd
/etc/shadow

pero este archivo tiene la peculiaridad de que debe ser legible por todo el mundo, si
no, no podra ni hacerse un ls. Este archivo podra caer en manos de un usario
ilegtimo y este ejercer tcnicas de crackeo sobre las claves. Como solucin del
problema lo que se hace es almacenar todos los datos de los usuarios en el
/etc/password menos sus contraseas; que se almacenan en /etc/shadow, el cual
s tiene restringidos los permisos y no es accesible por los usuarios normales.
usuario:password:das del ltimo cambio: dias antes del cambio:Dias
despues
del
cambio:
tiempo
de
aviso:dias
antes
de
la
inhabilitacion: perido que lleva caducado:reservado:
o
o

Usuario - Nombre del usuario


password - Aqu s, es el password

Tiempo del ltimo cambio de password

Das antes del cambio

cifrado.

- Pero el tiempo cuenta desde


el 1 de enero de 1970, comienzo de la era UNIX.
- Periodo (en das) donde el password debe ser

cambiado.
o

Dias despues del cambio

Tiempo del aviso

Inhabilitacin

Perido caducado

- En los das despus donde debe ser cambiado.

- Periodo en el que el sistema tiene que avisar de la


necesidad del cambio.
- Das antes de la inhabilitacion de la cuenta.
- Das desde el 1 de enero de 1970 en el que la cuenta

est deshabilitada.
o

Campo reservado

adduser usuario ----- crea usuarios


John --single passwd.txt ----- herramienta para ver la clave de usuario
gzip -d rockyou.txt.gz
John --wordlist /usr/share/wordlist/rockyou.txt passwords.txt
Bien ahora, ya que conocemos la estructura de los archivos, creemos un nuevo usuario, slo
tendremos que usar un editor, que por razones de seguridad son vipw para el archivo
/etc/passwd y vigr para editar /etc/group; ambos usan como editor el que est en la
variable $EDITOR del sistema, y passwd para crear el password. Sigamos los siguientes
pasos:
1. Lo primero es entrar como root

2. $ su 3. password:
4. # vipw /etc/passwd

5. Antes de nada, el comando su se explica al final de este captulo. Ya estamos


editando el fichero /etc/passwd, ah estarn las lineas de otros usuarios que ya
estn creados. Esto que sigue es un ejemplo.
6. prueba:x:1005:1005::/home/prueba:/bin/bash

Hemos escrito un nombre cualquiera (prueba), el password le ponemos x dado que


es un sistema con shadow. Si queremos crear una cuenta sin contrasea, en este
campo en vez de la x no pondremos nada. ADVERTENCIA: Esto es un
considerable riesgo de seguridad. Incluso una cuenta de usuario puede usarse para
hallar informacin til para posteriormente poder atacar un sistema.
7. Ahora hay que tocar en /etc/group para crear el grupo del usuario (todo usuario
tiene un grupo principal), le damos el mismo nombre que al usuario, y el GID que
hemos puesto antes, el 1005. Por supuesto, tanto los UID como los GID no pueden
estar repetidos, as que nos aseguramos de coger uno que no est ya cogido.
Entonces, hacemos:
8. # vigr /etc/group
prueba:x:1005:

9. Editamos /etc/shadow :
10.

prueba:!:12173:0:99999:7:::

Bueno lo peor ser calcular la fecha de creacin pero sino randomized() :-). Nota
que en el campo password le hemos puesto ! porque ahora le daremos un password
con passwd.
11.
12.
13.
14.

# passwd prueba
Enter new UNIX password:
Retype new UNIX password:

Ejecutamos passwd y pasamos el nombre del usuario como argumento.


Introducimos el password para ese usuario, hay que darse cuenta de que a
medida que escribimos, por razones obvias de seguridad no se ir escribiendo
nada.
Repetimos la password
15. Si no hay error, listo.
16. Ahora le tenemos que crear el directorio de trabajo, por convenio los directorios de
trabajo de los usuarios normales estn bajo /home, y suelen ser /home/usuario.
17.

# mkdir /home/prueba

18. Copiamos los archivos de inicio desde /etc/skel , que contiene principalmente
archivos de configuracin por defecto.
19.

# cp /etc/skel/.* /home/prueba

20. Y por ltimo, hay que hacer que tome posesin de lo que es suyo:
21.

# chown prueba.prueba -R

/home/prueba

Este ltimo comando se explica ms adelante. Ahora slo falta hacer:


# su - prueba
$

Tambin, en vez de usar su, podemos hacer login en el shell directamente con el nuevo
usuario creado para comprobar que lo hemos hecho correctamente.
Esto es lo que hace cualquier Linux para crear una cuenta. La forma de borrar un usuario es
igual de fcil, borrndolo en /etc/passwd, /etc/group y en /etc/shadow. Cualquier
rastro del usuario debera tambin ser eliminado, adems de que sera bastante
recomendable (si no necesario) hacer una bsqueda de los archivos que el usuario
mantiene. Esta bsqueda podra ser:
# find / -uid uid_del_usuario > archivos_del_usuario

De esta manera los podemos guardar, revisar y hacer lo conveniente con los archivos. Ms
sobre find en secciones posteriores.
EJERCICIO. Utilizando los pasos anteriores crear 10 usuarios diferentes (puede utilizar el
mismo ID de grupo).
EL COMANDO SU
El comando su (Set User) est relacionado con el login en el sistema y con los permisos. El
uso principal de este comando es que un usuario normal adquiera los permisos de otro
usuario del sistema (incluido root) siempre y cuando sepa su password.
Sintaxis:

su usuario
su usuario
su

en Ubunto sudo su -

esto permite ir a la cuenta de root

La diferencia entre su usuario y su - usuario es, que mientras que con el primer
comando simplemente adquirimos los permisos de usuario, con el segundo comando es
como si estuvisemos haciendo login desde el principio con usuario, as, todas las variables
de entorno y dems sern cargadas igual que si hubisemos hecho login realmente. Esto
tambin se aplica para root (su -). La shell que se arranca mediante la segunda forma se
llama shell de login, y como puedes comprobar, no se puede suspender como hicimos
anteriormente. Salimos de ellas tambin con exit.
El usuario root puede usar su o bien su - sin necesidad de introducir ningn password
para adquirir en un shell los permisos de cualquier usuario del sistema.
INTRODUCCION AL SHELL SCRIP
Un script es como se llama a un archivo (o conjunto de archivos) que contiene
instrucciones (en nuestro caso comandos de bash), y que necesita de un programa ayudante
para ejecutarse (en nuestro caso la propia terminal bash ser el programa ayudante). Un
script tiene cierta similitud con un programa, pero existen diferencias. Generalmente, los
programas estn en lenguaje de mquina (la mquina lo entiende directamente), mientras
que los scripts son archivos que contienen en formato texto los comandos o instrucciones
que la aplicacin ayudante ejecutar.
MI PRIMER SCRIP BASH (ejemplo 1)
Ejemplo: digita en el prompt del sistema miscript.sh
#!/bin/bash

# Esta lnea ser ignorada


# Esta tambin

echo "Hola"
echo "Soy un script de shell."

la primera lnea: #!/bin/bash caracterstica de todos los scripts en Linux, no solamente


los de bash. Tras #! indicamos la ruta a la aplicacin ayudante, la que interpretar los
comandos del archivo. Ejecutamos de la siguiente manera:
$ bash miscript.sh
Hola
Soy un script de shell

Otra forma de ejecutarlo es dndole permisos de ejecucin al archivo miscript.sh


$ chmod +x miscript.sh
$ ./miscript.sh
Hola
Soy un script de shell

Al darle permisos de ejecucin, podemos ejecutar ahora nuestro script como si de un


programa normal se tratase. Esto es posible gracias a la primera lnea del script, que hace
que se llame inmediatamente a la aplicacin ayudante para procesar los comandos. Hemos
podido observar que a nivel del shell, nuestro script es un programa como otro cualquiera,
que podemos ejecutar e incluso ponerlo en algn directorio listado en la variable de entorno
$PATH, como por ejemplo /usr/local/bin y ejecutarlo como si de un programa del

sistema se tratase, simplemente tecleando su nombre. Creo que ya te vas imaginando la


gran utilidad de los scripts de shell.
Revisa el contenido de la vriable del sistema PATH asi:
echo $PATH.
Convierte miscript.sh en un comando parecido a los comandos del Shell asi:
Copia miscript.sh al directorio /home/usuario/bin
O aade la ruta del archivo miscript.sh en la variable PATH
***** ejercicio 2 en laboratorio
Ejemplo .profile
TERM= vt100
expor TERM
banner HOLA
PS1= $LOGNAME>
FILE men
Echo escoja una opcin
------------------1. listar
2. ruta
3. salir

file enlace
men
read opc
if [ $opc = 1 ]; then
ls l
fi
if [ $opc = 2 ]; then
pwd
fi
if [ $opc = 3 ]; then
sleep 4
exit
fi

**** Ejercicio 3 parmetros posicionales


Siempre al digitar un comando se introduce algunos argumentos. Estos argumentos se
almacenan en unas variables del sistema llamados parmetros posicionales:
Cat argumento.sh
echo $0
echo $1
echo $2
echo $3
echo $4
echo $*
Dar permisos para la ejecucin chmod 777 argumento.sh

Ejecutar el Shell asi: argumento.sh uno dos tres cuatro


A este tipo de argumentos se les denomina parmetros posicionales donde,
$0 hace referencia al nombre del comando
$1 hace referencia al primer argumento posicional
$2 hace referencia al segundo argumento posicional
etc
y $* se referencia a todos los parametros

****Ejercicio 4
crearDir
if test $# eq 0
then
faltan parmetros
else
mkdir $HOME/$1 $HOME/carpetas/$1/$2 $HOME/$1/$3
cp $4 $HOME/$1/$3
*********comando borrar1 y limpiar

Ver 1 :Mueve archivo a un basurero


mv $* $HOME/basurero
Ver2: Comprueba si existe la carpeta basurero
if [ -d $HOME/basurero ] : then
mv $* $HOME/basurero
else
echo la carpeta se est creando
sleep 3
mkdir $HOME/basurero
mv $* $HOME/basurero
fi

Ver3: Comprueba si existe la carpeta basurero


if test $# -eq 0

then
echo faltan argumentos
exit
else
if [ -d $HOME/basurero ] : then
mv $* $HOME/basurero
else
echo la carpeta se est creando
sleep 3
mkdir $HOME/basurero
mv $* $HOME/basurero
fi
fi

at demonio
atq lista los trabajos planificados
atrm 18 borra el trabajo 18 planificado

VARIABLES (ejemplo 2)
Recordamos que una variable es un nombre al que le hacemos corresponder un valor. Este
valor puede ser un valor numrico o bien una cadena de texto indistintamente en los scripts
de shell. Los nombres de las variables convienen que comience por una letra, despus
veremos por qu.
En el siguiente ejemplo variables.sh aprenderemos a usar las variables en nuestros scripts:
#!/bin/bash
# Script de muestra del uso de las variables
# Asignacin de una variable:
variable=5
otravariable=10

tercera=2
resultado1=$[5*10/2]
resultado2=$[$variable*$otravariable/$tercera]
echo " "
echo "El resultado de 5*10/2 es $resultado1 ,"
echo "que efectivamente coincide con $resultado2 "
echo " "
frase="Introduzca lo que usted quiera:"
echo $frase
read entrada_del_usuario
echo " "
echo "Usted introdujo: $entrada_del_usuario"
exit 0

Repasemos el ejemplo despacio. En primer lugar tenemos la lnea que ser siempre la
primera en nuestros scripts, y que ya conocemos, la que dice cul es el programa que
ejecutar las instrucciones del script.
Siguiendo tenemos la asignacin de algunas variables, esto es, estamos dando valor a
algunas variables que luego usaremos. Observa que entre el nombre y el valor, NO HAY
ESPACIOS, es variable=valor. Procura recordarlo. Ahora cada variable tiene el valor que le
hemos asignado. Podramos cambiarlo simplemente de la misma forma, pero poniendo otro
valor distinto, que sobreescribira a cualquiera que tuviese antes la variable. As,
tercera=7 hara que el valor de la variable tercera fuese de ah en adelante 7.
Despus nos encontramos con el comando $[ ], que nos permite hacer operaciones
aritmticas, obteniendo el resultado. En la primera de esas lneas, la variable resultado1
se queda con el valor resultante de efectuar la operacin entre los nmeros. En la lnea
siguiente, vemos que para REFERIRNOS al valor que tiene una variable, colocamos
delante de su nombre el signo $. Donde quiera que pongamos ese signo delante del nombre

de una variable, todo ello ser reemplazado por el valor de la variable. As, la expresin que
se evala al final es la misma que la de la lnea anterior, pues todas las variables quedan
sustituidas por sus valores reales antes de que se haga la operacin. El comando echo ser
nuestro mejor aliado para hacer que nuestro script saque informacin por la pantalla.
A la variable frase le vamos a asignar una cadena de texto. Date cuenta de que esta vez
tampoco hay espacios en medio de la asignacin y que EL TEXTO VA SIEMPRE ENTRE
COMILLAS, pudiendo ser simples o dobles. La estructura es entonces variable="texto". En
la lnea siguiente, con el comando echo de nuevo, podemos sacar por pantalla el texto que
habamos guardado en la variable.
Atencin a la lnea siguiente. El comando read va a ser nuestra va de comunicacin con el
usuario en nuestros scripts. Funciona de este modo: primero, ponemos read, el comando
que hace todo el trabajo, y a continuacin, ponemos el nombre de la variable donde
queremos que la entrada del usuario quede almacenada (en nuestro caso, la variable es
entrada_del_usuario). Cuando a la hora de ejecutarse, el script llegue a esa lnea,
esperar a que el usuario escriba algo y presione la tecla INTRO. En ese momento, lo que
el usuario escribi antes de de presionar INTRO quedar guardado en la variable, y luego
podremos hacer uso de estos datos que el usuario introdujo, como hacemos en la lnea
siguiente, sacarlos de nuevo por pantalla.
Por ltimo tenemos el comando exit. Este comando al final del script no es especialmente
til, pero si pusisemos cualquier cosa debajo de l ya no sera ejecutada.
termine".
Para terminar de comprender este segundo script de ejemplo, ponlo en un fichero llamado,
por ejemplo, variables.sh con el editor vim. Dale permisos de ejecucin como hicimos
antes y despus ejectalo:
$ ./variables.sh

El resultado de 5*10/2 es 25 ,
que efectivamente coincide con 25

Introduzca lo que usted quiera:


Yo tecleo esta frase

Usted introdujo: Yo tecleo esta frase.

EJERCICIO: realizar z = a+b ; las variables a y b son introducidas por teclado.

COMANDOS POSIBLES ( ejemplo 3 )


En un script pueden escribirse todos los comandos que existen en bash; esto incluye
cualquier programa, redirecciones de entrada o salida, pipes, etc.
Ejemlpo3.sh
#!/bin/bash
MI_VARIABLE=/home
# No muy adecuado:
ls -l $MI_VARIABLE
# Bastante mejor:
ls -l "$MI_VARIABLE"

Utilizar el comando chmod y luego ejecutarlo el ejemplo.


CONCEPTO DE VALOR DE RETORNO ( EJEMPLO 4 )

En el shell bash (y por extensin, en nuestros scripts) el valor de retorno del ltimo
programa o comando ejecutado queda almacenado en la variable especial $? .
Veamos un ejemplo:
retorno.sh
#!/bin/bash

echo "Listando archivo existente..."


ls archivo_existente
echo "El valor de retorno fue: $?"
echo " "
echo "Listando archivo inexistente..."
ls archivo_inexistente
echo "El valor de retorno fue: $?"
exit

En el primer caso, pedimos a ls que liste un archivo existente. Lo lista con xito y por tanto
el valor de retorno vale cero. En el segundo caso le pedimos que liste un archivo
inexistente. Como eso no es posible, el comando no termina con xito y el valor de retorno
es distinto de cero.
La utilidad de conocer el valor de retorno al ejecutar un programa en nuestros scripts salta a
la vista: cuando veamos las sentencias condicionales podremos hacer que el script haga una
cosa u otra en funcin de si un programa termin con xito o no.
PASAR Y PROCESAR ARGUMENTOS ( ejemplo 5 )

Los comandos que ejecutamos normalmente pueden recibir opciones y argumentos o


parmetros. como por ejemplo ls -l /bin . En ese ejemplo, ls es el comando, -l es una
opcin y /bin es un argumento
Argumento.sh
#!/bin/bash
echo "\$0 contiene $0"
echo "\$1 contiene $1"
echo "\$2 contiene $2"
echo "En total hay $# parametros"

Dale permisos y ejecutalo de la siguiente forma:


$ ./args.sh
$0 contiene ./args.sh
$1 contiene
$2 contiene
En total hay 0 parametros
$ ./args.sh buenos dias
$0 contiene ./args.sh
$1 contiene buenos
$2 contiene dias
En total hay 2 parametros

A este tipo de argumentos se les denomina parmetros posicionales del shell


donde el parmetro $0 ha referencia al comando, $1 hace referencia al primer
argumento, $2 hace referencia al segundo argumento y as sucesivamente, el
parmetro $* hace referencia a todos los argumentos del comando. La variable
$# contiene el numero de argumentos o parmetros posicionales.
EJERCICIO Utilizar parmetros posicionales y realizar un Shell que cree un
rbol de directorios y copie un archivo del directorio bin
EVALUACION DE CONDICIONES. (ejercicio 6 )
Permite hacer que nuestro script se comporte de una forma u otra segn el
usuario introduzca uno u otro argumento, o segn una variable tenga tal o cual
valor.

El comando que nos permite evaluar condiciones en bash es test. El valor de retorno de
test ser cero (0) si la expresin es VERDADERA (TRUE), y en cambio, ser uno (1) si la
expresin que le pasamos a test es FALSA (FALSE).
Ejemplo comprobamos si dos nmeros son iguales o no: (escribir en el promt del sisteme)
$ test 7 -eq 7
$ echo $?

0
$ test 7 -eq 8
$ echo $?
1

Ahora supn que antes de todos aquellos comandos hacemos:


$ a=7
$ b=8
$ test $a -eq $a

Usamos las variables $a y $b. No hay cambios, test reemplaza las variables por su valor y
despus efecta la comprobacin, siendo el resultado final el mismo.
Otra forma de evaluar condiciones en lugar de test es utilizar corchetes [ ], hay que dejar
espacios.
$ [ 3 -gt 2 ]
$ echo $?
0

Signos de comprobaciones.
-eq
si son iguales
-en
no son iguales
-gt
es mayor que
-ge
es mayor o igual que
-lt
es menor que
-le
es menor o igual que
ESTRUCTURAS CONDICIONALES CON IF
Las estructuras condicionales tienen este aspecto:
if EXPRESION1; then

# Bloque 1
elif EXPRESION2; then
# Bloque 2
else
# Bloque 3
fi

( ejercicio 7 ) bsqueda.sh
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Necesito dos argumentos, el primero"
echo "es el fichero donde debo buscar y"
echo "el segundo es lo que quieres que"
echo "busque."
echo " "
echo "Uso: $0 <fichero> <patron_busqueda>"
echo " "
exit
fi
FICHERO=$1
BUSQUEDA=$2
if [ ! -e $FICHERO ]; then

echo "El fichero no existe"


exit
fi
NUM_VECES=`cat "$FICHERO" | grep --count "$BUSQUEDA"`
if [ $NUM_VECES -eq 0 ]; then
echo "El patron de busqueda $BUSQUEDA no fue encontrado"
echo "en el fichero $FICHERO "
else
echo "El patron de busqueda $BUSQUEDA fue encontrado"
echo "en el fichero $FICHERO $NUM_VECES veces"
fi

Ejecutar de esta forma ( bsqueda.sh archivo cadena_busqueda )


Este ejemplo ya se va pareciendo a un programa de los buenos. Estudimoslo en detalle:
En primer lugar comprobamos que nos han pasado dos argumentos: el fichero donde buscar
y la cadena de bsqueda. Si no es as, le indicamos al usuario cmo debe ejecutar el script y
salimos.
A continuacin comprobamos que el fichero existe. Si no es as, advertimos
convenientemente y salimos.
Ahora viene la lnea que hace todo el trabajo: NUM_VECES=`cat "$FICHERO" | grep
--count "$BUSQUEDA"` Al entrecomillar con las comillas inclinadas el comando, su
salida, en vez de salir por pantalla, quedar guardada en la variable NUM_VECES. As,
mediante cat y el pipe, grep cuenta el nmero de veces que el valor de $BUSQUEDA est
en el fichero, que nos queda guardado en $NUM_VECES.
Ejercicio: realizar un Shell que permita escoger opciones y ejecutar las sentencias de la
opcin sealada.
1. Listar
2. Imprimir ruta con pwd
3. Visualizar los procesos en ejecuccin
4. Salir

COMPROBAR EL VALOR DE UNA VARIABLE CON CASE


La estructura case:
#!/bin/bash
case $VARIABLE in
valor1)
# Bloque 1
;;
valor2)
# Bloque 2
;;
.
.
.
*)
# Ultimo Bloque
;;
esac

y valor2 son valores que nosotros esperamos que la variable pueda contener, y
Bloque 1 y Bloque 2 son los bloques de comandos con lo que queremos que se haga en
cada caso. Podemos poner tantos valores reconocibles como queramos. Los puntos son
precisamente para indicar aquello. El * (asterisco) es un comodn, cualquier cosa que no
haya coincidido en alguna de las de arriba coincidir aqu.
valor1

( Ejercicio 8 ) case.sh
#!/bin/bash
# case.sh
if [ $# -lt 1 ]; then
echo "Error. Esperaba al menos un parametro"
exit 1
fi
case $1 in
--opcion1)
echo "--opcion1 es una opcion reconocida"
exit 0
;;
--opcion2)
echo "--opcion2 es una opcion posible"
exit 0
;;
linux)
echo "\"linux\" es un argumento reconocido"
exit 0

esac

;;
*)
echo "Parametro no reconocido"
exit 1
;;

Ejecuta de la siguiente manera:

case.sh
Case.sh opcion1
Case.sh opcion2
Case.sh Linux
Case.sh parmetros
Ejercicios: - realizar un Shell utilizando case que permita escoger opciones y ejecutar las
sentencias de la opcin sealada.
1. Listar
2. Imprimir ruta con pwd
3. Visualizar los procesos en ejecuccin
4. Salir
Ejercicio: realizar un Shell utilizando case que permita borrar archivos.

#!/bin/bash
# del.sh
if [ $# -eq 0 ]; then
echo "Error de sintaxix"
exit 1
fi
echo desea borrar el archivo?
read ok
case $ok in
y*)
echo se ha borrado el archivo
rm $1
;;
N*)
echo el archivo no ha sido borrado
;;
esac

BUCLES
Tenemos dos tipos de bucles diferentes en bash: for y while.
Ciclo for ( Ejercicio 9 )
$ for i in pedro pepe juan jose; do
> echo "Hola $i"
> done
Hola pedro
Hola pepe
Hola juan
Hoja jose

En primer lugar apreciamos que todo lo que se puede hacer en un script tambin se puede
hacer en bash. La estructura de for es la siguiente:
for nombre_var in LISTA ;
comando 1
comando 2
# Y asi los que queramos
done

do

nombre_var es el nombre de una variable (el que nosotros queramos, y slo el

nombre, no precedida de $). LISTA es una lista de elementos, que se la


podemos dar como en el ejemplo anterior, ah en ese comando, o podemos
poner una variable que ya contenga una lista de elementos.
( ejercicio 9 ) listador.sh
#!/bin/bash
# Listador de archivos y directorios ocultos
DIR=$1
if [ -z $DIR ]; then
echo "El primer argumento debe ser un directorio"
exit 1
fi
if [ ! -d $DIR ]; then
echo "El directorio debe existir"
exit 1
fi
for i in $DIR/.*; do
echo "Encontr el elemento oculto $i"
done
echo "Saliendo..."
.* Hace referencia a todos los archivos y directorios ocultos de $DIR.

BUCLE CON WHILE


El otro tipo de bucle posible en bash-scripting es el bucle while. Este bucle
viene a cumplir con el propsito de "quiero que se haga esto mientras que se
d esta condicin". Su estructura es la siguiente:
while test CONDICION; do
# Comandos a ejecutar
done

(ejercicio 10) conteo.sh


#!/bin/bash
j=0
while [ $j -lt 10 ]; do

echo "j vale $j"


j=$[$j+1]
done
# Aqui sigue el flujo de ejecucion normal del script

Este ejemplo es interesante. La condicin para que el bucle se siga ejecutando es que j
valga menos de 10. Observa la forma mediante la cual en cada ciclo del bucle sumamos 1 a
la variable j.
Tanto en el bucle for como en el while, podemos usar break para indicar que queremos
salir del bucle en cualquier momento:
( ejercicio 11 ) salto.sh
#!/bin/bash
MINUM=8
while [ 1 ]; do
echo "Introduzca un nmero: "
read USER_NUM
if [ $USER_NUM -lt $MINUM ]; then
echo "El nmero intrododucido es menor que el mo"
echo " "
elif [ $USER_NUM -gt $MINUM ]; then
echo "El nmero introducido es mayor que el mo"
echo " "
elif [ $USER_NUM -eq $MINUM ]; then
echo "Acertaste: Mi nmero era $MINUM"
break
fi
done
# Comandos inferiores...
echo "El script sali del bucle. Terminando..."
exit

La condicin es que el bucle se ejecute siempre (test 1 siempre retornar TRUE, y el bucle
se seguir ejecutando). Pero, si el nmero introducido es el mismo que el valor de
$MINUM , break har que se salga de el bucle y contine ejecutando los comandos
inferiores.
Ten en cuenta que en bash scripting, usando la notacin $[ ] para hacer
clculos slo podemos usar nmeros enteros.

Funciones

Si bien las funciones en bash scripting difieren de lo que son en la mayora de los lenguajes
de programacin, s comparten, en cambio, su razn de ser bsica.
Una funcin en un script es un conjunto de lneas (comandos) a los que se les da un nombre
especial y pueden ser ejecutados desde cualquier punto del script mediante el uso de ese
nombre especial.
Una funcin se DEFINE de la siguiente forma:
function nombre_de_la_funcion () {
## Aqu van los comandos que se
## ejecutarn cuando llamemos a la
## funcin
}

lo elegimos nosotros, y le podemos dar el nombre que queramos,


con las mismas condiciones que el nombre de una variable (no espacios, no caracteres
extraos, etc.). Entre las dos llaves ({ y }) se introducen los comandos que se quiere que se
ejecuten cuando la funcin sea llamada.
nombre_de_la_funcion

( ejemplo 12 ) function1.sh Un ejemplo sencillo podra ser el siguiente:


#!/bin/bash
# function1.sh
function uso () {
echo "Este script recibe dos argumentos."
echo "El primero debe ser --opc1 u --opc2 ,"
echo "y el segundo debe ser un fichero existente."
echo "--"
}
if [ $# -ne 2 ]; then
uso
exit 1
fi
case $1 in
--opc1)

if [ -e $2 ]; then
echo "El script termin con xito"

else

exit 0
uso
exit 1

fi
;;
# -e verdadero si archivo existe
--opc2)
if [ -e $2 ]; then
echo "El script termin con xito"
exit 0
else
uso
exit 1
fi
;;
*)
uso
exit 1
esac

;;

Ejecutar el script: funcion1.sh --opcion1 nomb_archivo


De no haber usado aqu las funciones, tendramos que haber reescrito los echo que dicen
cmo se usa el script una y otra vez en cada sitio donde los hubisemos necesitado.
Mientras no se ejecute el script con los argumentos adecuados, llamamos a la funcin uso
que explica al usuario cmo se debe llamar el script.
Podemos definir tantas funciones como necesitemos, cada una con un nombre distinto.
Adems, al igual que los scripts desde la lnea de comandos, las funciones pueden recibir
parmetros, que se procesan de la misma forma: $1 $2 y dems se corresponden con el
primer y el segundo parmetro pasado a la funcin respectivamente.
Al convertirse la funcin en un "comando posible" dentro del script, los parmetros se le
pasan igual que a cualquier otro comando:
( ejemplo 13 ) listar.sh
#!/bin/bash
function lista_parametros () {
echo "Se ha llamado a lista_parametros, con $#"
echo "parmetros. Mostrando los parmetros:"
echo " "
b=7
numparms=$#
local j=1

while [ $j -le $numparms ]; do


echo "El parmetro $j contiene $1"
shift
local j=$[$j+1]
done

lista_parametros a b c d dsfafd d
echo $b
echo $j

La funcin lista_parametros en este ejemplo recibe varios parmetros del mismo modo
que cualquier otro comando dentro del script, y se procesan igual que ya conocemos para
los scripts.
Aqu hacemos uso de shift dentro de la funcin. Lo que shift hace es que $1 valga $2, que
$2 valga $3, etc. para as recortar la lista de argumentos una posicin quitando el primero
de ellos. Qu conseguimos? Pues es sencillo, listamos todos los parmetros posibles,
puesto que imprimimos el primero por pantalla, luego el primero vale el segundo, que se
imprime por pantalla, luego el primero vale el tercero, que se vuelve a sacar por pantalla, y
as con tantos como tengamos. shift nos ofrece unas avanzadas posibilidades para
procesar argumentos. En este ejemplo lo hemos visto dentro de una funcin, pero todo esto
es tambin aplicable a un script en s mismo, fuera de una funcin.
Para terminar con este ejemplo, nos fijamos en local j=..., esto significa que la variable
$j slo existe dentro de la funcin, de hecho, cuando hacemos echo $j fuera de la funcin,
no obtenemos ningn valor. La variable $b, al no ser DECLARADA DE MBITO
LOCAL, sino GLOBAL, existe dentro de la funcin y fuera de ella, como se puede apreciar
ejecutando el script. Cualquier otra variable con valor en el flujo principal del script existe
dentro de las funciones que definamos.
Hemos dicho que cada funcin se convierte en una especie de "comando posible" dentro
del script donde est definida. Como si de un comando se tratase, y al igual que hacamos
con exit 0 o exit 1 en el flujo principal del script, podemos hacer que la llamada a una
funcin genere un valor de retorno de xito o bien de error. Lo conseguimos con el
comando return. Se usa exactamente igual que exit en el script, pero usaremos return
dentro de las funciones.

COMANDO BOORAR ARCHIVOS ( Ejercicio 14) borrar.sh


borrar -opc Nom_Archivo.
-t nos borra todo sin pedir confirmacin

-c nos pide confirmacin para borrar

#!/bin/bash
# borrar.sh
if test $# = 0
then
echo borrar [ -t o c ] [Nombre_Archivo]
else
if test $# -eq 1
then
if test f $1
then
if test r $1
then
rm $1
else
echo el archivo esta protegido
echo desea quitar proteccin para borrarlo
(y/n)
read var
case $var in
y) chmod 777 $1
rm $1
;;
n)echo $1 no se borrara
;;
esac
fi
else
echo no es un archivo
echo precione una tecla
read enter1
fi
else
if test $1 -eq 2
then
if test f $2
then
case $1 in
-t) rem f $2
;;
-c) echo desea borrar el archive (y/n)
Read va
If [ $va = y ]; then
rm f $2
echo archive borrado
exit 0
else
$2 no se borrara
exit 0
fi
;;
esac
else
echo el recurso $2 no es un archivo
echo presione una tecla ...
read enter1

fi
else
echo demaciados parmetros
echo presione una tecla
read enter1
fi
fi
fi

Un ejemplo completo
Ahora vamos a ver en detalle un ejemplo de un script que usa muchas cosas de las
aprendidas y adems tiene un fin prctico: sirve para transpasar los archivos de una cmara
digital a un directorio de nuestra mquina. Adems, la funcin echoc llama al comando
echo con los argumentos adecuados para que la salida sea con colores (esperamos comentar
esto en otro captulo). No te preocupes si no comprendes algunos comandos de los usados,
pues son muy especficos; lo importante es ver que la correcta combinacin de todo lo
aprendido termina en scripts tiles como este:
#!/bin/bash
#
# Variables de configuracin
#
+ Acabado en / !!!!
DIRECTORIO_SALIDA=/home/camara/
#
#
# Funciones
#
function echoc()
{
case $2 in
"red")
echo -n "^[[01;31m"
;;
"green")
echo -n "^[[01;32m"
;;
"blue")
echo -n "^[[01;34m"
# -n no imprime una nueva lnea
;;
esac
echo -n $1
if test $3 = 1
then

else
fi

echo -n "^[[00m"
echo "^[[00m"

}
#
#
function comp()
{
echoc "[" "blue" "1"
echo -n " "
if test $1 = 0
then
echoc "OK" "green" "1"
else
echoc "!!" "red" "1"
fi
echo -n " "
echoc "]" "blue" "0"
}
# Main
echo "Por favor, encienda la cmara y pngala en modo
[|>]"
echo -n "Pulse una tecla para continuar"
read -n1
echo "."
echo -n "Montando la cmara... "
mount /camara 2>&1 > /dev/null
comp $?
echo "Copiando imgenes a /home/sergio/camara... "
for i in /camara/dcim/100nikon/*.jpg
do
NUEVO_NOMBRE=`basename $i | sed s:dscn:
$DIRECTORIO_SALIDA:g`
echo -n "
$i -> $NUEVO_NOMBRE... "
cp $i $NUEVO_NOMBRE
comp $?
done
echo -n "Desmontando la cmara... "
umount /camara 2>&1 > /dev/null
comp $?
if [ `/etc/init.d/samba status | awk '{print $3}'` !=
"started" ]
then
echo "Iniciamos samba... "
/etc/init.d/samba start 2>&1 >/dev/null
comp $?
else
echo "Samba ya est iniciado."

fi
echo "Ya puede apagar la cmara con seguridad"

Recuerda la utilidad de los scripts a la hora de automatizar tareas que tengan que hacerse
frecuentemente; es mejor hacer un script que teclear todos los comandos necesarios cada
vez que lo necesitemos.

Vous aimerez peut-être aussi