practica 3 - Comandos Linux

17

Click here to load reader

Transcript of practica 3 - Comandos Linux

Page 1: practica 3 - Comandos Linux

Práctica 2 de redes de área local: El intérprete de comandos de Linux 1

REDES DE ÁREA LOCAL

PRÁCTICA 3: EL INTÉRPRETE DE COMANDOS DE LINUX

OBJETIVOSEl objetivo de esta práctica es que empecéis a trabajar con el intérprete de comandos (shell) de Linux, que en

nuestro caso será bash (Bourne again shell), ya que es el más potente y más utilizado. La práctica con el shellos dará agilidad para configurar un sistema y os permitirá crear programas de utilidad fácilmente (shellscripts).

Se espera que al final de la práctica seáis capaces de realizar los ejercicios que se plantearán, y que requerirándominar los siguientes aspectos:

§ Listar directorios en cualquier formato.§ Moverse por los directorios, crearlos, moverlos y borrarlos.§ Copiar, borrar y mover ficheros.§ Crear ficheros de texto con vi.§ Redirigir la salida de programas a ficheros. Combinar varios programas con tuberías.§ Aplicar los filtros grep, wc, head, tail y sort a ficheros de texto o a la salida de otro programa.

Para ello deberéis probar los ejemplos que vienen en esta práctica pero, sobre todo, investigar por vuestra cuenta yhacer todas las pruebas necesarias para dominar perfectamente las técnicas anteriores y las opcionesprincipales de los comandos mencionados. Pensad en todas las pegas, probad todo lo que se os ocurra, loscasos normales y los raros.

REQUISITOS PREVIOSTener instalado Linux en el ordenador (en esta práctica cualquier versión de Linux servirá), y tener creado un

usuario distinto de root, que durante toda la práctica llamaremos toni y que deberéis sustituir por el vuestro. Sesupone que su directorio origen es /home/toni/ y que por defecto utiliza bash, que será el caso a no ser quehayáis tocado algo.

ACTIVIDADES DE LA PRÁCTICA

Actividad 1. Empezando a trabajar con el sistema

Cuando iniciamos el sistema, lo primero que os pide Linux es que introduzcáis vuestro usuario (login:); deberéishacerlo (en nuestro ejemplo, toni) y, a continuación, escribir la contraseña (lo que tecleéis no se mostrará enpantalla, para que nadie fisgue por encima del hombro).

El intérprete de comandos aparece como una pantalla en negro, con un cursor que nos indica que podéis escribir;ahí le daréis órdenes, que él irá ejecutando si son correctas o tenéis permiso para ejecutarlas. Cuandocompletéis una orden, se la “enviaréis” a bash apretando la tecla Intro. Antes del cursor aparece un prompt,unos símbolos que dan cierta información y de paso no dejan la pantalla completamente en negro, como porejemplo [toni@ordenata home]$ (usuario, ordenador en el que está y directorio actual, enseguida veremosqué es todo esto).

Si no os gusta la orden que estáis escribiendo, podéis borrar todo lo escrito con Ctrl+C; si queréis repetir unaorden anterior, podéis recuperar las últimas órdenes con flecha arriba y flecha abajo (historia de comandos).

Además, en Linux hay varias consolas, podéis trabajar con varias sesiones a la vez (mirando la ayuda con una yprobando comandos con la otra, por ejemplo); con Alt+F1, Alt+F2, ... se puede cambiar de consola.Incluso en cada una de ellas podéis ser un usuario distinto.

La información se guarda en ficheros (o archivos, que es lo mismo), y los ficheros se organizan en directorios,espacios que contienen ficheros y otros directorios (pero un fichero sólo puede contener información: texto,programas, dibujos, ... no otros ficheros o directorios).

Page 2: practica 3 - Comandos Linux

2 Centre d’estudis politècnics 2002-2003

Cuando estéis trabajando en la consola, en cada momento estaréis situados en un directorio en concreto, que serávuestro directorio actual (el último elemento del prompt lo indica; la orden pwd, o sea, print workingdirectory, también nos lo dice, pero de forma completa). Cada usuario tiene un directorio origen, que es eldirectorio actual cuando entra en el sistema y el lugar donde debe guardar sus cosas (y hacer susexperimentos).

Hay que saber que en Linux hay tres tipos de usuarios:§ El administrador, root, que es todopoderoso en su sistema Linux y puede acceder a todos los ficheros y

directorios. Su directorio origen es /root/ (a veces /home/root/, o sea, el directorio root que está dentro deldirectorio home).

§ Los usuarios normales, como toni, que corresponden a las personas que trabajan con el sistema Linux y loutilizan para crear sus programas, documentos, etc. Su directorio origen es /home/toni/ (o el nombre deusuario que toque).

§ Los usuarios especiales, como apache o ftp, que no corresponden a personas sino que ciertos programas losutilizan para funcionar (Apache, el servidor de páginas web de Linux, funciona como si lo estuvieraejecutando el usuario apache, etc.).

Es muy importante evitar trabajar como root a menos de que sea completamente necesario hacerlo; para todas laspruebas y para el trabajo habitual se deberá trabajar como un usuario normal, porque como root podéis echar aperder todo el sistema con una orden aparentemente inocente.

Otra operación delicada es la de apagar el sistema: se debe hacer mediante la orden shutdown -h now (o suversión abreviada, halt) que, por cierto, normalmente sólo puede utilizar root. También está shutdown -rnow o simplemente reboot para reiniciar el sistema.

Si lo único que queremos es cerrar una sesión, o sea, dejar de trabajar como root pero no apagar el ordenador,tenemos que utilizar la orden exit, que nos devuelve a la pantalla de login para que entremos con otro usuario.

Nota: Linux es perfectamente capaz de distinguir una mayúscula de una minúscula, así que no intentéis engañarle.

Actividad 2. Directorios y ficheros

Ya habéis leído que los ficheros están en directorios, y que unos directorios están dentro de otros... así, ¿hastacuándo? Pues bien, hay un primer directorio, que los contiene a todos: el directorio raíz, representado por /.De forma que /home/toni/ quiere decir, exactamente, el directorio toni, que está dentro del directorio home, queestá dentro del directorio /. Como veis, los nombres de directorio se terminan con / para distinguirlos de losficheros (por ejemplo: /home/toni/prueba podría ser un fichero, llamado prueba, dentro del directorio toni...).

Nota para los usuarios de DOS/Windows: en Linux no hay unidades como en estos sistemas operativos, quetienen A: para la disquetera, C: para el disco duro, etc., sino que todos los discos que haya en el sistema se vencomo directorios debajo de la raíz (por ejemplo, la disquetera puede ser /mnt/floppy/).

pwd (print working directory, indica cuál es el directorio actual)Como se dijo antes, esta orden muestra cuál es el directorio actual de forma absoluta.

$pwd # No hay que escribir $, representa el prompt/home/toni/

ls (list, lista el contenido de un directorio)Esta orden permite ver qué ficheros y directorios contiene un directorio. La forma más sencilla es escribir,

simplemente, ls, con lo que se mostrarán los contenidos del directorio actual (que, si no habéis hecho nadararo, será vuestro directorio origen). Este comando muestra los nombres de los ficheros y los nombres de losdirectorios (terminados en / y posiblemente de otro color).

