Curso GNU Linux capitulo 10 a 14

25
39 Capitulo 10. Accesando al sistema Ya estuvo bueno de todo lo que vimos antes, y aunque no lo creas, te servira mucho para entender el funcionamiento del sistema operativo, a partir de este punto realizaremos sesiones practicas. Durante este curso utilizaremos la forma mas humilde de acceso al sistema, terminal tonta. 45 Para entrar al sistema haremos lo siguiente: En Windows, seleccionamos Inicio->Ejecutar->telnet 192.168.1.251 Esto representa que usaremos una emulacion de terminal para entrar al sistema, realmente estamos emulando las funciones de una terminal tonta. Entrando al sistema Lo primero que nos solicita el sistema es nuestro nombre de usuario (o identificacion de usuario) y despues de presionar Enter, el password de dicho usuario. El administrador del sistema normalmente crea los usuarios y asigna los passwords para cada usuario que accesara al sistema. Tu usuario, es tu nombre, seguido por la primera letra de tu apellido, por ejemplo, si te llamas Victor Martinez (tu servidor y amigo). Entonces tu usuario sera: victorm, todo con minusculas, y en este curso el password sera el mismo nombre de tu usuario, por lo cual al aparecerte el indicador de: Login: Teclearas: Login: victorm[Enter] Password: victorm[Enter] Notaras que cuando teclees el password, no aparece nada en la pantalla, esto es normal, es una forma de seguridad. Logicamente, si tu no te llamas Victor Martinez, pues no pones como usuario: victorm y como password: victorm, pondras lo que corresponde a tu nombre. 45 Es terminal tonta por sus capacidades, no por la gente que la usa.

description

Curso de Linux impartido por Adrian de los Santos (demon)