Los comandos de Linux suelen tener opciones para modificar su comportamiento, que son palabras o letras con unsigno menos delante. Si queréis ver más información de cada elemento podéis escribir el comando con laopción de listado largo: ls -l, con lo que obtendréis más información (tipo de entrada y permisos, número deenlaces, propietario, grupo, tamaño en bytes, marca de tiempo (fecha y hora de la última modificación) ynombre). Si aún no sabéis qué es todo esto tranquilos, ya lo veremos; basta con que recordéis que lo tenéis aquíapuntado.

¿Cómo podéis ver el contenido de otros directorios?§ Moviéndoos a otro directorio con el comando cd, que veremos enseguida.

Page 3: practica 3 - Comandos Linux

Práctica 2 de redes de área local: El intérprete de comandos de Linux 3

§ Mediante una ruta absoluta: indicando qué directorio queremos ver, especificándolo desde la raíz. Porejemplo, ls /home/ para ver qué hay en ese directorio.

§ Mediante una ruta relativa: indicando qué directorio queremos ver, pero especificándolo desde el actual. Porejemplo, ls tmp/ para ver qué hay en el directorio tmp, que está dentro de nuestro origen (no saldrá nadaporque está vacío).

El concepto de ruta absoluta y relativa es fundamental, y no sólo se utiliza con ls sino con casi todos los comandosde bash. Os recomiendo que cuando escribáis órdenes probéis a hacerlo de las dos maneras. ¿Cómo escribiríaisls tmp/ como ruta absoluta?

Truco: bash autocompleta los comandos, así que si escribís ls /h y apretáis el tabulador, él completa la orden yescribe el resto, quedando ls /home/. Esta característica os ahorrará mucho teclear.

La opción -a (all) muestra todos los ficheros del directorio. En Linux, los ficheros que empiezan con un punto sonficheros ocultos, que no aparecen en un ls normal. Los ficheros que veis, como .bash_profile, son ficheros deconfiguración que ya toquetearéis en su momento, pero ahora fijáos bien en dos entradas: ./ y ../ (Así,directamente, ¿qué son, ficheros o directorios?). La entrada ./ representa el directorio actual, de forma que siescribís ls ./ estáis haciendo lo mismo que con ls a secas, o sea, viendo los contenidos del directorio actual.Ya veremos qué utilidad tiene (que la tiene). La entrada ../ es más útil de momento, pues hace referencia aldirectorio padre del actual, o sea, el directorio en el que está el actual. Si el actual es /home/toni/, el padre será/home/, y haciendo ls ../ veremos qué contiene. Esta es la ruta relativa para llegar a nuestro padre, y porsupuesto también habrá una ruta absoluta equivalente (intentad encontrarla).

¿Qué interesa utilizar, rutas absolutas o relativas? En cada caso, la forma que resulte más cómoda.

7 Listad los contenidos del directorio /etc/ mediante rutas relativas y absolutas, con y sin opción de listadolargo.

7 Entrad en el sistema como root y listad los contenidos de /home/toni/ (o el usuario que hayáis creado).7 Entrad como toni y listad los contenidos de /root/ (que es el directorio origen de root). ¿Algún problema? ¿A

qué creéis que se debe?

Podéis combinar dos opciones (por ejemplo, -l y -a) de diversas maneras (en general no importa el orden):ls -l -a ls -alls -a -l ls -la

Listad los contenidos del directorio /etc/ (en el que se guarda la configuración del sistema). En primer lugar veréisque la pantalla se desplaza porque hay muchas entradas; ya veremos cómo remediar esto. Pero imaginad queestamos buscando un fichero del que no recordamos su nombre, pero sabemos que empieza por p: podemosescribir lo siguiente, y veremos todos los ficheros y directorios de /etc cuyo nombre empieza por p:

ls /etc/p*Porque el * representa cualquier combinación de letras (una, varias o ninguna), y por tanto ls sólo exige que

empiece por p, y detrás puede haber lo que sea (o nada más que la p). Si escribierais ls /etc/*p* veríaistodas las entradas que tienen alguna p (enmedio, al principio o al final).

Si ahora escribís ls /etc/rc?.d veríais el contenido de los directorios rc1.d, rc2.d, etc., ya que el ¿ se hasustituido por un carácter cualquiera (ni menos ni más que uno). ls /etc/???? muestra todas las entradas de4 letras (ni más ni menos) de /etc.

Por último, si hacéis ls /etc/[ps]* veréis todas las entradas de /etc cuyo nombre empieza por p o por s.

Un par de opciones más de ls (tras la # van los comentarios):ls -d /etc/rc?.d # En vez de mostrar los contenidos de rc1.d/, rc2.d/,

muestra sólo sus nombresls -A # Muestra todos los ficheros, incluso los ocultos,

pero no ./ ni ../ls -R # Lista recursivamente el directorio (o sea, también

los subdirectorios)

Éstas son las opciones más importantes del comando ls:Opción Significado-l Listado largo (muestra el tipo de fichero, los permisos, el número de

enlaces duros, el propietario, el grupo del fichero, el tamaño enbytes, cuándo se ha modificado por última vez y el nombre).

-d Muestra sólo el nombre de los directorios, no sus contenidos.

Page 4: practica 3 - Comandos Linux

4 Centre d’estudis politècnics 2002-2003

-i Muestra el número de inodo de cada fichero.-a Muestra los ficheros ocultos (los que empiezan por .).-A Muestra los ficheros ocultos, pero no ./ ni ../-R ls recursivo, recorre todos los subdirectorios que encuentra.-r Invierte el orden de presentación.-S Ordena por tamaño.-t Ordena por fecha de modificación.-h Muestra el tamaño de los ficheros en kilobytes y megabytes.--help Muestra la ayuda de ls.

Por cierto, ls es un programa más, que se encuentra en /bin/; salvo algunos comandos internos como cd, todos loscomandos de Linux son programas como los que podéis hacer vosotros.

7 Buscad el programa ls en el directorio /bin/ y mostrad su información con ls -l.7 Averiguad qué directorios hay dentro de vuestro directorio origen y qué contienen (ficheros ocultos

incluidos).7 ¿Funciona correctamente la orden ls .* para ver qué ficheros ocultos hay en vuestro directorio origen? ¿Qué

creéis que ocurre?7 Listad todos los ficheros de /etc/ cuyo nombre empiece por z de forma que salgan primero los de menor

tamaño.

cd (change directory, cambia el directorio actual)Esta orden permite el movimiento por los directorios, por si queremos trabajar en un directorio distinto al origen.

Veamos algunos ejemplos, en los que hay que observar que se usan tanto rutas relativas como absolutas:cd tmp/cd /home/toni/tmp/cd .. # Va al directorio padrecd . # Se queda donde estácd / # Va al directorio raízcd home/toni/ # Vuelve a /home/toni (desde /)

También interesa saber que cd sin parámetros nos devuelve al directorio origen estemos donde estemos.7 Desde vuestro directorio origen, id a /etc/ usando una sola orden cd pero con rutas relativas. Ahora id a

/etc/init.d/ pero usando rutas absolutas, y por último comprobad que con cd a secas volvéis a vuestrodirectorio origen.

mkdir (make directory, crea un directorio)Cuando necesitemos organizar nuestra información deberemos crear nuevos directorios mediante esta orden. Si el

directorio actual es /home/toni/, podemos hacer:mkdir pruebas/ # Crea /home/toni/pruebas/mkdir scripts/ # Crea /home/toni/scripts/mkdir pruebas/prác1/ # Crea /home/toni/pruebas/prác1/ . Si pruebas

no existiera se produciría un error. ¿Por qué?mkdir -p pruebas/prác1/ # Crea los directorios intermedios si no

existen y al final prác1 (p es de parents,padres)

7 Cread un directorio “listar” en vuestro directorio origen ycomprobad que, aunque esté recién creado, contienelos enlaces ./ y ../ .

7 Cread un directorio alumnox en /home/. ¿Os da error? ¿A qué creéis que es debido?7 Intentad crear la siguiente estructura de directorios en vuestro directorio origen, aprovechando la opción -p de

mkdir:

eval1|-- examen| |-- practica| `-- teoria|-- juegos`-- trabajos `-- scripts

Page 5: practica 3 - Comandos Linux

Práctica 2 de redes de área local: El intérprete de comandos de Linux 5

|-- administracion |-- pruebas `-- red

rmdir (remove directory, elimina directorio)Borra el directorio que le indiquemos, que deberá estar vacío o de lo contrario dará error.

rmdir pruebas/ # Error si no está vacíormdir pruebas/prác1/ # Elimina prác1/rmdir -p pruebas/prác1/ # Elimina prác1 y, si está vacío, también

pruebas/

7 Eliminad los directorios creados en el último ejercicio.

tree (muestra la estructura de directorios y ficheros en forma de árbol)Para haceros una idea de la estructura de directorios y los ficheros que contienen, podéis utilizar el comando tree.

Si lo ejecutáis en la raíz le costará mucho mostrarlo todo; siempre podéis interrumpir un comando con Ctrl+C.

Sintaxis:tree [opciones] [directorio] # Si no se especifica directorio, crea el árbol a

# partir del actualOpción Significado-d Muestra sólo los directorios, no los ficheros.-p Muestra los permisos de cada fichero.-u Muestra el propietario de cada fichero.-g Muestra el grupo de cada fichero.-s Muestra el tamaño de cada fichero.-D Muestra la fecha de modificación de cada fichero.-L n Sólo desciende n niveles (o sea, directorios).

7 Obtened un árbol que muestre qué directorios nacen directamente en el directorio raíz, pero no sussubdirectorios.

7 Obtened un árbol que muestre todos los ficheros y directorios dentro de vuestro directorio origen. Haced queaparezca toda la información posible junto a los nombres de ficheros.

Actividad 3. Obtención de ayuda

Trabajando con Linux hay tres formas principales de obtener ayuda: las opciones que dan los comandos (--help,por ejemplo), el comando man y el comando info. Algunos comandos son más benévolos que otros y tambiénnos dan ayuda si los invocamos incorrectamente o sin ninguna opción, pero muchos son más antipáticos, asíque conviene conocer todas las herramientas disponibles.

man (manual)Es el comando universal de ayuda en UNIX. La forma más sencilla de invocarlo es escribiendo man comando, y

así obtenemos la ayuda correspondiente al comando (si está disponible). Para salir de man hay que apretar laletra q.

man ls # Ayuda de lsman tree # Ayuda de treeman man # Ayuda de man

info (información)Es un sistema de ayuda similar a man pero más complejo. Algunos manuales están más actualizados en info que

en man.

apropos (a propósito)Es una utilidad que busca en todos los manuales disponibles y averigua en qué comandos aparece la palabra que le

indiquemos. A continuación podremos acudir a los manuales de los comandos indicados para saber más sobreese tema.

# Por ejemplo, queremos saber cómo cambiar la contraseña, así que buscamos# los comandos que contengan la palabra password en su manual

Page 6: practica 3 - Comandos Linux

6 Centre d’estudis politècnics 2002-2003

apropos password...grpunconv [pwconv] (8) - convert to and from shadow passwords and groupspasswd (5) - password file...# En la ayuda de alguno de esos comandos explicará cómo hacerloman passwd....

7 Utilizad apropos para descubrir información relacionada con los términos siguientes: Ethernet, ARP, telnet.

Actividad 4. Edición de ficheros de texto

vi (visual, editor de texto)Aunque hay editores más cómodos, en Linux (y en los demás Unix) el editor estándar es vi (de visual, porque está

pensado para sistemas con pantalla, toda una novedad en su tiempo). A diferencia de los editores típicos (blocde notas, Word, etc.), en vi hay dos modos de funcionamiento:

→ i →Modo comando← Esc ←

Modo edición

El programa empieza en modo comando (órdenes de guardar, salir, etc.) y apretando i (insertar) vamos a modoedición, que es donde se puede escribir y corregir el texto. Para volver a modo comando, apretamos Esc.

vi # Se abre el editor con un fichero nuevo y en blancovi fich1 # Se abre vi con el fichero fich1; si ya existe se muestra

su contenido, y si no existe se crea vacío

En modo edición podréis utilizar las teclas habituales (flechas, retroceso, intro, etc.). En modo comando se puedenutilizar las siguientes órdenes:

Orden Significado:w write (guardar):w fichero write (guardar en el fichero indicado):wq write and quit (guardar y salir):q quit (salir; si no has guardado no te deja):q! quit (salir sin guardar):edit nomfich edit (si nomfich existe lo abre, si no edita uno

nuevo con ese nombre)

En cualquier momento podéis apretar F1 para ver la ayuda (y :q para salir de ella). Probad a crear varios ficherosde texto y a guardarlos; os irán bien para pruebas posteriores.

7 Cread un fichero de texto con vi y escribid en él una agenda, con una línea por persona con su nombre,dirección de correo y población de residencia. No olvidéis guardarlo.

7 Abrid el vi sin indicar ningún fichero y, una vez dentro, cargad un fichero y modificadlo.

cat (concatenate, concatena ficheros y los muestra por pantalla)Para ver el contenido de un fichero de texto podemos utilizar vi, pero si lo único que queremos hacer es ver qué

contiene hay un comando más cómodo:cat texto1 # Muestra el fichero texto1 por pantallacat texto1 texto2 # Muestra texto1 y a continuación texto2

more (muestra un fichero página a página)Si alguno de los ficheros es demasiado largo (probad a hacer cat /etc/passwd, que es el fichero que contiene la

lista de usuarios del sistema y sus datos) y no cabe en pantalla, podéis verlo completamente utilizando estaorden, que muestra un fichero largo página a página; para pasar de una a otra tenéis que apretar una tecla, loque os da tiempo a leer lo que pone. Si apretáis q salís de more:

more /etc/passwdmore texto1

Page 7: practica 3 - Comandos Linux

Práctica 2 de redes de área local: El intérprete de comandos de Linux 7

less (more avanzado)Igual que more, sólo que permite ir hacia arriba y hacia abajo con las flechas y resaltar una palabra escribiendo

/palabra. También se sale con q.

7 Visualizad /etc/passwd con less y resaltad la palabra root.

Actividad 5. Operaciones con ficheros

cp (copy, copia ficheros)Este comando nos permite hacer copias de nuestros ficheros. Hay que entender que el original queda intacto,

simplemente se crea una copia, y si posteriormente modificamos o eliminamos la copia el original seguiráigual. Veamos algunos ejemplos, suponiendo que en nuestro directorio origen tenemos los ficheros fich1 yfich2 y el directorio prueba con los ficheros p1 y p2.

cp fich1 copia # Crea una copia de fich1 llamada copia en eldirectorio origen (que es el actual)

cp fich1 prueba/copia # Crea otra copia, pero en prueba/, llamadacopia

cp fich1 prueba/ # Copia fich1 en prueba y la copia, al notener nombre, se llama también fich1

cp fich2 copia # Sobreescribe copia con el contenido de fich2cp /etc/passwd . # Copia /etc/passwd al directorio actual (.)

# y, al no indicar un nombre, también se# llamará passwd

También está la opción de copiar un directorio completo recursivamente, o sea, el directorio y todo lo quecontiene:

cp -R prueba/ otraprueba/En otraprueba tendríamos una copia de todos los subdirectorios y ficheros de prueba.

Los comodines (*, ?, [abc...]) también se pueden usar con cp (cp /etc/p* prueba/).

Opción Significado-f Sobreescribe los ficheros destino si ya existen, sin

preguntar ni nada.-i Pregunta antes de sobreescribir un fichero existente (lo

contrario que -f).-R Copia recursivamente (todos los subdirectorios que

encuentre y sus contenidos).-s En vez de copiar los ficheros, crea enlaces simbólicos

a los mismos.-u Sólo copia cuando el fichero origen es más reciente

que el destino (o si no existe).

7 Copiad todos los ficheros de /etc/sysconfig/network-scripts/ que empiecen por ifcfg a vuestro directorioorigen.

7 Copiad /etc/passwd a vuestro directorio origen, dándole el nombre de usuarios (todo en una sola orden).

rm (remove, borra un fichero)Borra un fichero o un conjunto de ficheros (si indicamos comodines). No borra directorios salvo con la opción -R.

rm fich1 # Borra fich1rm prueba/fich1 # Borra el fich1 de pruebarm * # Borra todos los ficheros del directorio actualrm -R prueba/ # Borra el directorio prueba y todos sus contenidos

Por defecto rm pregunta si queremos borrar cada elemento; si queréis evitar que pida confirmación, utilizad laopción -f (force). Si os queréis asegurar de que os pide confirmación, -i (interactive).

7 Cread otra copia del fichero usuarios del ejercicio anterior. Borradla con rm.

mv (move, mueve ficheros y directorios)

Page 8: practica 3 - Comandos Linux

8 Centre d’estudis politècnics 2002-2003

Si queremos mover un fichero o directorio, o si simplemente queremos cambiarle el nombre, podemos utilizar estainstrucción:

mv fich1 texto1 # Renombra fich1 a texto1mv fich1 prueba/texto1 # Mueve fich1 a prueba y lo llama texto1mv fich1 prueba/ # Mueve fich1 a prueba sin cambiarle el nombremv prueba/ cosas/ # Cambia prueba/ de nombremv prueba/ tmp/ # Como tmp ya existe, mete prueba/ dentro

Notad que al mover un fichero se pierde el original (o sea, cambia de sitio, no es que se haga una copia. Cuidadito,no hagáis mv con ficheros del sistema).

7 Cread un directorio en vuestro origen llamado sistema y moved a él los ficheros ifcfg y el fichero usuarios,dándole el nombre de passwd.

Actividad 6. Redireccionamiento de entrada y salida

Hemos visto que ls --help nos muestra ayuda y opciones de ls, pero el problema es que no cabe toda enpantalla. También hemos visto las órdenes more y less para ver ficheros largos. ¿Cómo combinarlos? Hayvarias formas, y todas consisten en dirigir la salida estándar de ls (lo que muestra por pantalla) a otro sitio queno sea la pantalla.

§ Redirección a un fichero:ls --help > ayudalsmore ayudals

La primera orden redirige la salida de ls --help al fichero ayudals, que se creará en el directorio actual ycontendrá el texto que habríamos visto por pantalla (y que no hemos visto). Después vemos qué pone con more(o con less, o con vi). Hay que tener en cuenta que si ayudals ya existe se borrará y se sobreescribirá con lanueva información.

§ Si en vez de sobreescribir el fichero queréis añadirle la información al final, deberéis hacer:ls --help >> ayudascp --help >> ayudas # Lo va añadiendo a lo que ya existe en ayudasmore ayudas

§ También podéis evitar el paso intermedio de crear un fichero y leerlo con more: se puede conectar la salida deuno con la entrada del otro directamente de esta manera:ls --help | more

La entrada de more, que normalmente es un fichero, en este caso es la salida de ls --help porque los hemosconectado con una tubería (pipe). (El símbolo | se escribe pulsando AltGr+1.)

§ Por último, cuando un archivo espera su entrada desde la entrada estándar, o sea, el teclado, es posibleobligarle a cogerla de un fichero en su lugar: comando < fichero. Esta opción se utiliza poco porque lamayoría de comandos aceptan un fichero como entrada, pero conviene conocerla.

Vamos a hacer otra prueba para aprender algo más de este tema:ls /[mr]* > fich

Esta orden debería escribir el resultado de la orden en fich; sin embargo, en el fichero dice que hay un directorioen la raíz que empieza por m, mnt/, y por pantalla nos sale el mensaje

ls: /root: Permiso denegado¿Por qué no ha escrito esto en fich? Pues porque es un error, y en Linux los mensajes de error no salen por la

salida estándar sino por la salida de errores. Al escribir > fich sólo estamos redirigiendo la salida estándar,y la de errores sigue saliendo por la pantalla. Aunque esto tiene remedio:

ls /[mr]* > fich 2> errores # En errores se guardan los errores, y# en fich la salida estándar

ls /[mr]* &> result # Lo guarda todo en result, errores y# salida estándar

ls /[mr]* 2> errores # Guarda errores y muestra lo demás por# pantalla

7 Almacenad en un fichero llamado arboletc la estructura de directorios del directorio /etc/ (la que os dé elcomando tree).

7 Almacenad la ayuda (man) del comando ls en un fichero llamado ayuda-ls. Haced lo mismo con los comandostree y cp (ficheros ayuda-tree y ayuda-cp respectivamente).

Page 9: practica 3 - Comandos Linux

Práctica 2 de redes de área local: El intérprete de comandos de Linux 9

7 Juntad los tres ficheros de ayuda del ejercicio anterior en uno solo, ayuda-linux.

Actividad 7. Filtros de texto

Estos programas sirven para filtrar según distintos criterios los resultados de otros comandos, y se suelen usar entuberías. Están pensados para trabajar con ficheros de texto.

grep (general regular expression processor, muestra las líneas que contienen el patrón de texto indicado)Imaginad que tenemos que buscar todos los ficheros de /etc que contengan alguna z en su nombre. Tenemos dos

opciones:# 1.- Hacerlo sólo con ls (¿cómo?)# 2.- Utilizar el comando grep:ls /etc | grep z

grep muestra las líneas que contengan cierto patrón, en este caso simplemente una “z”. También podríamos haberpuesto una palabra entera como patrón.

7 Listad todos los ficheros de /etc/ que contengan la palabra “init” en su nombre. Hacedlo de las dos formas:sólo con ls, y con ls y grep.

Hay varias formas de invocarlo:ls /etc | grep z # La salida de ls es la entrada de grepgrep z fich1 # grep busca z en el fichero fich1grep z # grep busca z en la entrada estándar (el teclado);

# va pidiendo texto y sólo repite las líneas que# contengan al menos una z.

En este último caso parece que no podemos dejar de escribir. Si hacemos Ctrl+C abortamos el programa (terminasin guardar los resultados por ejemplo en grep z > fich2), pero para indicarle que queremos terminar laentrada “bien” hemos de decirle que acaba el fichero, apretando Ctrl+D.

Inciso: combinaciones de teclado especiales en LinuxCtrl+C Interrumpir un comando.Ctrl+D Señal de fin de fichero (EOF). Permite terminar la entrada por teclado.Ctrl+Z “Duerme” el comando en ejecución (se verá en la práctica de administración del

sistema).

Sintaxis completa de grep:grep [opciones] patrón [fichero(s)]

Opción Significado-c Dice cuántas líneas contienen el patrón (aunque lo tengan repetido

sólo las cuenta una vez).-i No distingue mayúsculas y minúsculas.-l Muestra sólo qué ficheros contienen el patrón.-L Muestra sólo qué ficheros no contienen el patrón.-n Antepone el número de línea dentro del fichero.-v Invierte la búsqueda (muestra las líneas que no contienen el patrón,

etc.).-h No muestra el nombre del fichero, sólo las líneas que concuerdan.-q Modo silencioso, no muestra nada por pantalla y sólo busca la

primera coincidencia (más adelante se verá su utilidad).

grep no sólo permite buscar textos literalmente, sino que acepta lo que en informática se llaman expresionesregulares, que son una forma de especificar todos los textos que tengan una forma determinada.

Expresiones regulares en grep:Símbolo Significado Ejemplo ResultadoCadena caracteres La cadena aparece en la

línea.ro root:root...

una tarjeta estropeadaque...

. Representa a cualquier prác. prác1.txt

Page 10: practica 3 - Comandos Linux

10 Centre d’estudis politècnics 2002-2003

carácter. prácb.txt* El elemento precedente

puede estar cero, una omás veces.

ro* rootramas tiernasrooooom

[lista caracteres] Se puede elegir un caráctercualquiera de la lista.

[xyz] bajo condicionesextremas...tarjeta de red y módem...

[^lista caracteres] Se puede elegir un caráctercualquiera que NO esté enla lista.

[^0123456789] (líneas sin números)

[carácter-carácter] Se puede elegir un caráctercualquiera que esté entrelos dos indicados.

[0-9] A partir de 100 usuarios...(cualquier número)

^ Inicio de línea ^root root (a principio de línea)$ Final de línea bash$ bash (a final de línea)

En todos estos ejercicios vamos a trabajar con el fichero /etc/passwd. Haceos una copia en vuestro directorioorigen.

Nota 1: campos de /etc/passwdusuario:x:id de usuario:id de grupo:comentario:directorio origen:shell

Por ejemplo:toni:x:511:501:/home/toni:Antonio Pérez:/bin/bash

7 Mostrad las líneas que contengan la palabra “bash”.7 Mostrad las líneas que no empiecen con la letra g.7 Mostrad las líneas que terminen con h o con e.7 Mostrad las líneas que tengan al menos cuatro vocales.7 Mostrad las líneas que tengan al menos dos vocales seguidas.7 Mostrad las líneas que tengan al menos una q, sea minúscula o mayúscula (lo podéis hacer de dos formas).7 Mostrad las líneas en las que no aparezca el texto “qmail”.7 Mostrad las líneas que tengan alguna o que no esté precedida por una r.7 Sabiendo que los números de usuario/grupo (UID/GID) están rodeados por “:”, mostrad las líneas que tengan

un UID o un GID de dos cifras.7 ¿Sabríais modificar la orden anterior para que sólo mostrara los de UID de dos cifras, independientemente del

GID?7 Sabiendo que el UID es el tercer campo, mostrad la línea de UID=1 (de forma que no sea posible que

aparezca otro usuario con UID=13, o uno con GID=312).7 Almacenad en un fichero llamado usuarios todas las líneas correspondientes a usuarios normales, o sea, con

UID entre 501 y 999.7 Mostrad las líneas que contengan alguna q pero no la palabra qmail. (Una forma de hacerlo es enlazar un grep

con otro.)7 Poned en el fichero “especiales“ todas las líneas con los nombres de usuario root, bin o daemon (podéis

utilizar varias órdenes).

wc (word count, cuenta el número de palabras de un fichero)La orden siguiente:

wc fich1muestra, en este orden, el número de líneas, palabras y caracteres del fichero. Podemos pedirle que sólo muestre

algunas, con las opciones siguientes:

Opción Significado-c Número de caracteres-l Número de líneas-L Longitud de la línea

máxima-w Número de palabras

Page 11: practica 3 - Comandos Linux

Práctica 2 de redes de área local: El intérprete de comandos de Linux 11

7 Encontrad el número de líneas de vuestra copia de /etc/passwd.7 Encontrad el número de líneas de ese fichero que contengan la palabra qmail. Hacedlo sólo con grep y luego

combinando grep y wc.

tail (muestra la cola de un fichero)O sea, las últimas diez líneas:

tail fich # Últimas 10 líneas del ficherotail -n3 fich # Últimas 3 líneas

head (muestra la cabeza de un fichero)O sea, las diez primeras líneas:

head fich # Primeras 10 líneashead -n3 fich # Primeras 3 líneashead -c100 fich # Las líneas (enteras) que contienen los 100 primeros # caracteres

Los comandos tail y head suelen utilizarse junto al siguiente, sort.sort (ordena un fichero)Importante: no es que ordene el fichero (que sigue intacto), sino que muestra su contenido de forma ordenada.

También hay que tener en cuenta que ordena según el código ASCII (números antes que letras, mayúsculasantes que minúsculas, eñes, acentos, ces trencades al final, etc.)

sort /etc/passwd # Muestra el fichero ordenado por el primer elemento(el nombre de usuario)

Sintaxis general (como es habitual, si se omite el fichero, ordena su entrada estándar):sort [opciones] [fichero]

Opción Significado-b Ignora los blancos antes de ordenar-d Ordena sólo números y letras, no signos-f Trata todo como mayúsculas (puede estar por defecto)-n Trata los números como tales (numéricamente 13>7 pero alfabéticamente 13<7)-r Invierte el resultado-t carácter Indica que carácter es el elemento que separa un campo de otro (por ejemplo en /etc/passwd

pondríamos -t : )-k pos1 Indica el primer campo por el que hay que ordenar (por ejemplo para ordenar por id usuario

en /etc/passwd habría que poner, entre otras opciones, -k 3. Hay que tener en cuenta queempieza a contar por 1, y que si hay dos campos iguales, sigue mirando los siguientes paradesempatar.)

-k pos1,pos2 Sólo tiene en cuenta los campos desde pos1 hasta pos2 para ordenar (ambos inclusive). Porejemplo para ordenar sólo por id usuario e id grupo, -k3,4. Para ordenar sólo por id grupo, -k4,4.

Nota 2: campos de ls -lTipo deentrada ypermisos

Número deenlaces

Propietario Grupo Tamaño(bytes)

Marca detiempo

Nombre (yenlace)

Veamos algunos ejemplos:# Ordena el resultado de un ls por propietariols -l /var/ | sort -k3# Fijaos en que si hay varias líneas del mismo propietario (root), sigue# ordenando por los siguientes campos (primero por grupo, luego por# tamaño, etc.).

# Ordena el resultado de un ls por propietario sólo; fijaos en la# diferencia con el anterior:ls -l /var/ | sort -k3,3

# Ordena /etc/passwd por nombre de usuario: el separador entre campos es# “:”, y el nombre de usuario es el primer campo:sort -t: -k1 /etc/passwd

Page 12: practica 3 - Comandos Linux

12 Centre d’estudis politècnics 2002-2003

7 Mostrad las líneas de /etc/passwd ordenándolas por UID.7 Almacenad en un fichero los cincyo usuarios con mayor UID.7 Mostrad los usuarios que tengan la palabra “qmail” en su campo de comentario ordenados por nombre de

usuario.7 A partir de un ls -l encontrad los diez ficheros de mayor tamaño del directorio /etc/ (no lo hagáis

manualmente, claro, escribid una orden que muestre sólo esos diez ficheros).

Actividad 8. Búsqueda de ficheros en el sistema

Antes de empezar, una advertencia: muchas de las opciones que encontraréis en el comando find no las podéisentender aún, son necesarios muchos de los conceptos de la práctica tres. Para organizar mejor la informaciónse han incluido aquí todas las opciones importantes de find, pero veréis que los ejercicios correspondientesestán divididos en dos partes, los primeros tenéis que hacerlos ahora pero tendréis que hacer los del segundobloque cuando terminéis la práctica 3, para aplicar los conceptos que allí se explican.

Una de las actividades más importantes para una buena administración de un sistema es la de detectar ficherospotencialmente peligrosos o, al menos, perjudiciales para el sistema: ficheros con permisos sospechosos,demasiado grandes, que hace mucho que no se utilizan y están ocupando espacio inútilmente, etc.

Para llevar este tipo de controles a cabo, la herramienta más potente que ofrece Linux es el comando find, quecomo veréis tiene una gran cantidad de opciones (casi un pequeño lenguaje de programación), reflejo de sugran versatilidad.

También veremos que, además de encontrar ficheros según las condiciones que queramos, también permiterealizar una serie de operaciones sobre los ficheros que encontrados (como borrarlos), solo o en combinacióncon el comando xargs.

find: encuentra los ficheros que cumplan ciertas condiciones

La sintaxis general es la siguiente:find [fichero(s)] [expresión(es)]

El fichero o ficheros son los ficheros y/o directorios sobre los que se quiera buscar. Hay que tener en cuenta quepor defecto find hace búsquedas recursivas, o sea que si ponemos find /home/luis/ buscará en /home/luis/ y entodos sus subdirectorios. Si no se le indican ficheros, busca en todos los subdirectorios del directorio actual.

El comando find recorre todos los directorios, examina fichero a fichero y decide uno a uno si cumple lascondiciones que le hemos indicado. Si es así, escribe su nombre completo (podemos ordenarle que haga otrascosas con el fichero).

Las expresiones pueden ser de cuatro tipos:• Opciones: afectan al funcionamiento general de find• Condiciones: devuelven V o F (verdadero o falso) en función de las características de cada fichero examinado• Acciones: hacen algo y devuelven V o F. La acción por defecto es -print, que simplemente escribe el nombre

completo (ruta y nombre) del fichero por pantalla. Sólo se ejecutan si las condiciones previas dan comoresultado V.

• Operadores: permiten conectar condiciones. Simplemente son operadores lógicos para enriquecer aún más laexpresividad del comando

Una orden con find puede llegar a ser complicada (sí, esta orden hace algo, y útil, por cierto):find /home/pep -atime -10 -type f -not -name '*.tmp' -exec grep -l virus '{}' ';'

Aunque antes de llegar a todo eso vamos a ir viendo sus opciones paso a paso para poder ir comprendiéndolomejor.

NOTA: find lista ficheros y directorios, pero en los ejemplos se utilizará fichero para hacer referencia tanto a unoscomo a otros.

# Aplica la acción por defecto (mostrar el nombre completo, o sea, con ruta y# todo, de los ficheros) a todos los ficheros de /home/laura y subdirectoriosfind /home/laura/

Page 13: practica 3 - Comandos Linux

Práctica 2 de redes de área local: El intérprete de comandos de Linux 13

# Aplica -print, que es la acción por defecto, o sea, hace lo mismo que antesfind /home/laura/ -print

# Lo mismo otra vez, pero en vez de mostrar los nombres los guarda# en listado.txt. Aunque ya sabéis otra forma de conseguir lo mismo, ¿no?find /home/laura -fprint listado.txt

# Ahora buscamos los ficheros que tengan un nombre determinado, o que siga un# patrón determinadofind /home/laura/ -name prác4.c # Sólo muestra prác4.c (si existe)find /home/laura/ -name “prác?.c” # Muestra todos los prác?.cfind /home/laura/ -name “prác[12].c” # Muestra prác1.c y prác2.cfind /home/laura/ -iname lista.txt # No distingue mayúsculas/minúsculas

# Otras búsquedas más exóticasfind /usr/ -lname useradd # Muestra los enlaces simbólicos que apunten a

# useradd (saldrá adduser. Ya veremos qué son)find /home/pablo/ -inum 615 # Muestra el fichero con inodo 615

# (simplificando un poco, bloque de disco 615)find /etc/ -links 5 # Ficheros con 5 enlaces duros (también

# hablaremos de ellos)

# Búsquedas por tiempo (recordad que a es el de acceso, m el de modificación y# c el de cambio de estado)find -atime -4 # Ficheros accedidos en los últimos 4 días en todos los

# subdirectorios a partir del actualfind /etc/ -amin 30 # Ficheros accedidos hace justo 30 minutosfind /etc/ -amin -30 # Ficheros accedidos en la última media hora

Es importante darse cuenta de la diferencia entre las dos últimas órdenes; casi siempre que trabajéis con find ycondiciones temporales, utilizaréis el + y el -, porque no os interesará un momento exacto en el tiempo sino unintervalo (en los últimos tres días, en la última media hora, etc.).

# En principio no se pueden indicar fechas concretas, pero hay un trucotouch -t02010000 /tmp/fecha$$ # Crea un fichero temporal en 02/01 00:00find /etc/ -newer /tmp/fecha$$ # Ficheros modificados después que fecha$$rm -f /tmp/fecha$$ # Y borra el fichero temporal

Nota para curiosos/as (si os sentís satisfechos de momento, os la podéis saltar): ¿qué significa el $$ anterior? Enbash hay una serie de variables de entorno con información interesante, como por ejemplo $UID, que llevanuestro número de usuario actual; haciendo echo $UID podéis consultarlo. Estas variables empiezan con un$. La variable $$ representa el PID (process identifier, un número que identifica cada proceso del sistema) delproceso actual, de forma que si hacéis echo $$ aparecerá el número del proceso (que es el intérprete decomandos que estáis ejecutando; con la orden ps, explicada más abajo, lo podéis comprobar).

Pues bien, si hacéis touch -t02010000 /tmp/fecha$$ estaréis creando un fichero en /tmp/ que se llamará, porejemplo, /tmp/fecha4210, suponiendo que 4210 sea el PID de vuestra sesión bash actual.

Tened en cuenta también que cada sesión de bash abierta tendrá un PID diferente (son procesos separados), ycada vez que arranquéis el ordenador posiblemente bash tendrá un PID distinto.

¿Qué utilidad tiene esto, por qué no crear /tmp/fecha? Con órdenes de bash podéis crear programas útiles(scripts), y posiblemente los utilicen varios usuarios simultáneamente. Si uno de ellos crea un fichero/tmp/fecha con unos valores y otro usuario, justo después, crea otra copia de /tmp/fecha (con su propia fecha),será fácil que el primer usuario coja el fichero que no le corresponde y acabe tomando como referencia unafecha incorrecta. Si cada usuario (cada proceso de bash) identifica el fichero con su PID, no habráposibilidad de confusión y por tanto vuestro script podrá ser utilizado por muchos usuarios simultáneamente.

# Búsquedas por tamaño y alguna cosita másfind /home/laura -size 45k # Ficheros de tamaño igual a 45Kbfind /home/laura -size +45k # Ficheros mayores de 45Kb (más útil)find /home/laura -size -500c # Tamaño menor a 500 bytes (caracteres)find /home/laura -empty # Ficheros vacíos (tamaño 0)

Tened en cuenta que los prefijos + y - no sólo se pueden usar con -size, sino con otros muchos argumentos, paraindicar si buscamos los que sean iguales (sin prefijo), los mayores que el valor (con +) o los menores (con -).

# Tipo de ficherofind / -type b # Dispositivos de bloques (discos)find /home/ -type d # Sólo los directorios

Page 14: practica 3 - Comandos Linux

14 Centre d’estudis politècnics 2002-2003

# Propietarios y gruposfind /home/ -user pepito # Ficheros del usuario pepitofind /home/ -uid 500 # Ficheros con uid=500find /home/ -uid -501 # Ficheros con uid<=500, mucho más interesantefind /home/ -nouser # Ficheros sin usuario (con ls sale un número, # pero el usuario correspondiente ya no

# existe)

Una cosa que fastidia bastante del find es que al hacerlo sobre la raíz intente mirar en el CD o en la disquetera y déerror porque no hay discos dentro. Eso tiene fácil solución, por suerte:

find / -nouser -mount # No mira en otros sistemas de ficheros, sólo # en la partición actual

Y todos estos argumentos, y alguno más que hay, se pueden combinar en expresiones lógicas para poder definircondiciones más complejas:

# Ficheros de alguno de estos dos individuosfind /home/ -user pepito -or -user manolito

# No dará ningún fichero como resultado, porque un fichero no puede ser# de pepito y de manolito a la vez (lo correcto es utilizar -or)find /home/ -user pepito -and -user manolito

# Buena manera de ver qué canciones o ficheros sospechosamente grandes hay# por ahí. Fijaos en el uso de paréntesis, que por cierto deben ir# separados de los otros parámetros por un espacio y entre comillasfind /home/ “(“ -user pepito or -user manolito “)” -and “(“ -name *.mp3-or -size +4000k “)”

Tened en cuenta que si no se especifica ningún operador, por defecto utiliza -and. También tened en cuenta que sien un comando hay varias condiciones enlazadas con -and y una de ellas da F para un fichero, ya no seguiráevaluando las restantes condiciones para ese fichero, sino que pasará a evaluar el siguiente fichero.

Por último, está la opción que permite utilizar cualquier otro comando para realizar búsquedas más específicas.

# Ficheros modificados en los últimos 3 días y que contienen la palabra# ‘root’:find /home/ -mtime -3 -exec grep -l root ‘{}’ ‘;’# La idea es la siguiente: si se cumple -mtime -3, entonces ejecuta# (-exec) el comando grep, que será el que muestre los nombres (opción de# grep -l, que es una ele y no un uno y lo que hace es no mostrar las# líneas sino sólo los nombres de los ficheros que contienen la palabra# root) de los ficheros que le pase find (representados por el ‘{}’, ese# símbolo se sustituye por el nombre de cada fichero que cumpla el# -mtime 3). El ‘;’ termina el ámbito del -exec, lo que permite continuar# el find si aún quedan ganas.

Hay otra manera de conseguir el mismo resultado, y es utilizar el valor que devuelve -exec como condición: -execdevuelve V si el comando ejecutado (grep) devuelve un 0, y F en caso contrario. En general los comandos deLinux devuelven un 0 cuando tienen éxito y un valor distinto de 0 cuando no lo tienen; por ejemplo grepdevuelve un 0 si ha encontrado la palabra buscada en el fichero. Así que en este caso para los ficheros quecontengan la palabra ‘root’ grep devolverá un 0, y por tanto se cumplirá la condición y se ejecutará la acción -print:

# Nueva versión de lo anterior:find /home/ -mtime -3 -exec grep root ‘{}’ ‘;’ -print# Si el fichero contiene la palabra, -exec grep devuelve 0 y por tanto# cumple la condición y su nombre se muestra por pantalla mediante -print.

# Problema: grep nos enseña las líneas que contienen ‘root’, y sólo# queremos ver los nombres de los ficheros. Hay una opción de grep que# viene muy bien aquí: -q, que sólo busca las líneas pero no las muestra# por pantalla.find /home/ -mtime 3 -exec grep -q root ‘{}’ ‘;’ -print

Page 15: practica 3 - Comandos Linux

Práctica 2 de redes de área local: El intérprete de comandos de Linux 15

Quizá parezca más complicado que lo anterior, pero resulta mucho más potente cuando las condiciones a evaluarson complicadas o el comando a utilizar no es tan versátil como grep.

Veamos ahora una referencia más formal de todas las opciones, condiciones, acciones y operadores que se puedenutilizar con find. Recordad que “fichero” indica tanto ficheros como directorios. Tened en cuenta que find vaprocesando individualmente cada fichero que encuentra.

OpcionesSintaxis Significado-maxdepth n Máximo número de niveles de subdirectorio que recorre (-maxdepth 1 sólo mira en el directorio

actual)-depth Al recorrer subdirectorios, evaluar antes sus contenidos que el propio subdirectorio (útil en

combinación con comandos como tar, por ejemplo).-mount Sólo busca en el sistema de ficheros donde empiece la búsqueda, no pasa a otros.-follow Si encuentra un enlace simbólico a un directorio, lo sigue (por defecto no lo hace).-daystart Los comandos de tiempo cuentan desde el momento actual, así que por ejemplo -atime -2 cuenta

las últimas 48 horas. Esta opción hace que el tiempo se cuente desde el principio del día actual, deforma que -daystart -atime -2 cuenta los últimos dos días, ayer y anteayer.

Condiciones (los patrones con comodines deben ir entrecomillados)Sintaxis Significado Ejemplo-name patrón Devuelve V si el fichero se ajusta al patrón (que puede

contener ?, * y [abc...]). F en caso contrario.find /home/ -name “*.mp3”

-iname patrón Como el anterior, pero sin distinguir mayúsculas yminúsculas.

find /home/ -iname práctica

-lname patrón V si el fichero procesado es un enlace simbólico a unfichero cuyo nombre se ajuste al patrón.

find / -lname useradd

-ilname patrón Como el anterior, pero sin distinguir mayúsculas yminúsculas.

find / -ilname script*

-inum n V si el fichero está en el inodo n. find / -inum 332-links n V si el fichero tiene n enlaces duros (admite +n y -n). find / -links +5-atime n V si el fichero ha sido accedido n días antes.

Todas las condiciones -?time y -?min admiten +n y -n.find /home/ -atime -100

-ctime n V si su estado ha cambiado n días antes. find /home/ -ctime 3-mtime n V si ha sido modificado n días antes. find /etc/ -mtime 10-amin n V si ha sido accedido n minutos antes. find /etc/ -amin -50-cmin n V si ha cambiado de estado n minutos antes.-mmin n V si ha sido modificado n minutos antes. find /etc/ -mmin -100-used n V si el fichero ha sido usado n días después de que su

estado haya cambiado. Ayuda a encontrar ficheros que nose usan. Admite +n y -n.

find /home/ -used 90

-size n V si el fichero tiene un tamaño n, donde n se puedeescribir como (supongamos n=23):• 23: el fichero ocupa 10 bloques (de 512 bytes cada

uno)• 23b: lo mismo que antes• 23c: 23 bytes (caracteres)• 23k: 23 Kbytes• 23w: 23 palabras (2 bytes/palabra)Admite +n y -n.

find /home/ -size +5000kfind / -size -10c

-empty V si el fichero está vacío find /home/ana/ -empty-type x V si el fichero es de tipo x, que puede ser:

• b: dispositivo de bloques (disco)• c: dispositivo de caracteres (teclado)• d: directorio• p: tubería con nombre (named pipe o FIFO)• f: fichero normal• l: enlace simbólico• s: socket (conexión por red a otro ordenador)

find /etc/ -type l

-user usuario V si el fichero pertenece al usuario. find -user manolito

Page 16: practica 3 - Comandos Linux

16 Centre d’estudis politècnics 2002-2003

-group grupo V si pertenece al grupo. find -group asi1t-uid n V si pertenece al usuario de uid=n. find -uid 1 # uid=1 es root-gid n V si pertenece al grupo de gid=n. find -gid -500-nouser V si no pertenece a ningún usuario. find /home/ -nouser-nogroup V si no pertenece a ningún grupo. find /home/ -nogroup-perm modo Según cómo se indique el modo:

• -simbólico (con un - delante): V si tiene todos lospermisos indicados (puede tener más, pero al menos quetenga esos)

• +simbólico: V si tiene alguno de los permisosindicados (puede tener otros)

• Numérico: V si tiene exactamente esos permisos

find /home/pepe/ -perm +o+wfind /home/pepe/ -perm -a+xfind /home/pepe/ -perm 777

AccionesSintaxis Significado Ejemplo-print Escribe el nombre completo de los

ficheros. Si no se indica otra acción, pordefecto se aplica ésta.

find /home/manuel/ -print

-fprint fich Escribe el nombre completo de los ficherosen fich.

find /home/pedro/ -fprintmisfichs.txt

-ls Muestra la información completa de losficheros (la que sacaría ls -dils).

find /home/manuel/ -ls

-fls fich Como el anterior pero escribiéndola enfich.

find /home/pedro -fls misfichs.txt

-exec comando [opciones]‘{}’ ‘;’

Ejecuta el comando con sus opciones sobrecada fichero (representado por ‘{}’).Termina con el ‘;’. Ver ejemplos arriba.Devuelve V si el comando devuelve 0 (sinerror) o F en caso contrario (puede usarsepara aplicar condiciones más complejas).

find /home/laura/ -exec cat ‘{}’ ‘;’# En vez de mostrar sus nombres,# muestra su contenido

-ok comando [opciones] ‘{}’‘;’

Como el anterior, pero pide confirmaciónpara aplicar el comando a cada fichero.

find /home/toni/ -ok rm ‘{}’ ‘;’# Pregunta si borra cada fichero o no

-print0-fprint0 fich

Equivalen a las acciones sin 0 (cero), peroterminan los nombres de ficheros con uncero binario (como en C) para que otroscomandos puedan leer nombres concaracteres extraños o espacios (porejemplo, xargs -0).

OperadoresSintaxis Significado Valor devuelto-not expresión Niega el valor devuelto por expresión (que puede ser

una condición, una acción o una expresión compuestapor varias condiciones y/o acciones).

El contrario al que devolvería laexpresión.

expr1 -and expr2 Calcula la Y lógica sobre los valores devueltos porexpr1 y expr2. Equivale a no poner nada, o sea, a dejarexpr1 expr2.

expr1 Y expr2

expr1 -or expr2 Calcula la O lógica sobre los valores devueltos porexpr1 y expr2.

expr1 O expr2

“(“ expresión “)” Los paréntesis permiten forzar el orden de lasoperaciones.

El que devuelva expresión.

+número Las condiciones que lo permitan devolverán verdaderosi el valor buscado es superior a número.

Depende de la condición.

-número Las condiciones que lo permitan devolverán verdaderosi el valor buscado es inferior a número.

Depende de la condición.

Ejercicios para la práctica 2:7 Mostrad los ficheros de /etc/ modificados entre 2 y 10 días antes, que sean mayores de 10Kb y que no sean

directorios.7 Borrad los ficheros de /tmp/ que estén vacíos y a los que no se haya accedido desde hace más de una semana.

Page 17: practica 3 - Comandos Linux

Práctica 2 de redes de área local: El intérprete de comandos de Linux 17

7 Buscad los ficheros que contengan el texto “root” o “admin”.7 Cread un fichero que contenga los nombres de los ficheros mayores de 1Mb que no pertenezcan a root.7 Encontrad los ficheros con extensión jpg o jpeg que ocupen más de 100 Kb.

Ejercicios para la práctica 3:7 Encontrad los ficheros de root que tengan permisos de escritura para el grupo o los otros.7 Encontrad los ficheros que no tengan ningún permiso para los otros.7 Encontrad todos los ficheros sin propietario, sin grupo o del usuario luis.7 Mostrad los ficheros creados el día 1/2/2002 por el usuario manuel (cambiad día y usuario para que os dé

algún resultado).7 Encontrad los ficheros pertenecientes al usuario root o al grupo root que tengan los bits SetUId o SetGId.7 Moved todos los ficheros ordinarios (no directorios ni otras cosas) de /home/ sin propietario al directorio

/tmp/revisar/.

xargs: ejecuta un comando sobre una serie de ficheros

Este comando se suele utilizar en combinación con find, para poder aplicar algún comando sobre los ficherosencontrados. Básicamente se trata de un comando que aplica un comando sobre una lista de ficheros, que pordefecto le vienen por la entrada estándar. Típicamente se utiliza recogiendo como lista de ficheros la salida defind:

# El directorio actual es /home/luis/$find -name *.txt/home/luis/prueba.txt/home/luis/carta.txt

# Si en lugar de ver los nombres queremos ver el contenido de estosficheros,$find -name *.txt | xargs catEste fichero es una prueba. # Contenido de prueba.txtHola, Ana, voy a ver si consigo # Contenido de carta.txtencontrar mis gafas.

Vemos que lo que hace el ejemplo es pasarle los nombres de los ficheros encontrados por find a xargs, que a suvez los pone como parámetros de cat (o sea, que xargs hace que se ejecute cat /home/luis/prueba.txt/home/luis/carta.txt).

Es importante darse cuenta de que la diferencia entre la acción -exec de find y xargs es que el primero ejecuta elcomando una vez para cada fichero que cumple las condiciones, o sea que si hacemos un -exec wc, hará un wcpara cada fichero que cumpla las condiciones de find; sin embargo, xargs espera a que find encuentre todos losficheros que cumplen las condiciones y entonces ejecuta un único wc sobre todos los ficheros a la vez. Veamosla diferencia con un ejemplo:

# wc -l fichero a fichero muestra el número de líneas de cada uno# Sólo queremos contar las líneas de los ficheros de menos de 100 bytes$find -size -100c -exec wc -l ‘{}’ ‘;’3 ./prueba.txt7 ./texto.txt8 ./lista.txt

# Sin embargo wc -l aplicado a todos los ficheros a la vez además de# mostrar el número de líneas de cada uno, mostrará el total de líneas de# los tres:$find -size -100c | xargs wc -l 3 ./prueba.txt 7 ./texto.txt 8 ./lista.txt18 total

Un consejo con xargs: es bastante interesante ejecutar primero el find sin xargs para ver qué ficheros selecciona, ycuando se haya comprobado que todo funciona bien, entonces aplicar el xargs, sobre todo cuando estecomando va a ejecutar alguna orden peligrosa (borrar todos los ficheros, moverlos, etc.).

7 Cread un fichero con el contenido de todos los ficheros del usuario “pirato“ que contengan la palabra “virus”o “formatear”.