Transcript of Curso GNU Linux capitulo 10 a 14

  • 39

    Capitulo 10. Accesando al sistema Ya estuvo bueno de todo lo que vimos antes, y aunque no lo creas, te servira mucho para entender el funcionamiento del sistema operativo, a partir de este punto realizaremos sesiones practicas. Durante este curso utilizaremos la forma mas humilde de acceso al sistema, terminal tonta.45 Para entrar al sistema haremos lo siguiente: En Windows, seleccionamos Inicio->Ejecutar->telnet 192.168.1.251 Esto representa que usaremos una emulacion de terminal para entrar al sistema, realmente estamos emulando las funciones de una terminal tonta.

    Entrando al sistema Lo primero que nos solicita el sistema es nuestro nombre de usuario (o identificacion de usuario) y despues de presionar Enter, el password de dicho usuario. El administrador del sistema normalmente crea los usuarios y asigna los passwords para cada usuario que accesara al sistema. Tu usuario, es tu nombre, seguido por la primera letra de tu apellido, por ejemplo, si te llamas Victor Martinez (tu servidor y amigo). Entonces tu usuario sera: victorm, todo con minusculas, y en este curso el password sera el mismo nombre de tu usuario, por lo cual al aparecerte el indicador de: Login:

    Teclearas:

    Login: victorm[Enter] Password: victorm[Enter] Notaras que cuando teclees el password, no aparece nada en la pantalla, esto es normal, es una forma de seguridad. Logicamente, si tu no te llamas Victor Martinez, pues no pones como usuario: victorm y como password: victorm, pondras lo que corresponde a tu nombre. 45 Es terminal tonta por sus capacidades, no por la gente que la usa.

  • 40

    Una vez dentro del sistema, te aparecera lo siguiente: Last login: Fri Jun 18 09:07:24 from deepgreen.demon.com.mx demon@knuth demon $

    La primera linea, indica cuando fue la ultima vez que entraste al sistema (Fri Jun 18), a que hora (09:07:24) y desde que maquina entraste (en este caso desde la maquina llamada deepgreen.demon.com.mx). La segunda linea, muestra el nombre de usuario con el que entraste, en mi caso demon, el nombre del sistema al que entraste (knuth) y en que directorio te encuentras, por default, cuando entras al sistema te posicionas en tu directorio de casa o home directory (en este caso es /home/demon), no aparece la ruta completa, solo el ultimo subdirectorio (demon). Esta ultima linea, es un indicador de linea de comando, ahi, como su nombre lo dice, puedes introducir comandos, mas especificamente esto se llama Prompt. El signo de pesos al final de tu linea de comando ($), tambien identifica que eres un usuario normal, cuando el superusuario entra al sistema, su Prompt cambia y en lugar de un signo de pesos, aparece un signo de numeros o gato (#). A lo que estamos accesando se denomina shell. Shell es una palabra en ingles que significa Concha (has visto los aceites marca shell ?, cual es su logotipo ?), la idea detrs de este nombre es que el shell es una cobertura para el sistema operativo, tu no interactuas directamente con el kernel, tu interactuas con el shell, el cual te permite ejecutar programas, cambiarte a diferentes directorios, controlar la entrada/salida e incluso crear programas (tambien llamados shell scripts). Graficamente representado, el shell se podria ver de la siguiente manera:

    El kernel rodeado de aplicaciones o programas, en los cuales, el shell es uno de ellos. Pero el shell es un programa especial en el hecho de que permite ejecutar otros programas y que tambien es un lenguaje de programacion. Entonces los programas no pueden directamente hablar con el kernel ?, Si. Y de hecho, lo hacen, pero como iniciarias el programa ?, para eso sirve el shell, entre otras cosas.

  • 41

    Capitulo 11. Que es un comando. Lo primero que haremos una vez que estamos dentro del sistema es verificar en que directorio estamos situados, para lo siguiente, utilizaremos el comando pwd. Pwd es una contraccion de Print Working Directory o Imprimir el directorio de trabajo y despliega el directorio en el cual te encuentres situado actualmente. $ pwd /home/demon

    Como podemos ver, el comando pwd nos desplego el directorio en el cual nos encontramos, y efectivamente es nuestro directorio de casa o home directory puesto que como vimos anteriormente los directorios de casa de cada usuario se encuentran sobre el directorio /home. Tambien hay que notar que despues de haber ejecutado el comando, el shell nos vuelve a desplegar el prompt, esperando que tecleemos otro comando. Mientras el comando esta siendo ejecutado, el prompt ($) no es desplegado en la pantalla. Cuando el comando finaliza su ejecucion, el prompt es desplegado nuevamente. En Unix, un "comando" es un programa que tu puedes ejecutar. En otros sistemas operativos, tales como Mac OS o Windows, tu apuntas a el programa que deseas ejecutar y realizas la funcion de dar doble click sobre el. Para ejecutar un comando en Unix, tu teclas su nombre y presionas Enter. Por ejemplo: $ date [Enter] Fri Mar 19 21:34:59 CST 2004 $

    Al introducir este comando, date despliega el nombre del dia, mes, numero de dia transcurrido del mes, hora, zona horaria y ao de el sistema.

  • 42

    Ahora veamos otro ejemplo de un comando: $ who demon tty1 Mar 16 02:26 root tty2 Mar 16 01:26 tatito pts/1 Mar 14 00:23 $

    Aqui, se introdujo el comando who, el cual despliega los usuarios que se encuentran dentro del sistema, la terminal desde la cual estan conectados y la fecha en la que entraron al sistema. Aqui podemos ver que existen 3 usuarios dentro del sistema, demon, root y tatito, la primera columna muestra el nombre de los usuarios, la segunda columna la terminal desde la cual el usuario entro al sistema y la tercera la fecha y hora en la que entraron a este sistema. El formato y valores de despliegue de cada comando puede variar ligeramente de un sistema Unix a otro, o de un sistema Linux a otro (con diferentes versiones de kernel o diferentes distribuciones).

    Comandos Simples Los comandos pwd, who y date son ejemplos de comandos simples. Un comando simple es el que puedes ejecutar teclando su nombre en el prompt de la siguiente manera: $ comando

    En este ejemplo, comando es el nombre de el comando que deseas ejecutar. Los comandos simples pueden ser comandos pequeos y con funciones especificas y sencillas, tales como who y date, o pueden ser comandos largos, tales como un navegador de web o un programa de hoja de calculo. Tu puedes ejecutar la mayoria de los comandos de Unix como comandos simples.

  • 43

    Comandos complejos Puedes usar el comando who para obtener informacion acerca de tu usuario (que esta dentro del sistema) cuando se ejecuta de la siguiente manera: $ who am i demon ttyp5 Mar 19 22:16 $

    Este comando despliega la siguiente informacion: Mi nombre de usuario es demon Estoy entrando desde la terminal ttyp5 Entre a las 22:16 del 3 de Marzo Este comando tambien nos sirve para introducir el concepto de comando complejo, lo cual es un comando que consiste en un comando (valga la redundancia) y una lista de argumentos. Los argumentos son modificadores que cambian el comportamiento de un comando. En este caso, el nombre del comando es who y los argumentos am e i. Cuando el comando who se ejecuta como un comando simple, despliega informacion acerca de todos los usuarios que estan en el sistema. La salida que es generada cuando un comando es ejecutado como un comando simple es llamado el comportamiento por defecto de ese comando (default behavior). Mientras que el prompt esta desplegado, tu puedes introducir comandos. El shell lee la entrada despues de que tu presiones Enter. Determina el comando a ejecutar examinando la primera palabra de los datos introducidos. Una palabra es un conjunto de caracteres continuos. Los espacios y tabuladores separan las palabras. Para el shell los datos introducidos son analizados de la siguiente manera: $ palabra1 palabra2 palabra3 ... palabraN

    El shell siempre eligira palabra1 como el nombre de el comando que deseas ejecutar. Si solo existe una palabra tal como: $ date

  • 44

    El trabajo del shell es facil, ejecuta el comando date46, pero si existen mas palabras, tal como: $ who am i

    El shell pasa las siguientes palabras como parametros a el comando indicado por la primera palabra. Estas palabras adicionales al comando se denominan Parametros o Argumentos (en este caso, el comando seria who y los parametros am e i). Los argumentos am e i cambian el comportamiento del comando who para listar informacion acerca de ti solamente. En Unix/Linux, la mayoria de los comandos aceptan argumentos o parametros que modifican su comportamiento. La sintaxis formal para un comando complejo: $ comando argumento1 argumento2 argumento3 ... argumentoN

    Aqui, comando es el nombre del comando que deseas ejecutar, y argumento1 hasta argumentoN son los argumentos que deseas proporcionar al comando. Los separadores de argumentos son los espacios y tabulaciones, es por eso que si tu tecleas: $ whoam i

    Te aparece el siguiente error: -bash: whoam: command not found

    Indicandote que el shell trato de encontrar un programa llamado whoam47 y trato de pasarle el parametro i, pero no pudo encontrar ningun programa llamado whoam, debido a que el programa que tratamos de ejecutar se llama who y no whoam. Este es uno de los errores mas comunes de las personas que comienzan a utilizar una linea de comandos, ten cuidado con lo que tecleas.

    46 Realmente, busca un comando interno o externo con el nombre de date, si lo encuentra entonces lo ejecuta. 47 Si por alguna razon quieres intentar con whoami ese comando si existe.

  • 45

    Comandos compuestos Una de las caracteristicas de los sistemas *nix es la capacidad de combinar comandos simples y complejos con el fin de obtener comandos compuestos. Un comando compuesto consiste en una lista de comandos simples y complejos separados por el caracter de punto y coma (;). Un ejemplo de un comando complejo es: $ date ; who am i Fri Mar 19 22:39:17 CST 2004 demon ttyp5 Mar 19 22:39 $

    Aqui el comando compuesto, consiste en el comando simple date y el comando complejo who am i. Como puedes ver por los datos desplegados el comando date es ejecutado primero y despues el comando who am i. Cuando se introduce un comando complejo, cada uno de los comandos individuales que componen al comando complejo se ejecutan en el orden en que fueron tecleados. En el ejemplo anterior, el comando compuesto se comporta como si se hubieran tecleado los dos comandos por separado por ejemplo: $ date Fri Mar 19 22:39:17 CST 2004 $ who am i demon ttyp5 Mar 19 22:39 $

    La diferencia basica entre ejecutar comandos de esta manera y ejecutarlos de forma separada es que con un comando compuesto no se obtiene el prompt entre cada uno de los comandos que se ejecuta. La sintaxis formal para un comando compuesto es: $ comando1 ; comando2 ; comando3 ; ... ; comandoN

    Aqui, desde comando1 hasta comandoN pueden ser comandos simples o complejos. El orden de ejecucion es: Primero se ejecuta comando1, despues comando2, despues comando3 y asi consecutivamente. Cuando comandoN termina su ejecucion el prompt regresa.

  • 46

    Separadores de comandos El caracter punto y coma (;) es tratado como un separador de comandos, lo cual indica "donde un programa termina, el otro comienza" Si no se usa para separar cada uno de los comandos individuales en un comando compuesto, la computadora no sabra donde termina un comando y donde comienza el otro. Por ejemplo, si ejecutamos el ejemplo anterior sin el punto y coma (;) obtendremos: $ date who am i date: illegal time format usage: date [-nu] [-r seconds] [+format] date [[[[[cc]yy]mm]dd]hh]mm[.ss] $

    Asi es, un bonito error. Porque ? debido a que el comando date piensa que esta siendo ejecutado como un comando complejo con los argumentos who, am e i. El comando date no entiende esos argumentos y despliega el mensaje de error. Tambien se puede utilizar el punto y coma para indicar la terminacion individual de comandos simples y complejos, por ejemplo: $ who am i; demon ttyp5 Mar 19 22:56 $ who am i demon ttyp5 Mar 19 22:56 $

    En el primer caso, se ejecuto who am i; (notar el punto y coma al final), en el segundo caso, se ejecuto who am i sin punto y coma al final, el resultado del comando es exactamente el mismo. En multiples lenguajes de programacion (Pascal, C, Perl, Ruby, etc), se utiliza el caracter de punto y coma para designar el final de la linea, y muchos programadores de shell scripts lo utilizan de la misma forma, mas como una cuestion de costumbre que funcional.

  • 47

    Capitulo 12. Los diferentes tipos de Shells Desde la creacion de el sistema Unix original han existido diferentes tipos de shells con diferentes caracteristicas, el primer shell (el original creado por Dennis Ritchie y Ken Thompson) unicamente era un interprete de comandos, localizaba el comando y lo ejecutaba, cuando el comando terminaba el control regresaba a el shell, el cual estaba listo nuevamente para recibir algun otro comando o instruccion. Durante los mas de 30 aos que los sistemas *nix han existido se han creado una gran variedad de shells con diferentes caracteristicas, la mayoria de estos shells estan basados en 2 tipos de shell's: Bourne Shell (sh).- El shell mas popular de los sistemas *nix, por mucho tiempo fue la unica opcion existente para interactuar con el sistema. Este shell ha sido la base para crear diferentes variantes del mismo, algunas de estas variantes son: -Korn Shell (ksh) -Bash o Bourne Again Shell (bash) -POSIX shell (sh) C shell (csh).- Creado por Bill Joy (co-fundador de Sun y creador de Java48) a finales de los 70's. De igual manera que el Bourne shell permite ejecutar comandos, pero adiciona algunas caracteristicas de funcionalidad, tal como un historial de comandos y mejor control de procesos. Este shell ha sido la base para la creacion de las siguientes variantes: - TENEX/TOPS C shell(tcsh) Cual shell es mejor ? Bueno esa es una pregunta casi religiosa para algunas personas. El mejor shell es con el que eres mas productivo. Durante este curso utilizaremos el Bourne Again Shell (bash) debido a que es el shell de default para los sistemas Linux, adicionalmente el 99% de la programacion en bash es totalmente compatible con Bourne shell, el cual esta disponible en cualquier sistema *nix, significando que se podra aplicar lo aprendido en este curso en la mayoria de los sistemas Unix existentes.

    48 Tambien programador lider de OpenBSD, FreeBSD, creador de vi, nr, biff y otros comandos mas, toda una joyita.

  • 48

    El Bourne Shell (sh) El shell original de Unix fue creado a mediados de los 70's por Stephen R. Bourne mientras el trabajaba en los laboratorios Bell AT&T de New Jersey. El Bourne shell fue el primer shell que aparecio en los sistemas Unix. El Bourne shell se encuentra normalmente en el directorio bin y su nombre de archivo es sh (/bin/sh). En adicion a ser un interprete de comandos el Bourne shell es un lenguaje de programacion con una estructura similar a el antiguo lenguaje de programacion ALGOL. El Bourne shell contiene las siguiente caracteristicas: Control de procesos Variables Expresiones regulares Control de flujo Control de Entrada/Salida Soporte a Funciones Pero algunos de los problemas de el Bourne shell original son: No existe soporte a autocompletado de nombres de archivos (el uso del

    tabulador) No existe historial de comandos ni edicion en linea Dificultad para ejecutar multiples procesos en background Es posible que muchas de estas caracteristicas y desventajas del Bourne shell no se lleguen a comprender por completo en este momento, prero como vayamos avanzando en el curso tocaremos nuevamente estos topicos.

  • 49

    El Bourne Again Shell (bash) El Bourne Again Shell, bash, fue desarollado como parte del proyecto GNU y ha reemplazado a el Bourne shell, sh, en los sistemas basados en GNU, tal como Linux. Practicamente todas las distribuciones de Linux utilizan bash como su reemplazo de sh. Incluye caracteristicas de C shell, Korn Shell y logicamente Bourne shell. bash fue escrito inicialmente por Brian Fox ([email protected]) y es actualmente mantenido por Chester Ramey ([email protected]). Debido a que bash es totalmente compatible con el Bourne shell, la mayoria de las distribuciones de Linux reemplazan el Bourne shell con bash (/bin/bash y /bin/sh son el mismo archivo) Algunas de las caracteristicas de el Bourne Again Shell son: Autocompletado de nombres de variables , usuarios, nombres de servidores, comandos y archivos Correccion de rutas de archivos en el comando cd Soporte a arrays de tamao ilimitado Aritmetica de enteros en cualquier base numerica (entre 2 y 64) Muchas de estas caracteristicas se veran en el transcurso del curso.

  • 50

    Inicializacion Ahora veremos de forma general lo que sucede realmente para que nosotros podamos teclear comandos en el sistema, esto es un recorrido de los pasos que realiza el sistema con la finalidad de poder desplegar un shell en la terminal, muchos de estos pasos no seran entendidos en este punto, pero muchos si, la idea de poner esta serie de pasos y procedimientos es la de crear una idea general de la inicializacion que el sistema lleva acabo cada vez que se accesa al mismo. Una terminal esta conectada a el sistema a traves de cable serial, telefonico (modem) o red. Tradicionalmente en la pantalla de la terminal (o emulador de terminal) aparece la palabra login:. Para cada terminal habilitada existe un programa llamado getty que activa la funcion de login. (en el caso de logins o accesos a traves de la red, no se utiliza getty, se utiliza el proceso o demonio "inetd", el cual habilita el servicio ya sea de telnet, rlogin o ssh) El sistema, mas bien un programa del sistema llamado init automaticamente ejecuta getty en cada terminal en la cual se permite que los usuarios puedan entrar. getty determina la velocidad de transmision , despliega el mensaje login: y entonces espera que el usuario introduzca datos, tradicionalmente el nombre del usuario, despues de presionar Enter, getty despliega el mensaje password: en la terminal y espera que el usuario introduzca su contrasea. Una vez obtenido el nombre de usuario y su password, estos se comparan con la entrada correspondiente en el archivo /etc/password. Este archivo contiene una linea por cada usuario del sistema. Esta linea especifica entre otras cosas el nombre de usuario, el directorio de casa (home directory) y que programa se ejecutara una vez que el usuario entre al sistema. En este ultimo segmento de informacion (el programa que se ejecuta cuando el usuario entra al sistema) indica el shell que se ejecutara cuando el nombre de usuario y su password esten verificados correctamente. Cuando el shell se ejecuta, realiza las siguientes funciones: Si existe el archivo /etc/profile, ejecuta las instrucciones que se encuentren en el. Si existe el archivo .profile en el directorio de casa del usuario se ejecutan

    las instrucciones que se encuentran en el. Despliega el prompt de el shell (tipicamente un signo de pesos $) y espera que se introduzcan comandos

  • 51

    Cada vez que se introduce un comando y se presiona la tecla Enter, el shell analiza la linea y procede a realizar el requerimiento solicitado. Si se le pide que ejecute un programa en particular, el shell busca el programa en ciertas partes del disco y si lo encuentra le pide a el kernel que inicie la ejecucion del programa, el shell entonces "duerme" hasta que el programa ha finalizado. El kernel copia el programa especificado en la memoria y comienza su ejecucion. Esta copia del programa en la memoria es llamado proceso; de esta manera se puede definir que un programa es el que esta almacenado en un archivo en el disco, mientras que un proceso se encuentra en la memoria ejecutandose. Si el programa envia su salida a traves de la salida estandar (standard output), esta aparece en la terminal a menos de que esta salida sea redirigida o "piped" a otro comando. De forma similar, si el programa lee la entrada de la entrada estandar (standard input) entonces el programa esperara que se tecleen datos en la terminal a menos que se le envie la entrada por medio de un "pipe"49 o se le rediriga de un archivo. Cuando el programa finaliza su ejecucion el control regresa nuevamente a el shell. Es importante reconocer que el shell es unicamente un programa, no tiene privilegios especiales en el sistema, lo cual significa que cualquier persona con suficiente tiempo, conocimiento y devocion puede crear su propio shell. Esta es una de las razones por las cuales existen tantas variantes de shells para sistemas *nix.

    El proceso de inicializacion del shell por medio de una terminal serial (lineas rojas) y por medio de un esquema de red via telnet (lineas azules).

    49 Los terminos redireccion , entrada estanda, salida estandar y pipe no son conocidos hasta este punto, mas adelante los tocaremos.

  • 52

    Capitulo 13. Comandos escenciales En este capitulo se veran algunos comandos escenciales que necesitaremos para avanzar en este curso.

    Listando archivos ls.- su nombre se deriva de LiSt, es decir, lista los nombres de los archivos que se encuentran en el directorio indicado, si no se le indica ningun directorio, lista los archivos del directorio en el cual se encuentra el usuario. Ejemplo: $ ls [Enter]

    Despliega los nombres de los archivos en el directorio actual. $ ls /etc

    Despliega los nombres de los archivos en el directorio /etc $ ls /

    Despliega los nombres de los archivos y directorios que se encuentran en el directorio principal

    Despliega los nombres de archivos existentes en el directorio /usr/bin

    Desplegando el contenido de un archivo: cat.- El nombre cat viene de su funcion, concatena la entrada estandar con la salida estandar50, en otras palabras despliega el contenido de la entrada estandar (la cual puede ser un archivo), el parametro que utiliza comunmente es el nombre del archivo a desplegar. Por ejemplo: cat /etc/hosts [Enter]

    Despliega el contenido del archivo /etc/hosts

    Despliega el contenido del archivo /etc/inittab 50 Mas adelante veremos la entrada estandar y la salida estandar

  • 53

    Desplegando texto: echo.- Este es uno de los comandos mas faciles de utilizar, simplemente despliega los argumentos que se introducen, por ejemplo: $ echo hola hola

    En el ejemplo anterior el comando echo recibe como argumento la palabra hola, el comando unicamente despliega el argumento que se le indico como parametro, por lo cual la salida del comando es hola. $ echo hola como estas hola como estas

    En el ejemplo anterior se introducen 3 argumentos, hay que notar los espacios existentes entre cada argumento y la salida del comando. El comando echo utiliza los espacios y tabulaciones para distinguir un parametro de otro, por lo cual no se respetan los espacios existentes entre los parametros. $ echo "hola como estas" hola como estas

    En este caso se le esta especificando a el comando echo que hola como estas es un solo parametro y no 3 parametros separados, para hacer esto se encierra el parametro entre comillas ("). Y como podemos ver ahora los espacios entre las palabras si son respetados.

    Despliega mensaje hola mundo usando el comando echo

    Copiando archivos: cp.- El nombre del comando tambien nos dice su funcion, cp viene de la palabra en ingles "copy", por lo cual este comando copia archivos, recibe dos parametros, el primero es que archivo copiar y el segundo a donde copiarlo. Ejemplos: $ cp /etc/hosts /tmp

    Este comando copiara el archivo llamado hosts que se encuentra en el directorio /etc a el directorio /tmp (en caso de que el directorio /tmp exista, de lo contrario creara un archivo llamado tmp en el directorio principal con una copia del contenido del archivo /etc/hosts)

  • 54

    $ cp archivo1.txt respaldo.txt

    En este caso se copia el archivo con nombre archivo1.txt a otro archivo. El archivo de copia tendra el nombre respaldo.txt. $ cp /etc/hosts /home/victorm/hosts

    Aqu estamos copiando el archivo hosts que se encuentra en el directorio /etc a el home directory del usuario victorm, el archivo quedara en este directorio con el nombre hosts, pero si no se especifica el nombre de destino, solo el directorio de destino, el nombre original se respeta, es decir, esta otra linea de comando tiene el mismo funcionamiento: $ cp /etc/hosts /home/victorm

    Aqu no se especifica con que nombre quedara el archivo hosts, pero se especifica un directorio de destino (/home/victorm) el comando cp asume que el nombre de destino sera el mismo, por lo cual creara un archivo llamado hosts en el directorio /home/victorm. Para ilustrar mas este punto: $ cp /etc/hosts /home/victorm/nuevoarchivo

    Esto copiara el archivo /etc/hosts a /home/victorm con el nombre nuevoarchivo. cp tambien puede copiar directorios completos, por ejemplo: cp /home/victorm /tmp

    En este caso se esta copiando todo el directorio /home/victorm a el directorio /tmp Como podemos ver, en el comando cp los parametros pueden ser archivos o directorios.

    Prueba copiando el archivo /etc/hosts a tu home directory con el mismo nombre (hosts) y con otro nombre (digamos copianueva). Verifica con el comando ls que realmente se haya realizado la copia.

  • 55

    Contando palabras: wc.- El nombre del comando viene de la palabra en ingles "word count" o contar palabras, aunque no solo sirve para contar palabras, tambien lineas y caracteres. Podemos usar wc para contar las palabras que existen en un archivo, por ejemplo: $ wc /etc/hosts 17 86 567 /etc/hosts

    El primer numero en este caso es el numero de lineas del archivo, el segundo es el numero de palabras, el tercero el numero de caracteres y el cuarto el nombre del archivo. El nombre del archivo es importante cuando se especifica mas de un archivo en el comando: $ wc /etc/hosts /etc/passwd 17 86 567 /etc/hosts 16 72 722 /etc/passwd 33 158 1289 total

    Si se especifica mas de un archivo, wc despliega los resultados de cada archivo individual y el total de todos los archivos. Se puede utilizar el comando wc para obtener resultados individuales (lineas, palabras o caracteres) especificando las siguientes opciones: Opcion Descripcion -l Cuenta el numero de lineas -w Cuenta el numero de palabras -m o c Cuenta el numero de caracteres De esta manera: $ wc -l /etc/hosts 17 /etc/hosts

    Despliega unicamente el numero de lineas existentes en el archivo /etc/hosts.

    Cuenta el numero caracteres que existen en el archivo /etc/passwd

  • 56

    Desplegando el contenido de un archivo por paginas El comando cat, nos permite desplegar el contenido de un archivo, pero si el archivo es muy extenso, no podemos ver el principio del mismo, solo veremos las ultimas 24 lineas que se despliegan del archivo en la terminal. Por ejemplo: $ cat /etc/X11/XF86Config

    No te fijes mucho en el contenido del archivo, todavia no sabes para que sirve el mismo, desplegamos su contenido con la finalidad de comprobar que cuando un archivo es muy extenso solo vemos sus ultimas 24 lineas. Si quisieramos hacer una pausa para poder ver el principio del archivo, tendriamos que usar el comando more: El comando more recibe como parametro la ruta de un archivo51, ahora con este nuevo comando tratamos de desplegar nuevamente el archivo anterior. $ more /etc/X11/XF86Config

    Ahora el despliegue del archivo se detiene cada 24 lineas, permitiendonos ver el inicio52. Si presionas la tecla [Enter] puedes bajar una linea mas, si presionas la barra espaciadora, despliegara otras 24 lineas, si presionas la tecla b (back) regresara una pantalla completa, con la tecla G va a el final del documento, si presionas / (diagonal) puedes buscar algo dentro del archivo, por ejemplo, busquemos la palabra section. Para hacer eso tecleamos: /section[Enter]

    Eso nos llevara a la primera ocurrencia de la palabra section, si pulsamos la tecla n (next) nos llevara a la siguiente. Incluso, puedes utilizar las flechas de arriba y abajo para subir o bajar en el despliegue del archivo. Si presionamos la tecla q (quit) sale del comando y regresa el shell.

    Despliega con el comando more el archivo /etc/inittab

    51 O una entrada estandar, pero ya veremos eso mas adelante. 52 Tambien muestra a que porcentaje de visualizacoin del archivo te encuentras.

  • 57

    Usando la documentacion electronica Una de las facilidades mas importantes incluidas en los sistemas Unix y Linux es el manual electronico. El manual electronico se accesa a traves del comando man (Manual) y este es uno de los comandos mas importantes y utilizados del sistema. Existen multiples opciones que modifican la forma de operacin de los comandos, todas estas opciones se encuentra documentada en el manual electronico de cada comando, por lo cual, es importante leer el manual electronico de los comandos que utilices, asi aprenderas mas de su uso y de las opciones o modificadores que permiten. Para desplegar la documentacion electronica de algun comando, tecleamos el comando man y le especificamos como parametro el comando del cual deseamos desplegar el manual. Por ejemplo, para desplegar el manual del comando more tecleamos lo siguiente: $ man more

    El formato de un manual electronico de Unix y Linux, tradicionamente incluye el nombre del comando, una descripcion corta, una descripcion extendida de su funcionamiento, los comandos y opciones que soporta, notas adicionales y el autor o autores del comando especifico. El despliegue de los datos se realiza con el comando more, por lo cual todo lo que vimos anteriormente se aplica, para buscar alguna palabra dentro del documento, utilizamos / (diagonal), para bajar una linea usamos [Enter], para recorrer otra pagina usamos la barra espaciadora, para salir tecleamos la letra q. Existen diferentes secciones del manual para diferentes tipos de comandos, por ejemplo el comando echo y la instruccin echo. La seccion 1 es para comandos del sistema, mientras que la seccion 3 es el manual para programadores, entonces si tecleamos: $ man 1 echo

    Estamos especificando que deseamos desplegar el manual del comando echo, mientras que con: $ man 3 echo

  • 58

    Indicamos que deseamos desplegar el formato de la instruccin de lengauje C llamada echo (la cual es parte de la librera curses). Adicionalmente se puede utilizar la opcion k (keyword) para buscar un comando o palabra dentro de todas las secciones de los manuales. Para buscar en que partes de los manuales electronicos aparece la palabra zip tecleamos: $ man k zip

    Nos mostrara una lista como esta: bunzip2 [bzip2] (1) - a block-sorting file compressor, v1.0.2 bzcat [bzip2] (1) - decompresses files to stdout bzcmp [bzdiff] (1) - compare bzip2 compressed files bzdiff (1) - compare bzip2 compressed files . . . . . zipnote [zip] (1) - package and compress (archive) files zipsplit [zip] (1) - package and compress (archive) files

    Indicando que en todos esos comandos, aparece la palabra zip, tambien muestra en que seccion del manual se encuentran esos comandos ( En este caso, todos estan en la seccion 1). Si no se especifica la seccion del manual, por default se asume que se buscara en la seccion 1 (es decir en comandos del sistema operativo). Que nos muestra el siguiente comando ?: $ man 2 open

    Para que es la seccion 2 del manual ?

    Despliega el manual del comando more e investiga para que sirve la opcion -num En el manual del comando vi, investiga quien es el autor de este comando (tradicionalmente esa informacion se encuentra al final del documento).

    Para que sirve la opcion r del comando cp ? El leer el manual del comando no es opcional, es mandatorio, en este curso veremos algunas opciones caracteristicas de muchos comandos, pero es totalmente necesario que tu investigues por ti mismo todas las funcionalidades de los comandos que desees utilizar.

  • 59

    Capitulo 14. Generalidades de los archivos, directorios y control de la seguridad

    Directorios Una de las cualidades especificas de los sistemas *nix es el uso de directorios como un elemento clave en la organizacin de archivos, programas y esquemas de configuracion. Antes de Unix, no existia el concepto de directorios, los sistemas anteriores a Unix almacenaban todo en un solo lugar logico y eso generaba problemas para encontrar ciertos archivos o programas. Como hemos visto, el punto focal de la organizacin logica de los datos son los directorios, podemos darnos cuenta de lo anterior desde el momento en que entramos al sistema debido a que se nos posiciona en un directorio especifico, el home directory. Los comandos basicos para el control, navegacion y manipulacion de directorios son: pwd cd mkdir rmdir

    El comando pwd Este comando significa literalmente Print Working Directory (desplegar el directorio de trabajo) y como su nombre lo dice, nos permite saber en que directorio nos encontramos posicionados. Por ejemplo: victorm@knuth victorm $ pwd /home/victorm

    Nos muestra que el usuario victorm se encuentra posicionado en el directorio /home/victorm (su home directory). Adicionalmente el prompt o linea de comando, nos muestra tambien la ultima parte del directorio en el cual se encuentra el usuario actualmente, esto lo veremos con el comando cd.

  • 60

    El comando cd Este comando tiene la finalidad de cambiar a otro directorio, tal como su nombre lo dice Change Directory (CD). El comando cd puede usar rutas relativas o absolutas, eso lo veremos en breve, pero primero unos ejemplos: victorm@knuth victorm $ cd /tmp victorm@knuth tmp $ pwd /tmp

    En la primera linea del ejemplo anterior, le indicamos al comando cd que deseamos cambiar al directorio /tmp es decir, desde la raiz, a un directorio llamado tmp. El comando cd nos cambia a dicho directorio y podemos verificarlo ejecutando el comando pwd, tambien podemos ver que el prompt ahora muestra el directorio en donde estamos situados (victorm@knuth tmp). Para regresar a nuestro directorio de casa tenemos varias opciones, la primera seria indicarle la ruta completa en donde se encuentra nuestro directorio al comando cd, de la siguiente manera: victorm@knuth tmp $ cd /home/victorm victorm@knuth victorm $ pwd /home/victorm

    La segunda seria utilizar el carcter especial ~, para probar esto regresemos nuevamente al directorio /tmp y tecleamos: victorm@knuth victorm $ cd /tmp victorm@knuth tmp $ cd ~ victorm@knuth victorm $ pwd /home/victorm

    El carcter ~ indica la ruta completa del directorio de casa del usuario, por lo cual el teclear: victorm@knuth tmp $ cd ~

    o victorm@knuth tmp $ cd /home/victorm

    Tiene el mismo efecto para el shell.

  • 61

    La ultima forma es posiblemente la mas facil, simplemente tecleamos el comando cd sin ningun parametro y eso nos llevara automaticamente a nuestro home directory: victorm@knuth victorm $ cd /tmp victorm@knuth tmp $ cd victorm@knuth victorm $ pwd /home/victorm

    Otra caracteristica interesante es que se puede regresar a la ultima ruta en la que te encontrabas utilizando el signo de menos (-), por ejemplo: victorm@knuth victorm $ cd /tmp victorm@knuth tmp $ cd /var victorm@knuth var $ cd victorm@knuth tmp $ pwd /tmp

    En este ejemplo, nos encontrabamos en el home directory de victorm (/home/victorm), de ah vamos a el directorio /tmp, de ah vamos al directorio /var, y ah indicamos que deseamos regresar al directorio anterior donde nos encontrabamos, especificando el parametro (signo de menos) a el comando cd y verificamos que el comando cd nos regreso al directorio anterior. La forma de recorrer directorios se basa en rutas, las cuales pueden ser relativas o absolutas.

    Rutas absolutas y relativas Existen dos formas de especificarle al comando cd a que directorio deseamos cambiarnos, estas formas son llamadas rutas absolutas y rutas relativas. Una ruta absoluta indica el directorio a donde se desea accesar, pero se especifica desde el directorio raiz, por lo cual: /home/victorm

    es una ruta absoulta, puesto que define que desde el directorio principal se accesara a un directorio llamado home y desde ese directorio a otro directorio llamado victorm, el efecto resultante de esta ruta en un comando tal como cd, es cambiar a el directorio /home/victorm. Pero supongamos que nos encontramos en el directorio /home/victorm y tecleamos: victorm@knuth victorm $ cd home/victorm -bash: cd: home/victorm: No such file or directory

  • 62

    Nos aparece un mensaje de error, puesto que el sistema asume que deseamos entrar a el directorio /home/victorm/home/victorm y ese directorio no existe. Esta es una ruta relativa. Es relativa puesto que depende de el lugar en donde nos encontremos, al no especificarle la ruta desde la raiz estamos indicando que el directorio o directorios a los que queremos entrar se encuentran a partir del directorio actual de trabajo (en el ejemplo anterior /home/victorm). Por ejemplo: victorm@knuth victorm $ pwd /home/victorm victorm@knuth victorm $ cd juegos victorm@knuth juegos $ pwd /home/victorm/juegos

    En estas lineas estamos utilizando una ruta relativa, al encontrarnos posicionados en el directorio /home/victorm y especificarle a cd que deseamos entrar a un directorio llamado juegos, el comando cd asume que la ruta debera de ser /home/victorm/juegos. victorm@knuth victorm $ pwd /home/victorm victorm@knuth victorm $ cd /tmp victorm@knuth juegos $ cd home/victorm/juegos -bash: cd: home/victorm/juegos: No such file or directory

    Nos regresa un error debido a que estando posicionados en el directorio /tmp e indicarle la ruta relativa home/victorm/juegos, el comando cd asume que deseamos entrar a: /tmp/home/victorm/juegos

    Con lo anterior podemos definir:

    - Una ruta absoluta es aquella que empieza su recorrido de directorios desde la raiz de directorios y logicamente comienza con una diagonal (/).

    - Una ruta relativa es aquella que parte del directorio de trabajo actual hacia otro directorio y no comienza con una diagonal (/)

    Uno de los problemas mas comunes de la gente que empieza con *nix es que no sabe en donde estan situados dentro del arbol de directorios y aveces tambien se confunden cuando tratan de entrar a un directorio especifico, la mayor parte de las veces el problema es debido a que no entienden la diferencia entre una ruta absoluta y una relativa.

  • 63

    Quiz 1.- La siguiente ruta es relativa o absoluta: ~/juegos

    2.- Que sucede con el siguiente comando si me encuentro situado en: /home/victorm/juegos cd ..

    3.- Que sucede con el siguiente comando si me encuentro situado en el directorio /home/victorm/datos/datos1/datos2 cd ./.././.

    4.- Que efecto tiene el siguiente comando: cp /etc/hosts .

    5.- Que efecto tiene el siguiente comando: cp /etc/hosts ~

    6.- Teclea ls la en tu home directory, que significan los directorios . y .. que se encuentran ah y porque no se despliegan con un ls comun? (usa el manual). 7.- Que hace el siguiente comando: ls ~/./juegos

    8.- Que hace el siguiente comando: cp ./juegos ./datos