1 LABSO. M. Maggio. Agosto 2010 V2.2 Guía de COMANDOS para uso desde una TERMINAL Comentarios útiles - GNU/Linux puede acceder a particiones DOS y Windows (FAT y NTFS). - GNU/Linux tiene interfaz gráfica y modo texto (terminal-consola). La interfaz gráfica fue llamada en un inicio “XFree86” y el modo texto “BASH”. - Se pueden ejecutar muchos programas de DOS y Windows mediante emuladores en GNU/Linux. ­ No existe el concepto de unidad de disco. Todas las unidades en Linux se 'montan' como si fueran un subdirectorio más. ­ No existe el concepto de extensión del nombre de un archivo. Los ficheros­archivos pueden tener nombres de hasta 256 caracteres. Los puntos están permitidos en el nombre de un fichero. Así, un fichero se podrá llamar: DOSEMU­HOWTO.espanol.tar.gz, por poner un ejemplo. ­ Los subdirectorios no se separan con el carácter \ como en DOS, sino con el carácter / Ejemplo: /usr/src/linux­1.2.13/Makefile ­ Existe diferencia entre mayúsculas y minúsculas. Por ejemplo, no es lo mismo TP1.txt que tp1.txt : son diferentes archivos. ­ Entre un comando y sus parámetros deberemos dejar obligatoriamente un espacio en blanco. Por ejemplo cd.. no funcionará mientras que cd .. sí lo hará. ­ Un sistema Linux NUNCA se puede apagar directamente. Antes le hemos de advertir al S.O. que vamos a apagarlo (o reiniciarlo). La razón de que esto deba ser así es para que al sistema le de tiempo de escribir en disco todos los datos que tuviera pendientes de escribir, salir ordenadamente de todas las aplicaciones que tuviera arrancadas y desmontar todas las unidades que tuviera montadas. - Se puede trabajar desde línea de comandos mediante una terminal. En Linux no hay una sola terminal sino varias, con el nombre de “consolas” que se intercambian mediante ALT+F1, F2, F3, etc., o en otros casos mediante CTRL+ ALT+F1, F2, F3, etc. - El PROMPT usuario@máquina [tty0] # _ (el usuario x está en la máquina y) (Máquina es el hostname, el anfitrión). Para separar la línea de comandos del punto indicador se usa el signo # para el usuario root -administrador- y $ para el usuario común. [Nota: ver en Anexo 2 una introducción al shell y el Anexo 3 para el tema del PATH, es decir, directorios que permiten ejecutar archivos] - Para los sistemas que no muestran la ruta o lugar donde estamos ubicados hay que usar el comando PWD #pwd [print working directory, directorio de trabajo vigente] El comando nos devolverá un path, es decir una ruta. Un “path absoluto” comienza desde el símbolo de la raiz (/), por ejemplo /home/chino/notas . Un path relativo solo nos indica el nombre del directorio al que queremos hacer referencia (por ejemplo, notas ). Los símbolos . y .. tienen significado. El punto refiere al directorio actual. El doble punto refiere al directorio inmediato superior. - Qué usuario soy [nombre de usuario] #whoami 2 - Ayuda para BASH #man bash #man “comando” [da la ayuda específica del comando solicitado] #comando --help [cuando el manual de ayuda lo tiene el propio comando] - Para saber qué bash usamos, #info bash - Comandos, argumentos y opciones: Los comandos son órdenes que se le dan a la computadora para ejecutar una acción. Muchos comandos realizan la acción sin necesidad de aclarar ni completar con nada (ejemplo pwd o clear) en cambio a otros les tenemos que dar un argumento de trabajo, indicarles el camino a seguir y no sólo decirles lo que hay que hacer, sino hacia dónde (ejemplo cd directorio). Por último, las opciones nos permiten personalizar los resultados de las acciones. - Qué linux estamos usando, versión de kernel, distribución, etc #uname -a - Apagar el sistema #shutdown -h now [halt] #init 0 - Reiniciar el sistema #shutdown -r now o también #init 6 reboot - Terminar una sesión #logout -¿Quiénes están conectados al equipo? #who - Visualizar el calendario del mes actual #cal #cal 2009 [muestra el calendario de ese año] #cal 10 2009 [muestra el mes de octubre de ese año] - Visualizar fecha y hora del sistema #date - Visualizar el contenido de un directorio #ls -l [completo y con columnas] #ls -a [muestra incluso los archivos ocultos] si queremos tener una visualización por páginas |more |less - Colores usados por el comando ls AZUL directorios BLANCO archivos comunes AMARILLO dispositivos CELESTE enlaces VERDE archivos binarios o ejecutables 3 - Permisos de archivos y directorios Existen de tres tipos: Lectura (R), Escritura (W) y Ejecución en el caso de los programas (X) Los directorios tendran una d en la primer columna cuando pedimos un ls -l -Borrar la pantalla #clear o usar ctrl+l - Visualización de archivos de texto: comando CAT #cat mitexto.txt [simple, sin paginación] - Visualización con LESS permite desplazarse dentro del archivo, si es extenso #less file1.txt [permite volver hacia páginas anteriores] - Visualización con MORE #more file.txt [muestra el contenido con pausa entre pantallas] - Crear un archivo vacío con TOUCH #touch file.txt - Creación de archivos de texto: comando CAT #cat>mitexto.txt primera linea segunda tercera ultima CTRL+d [manda una señal END of File y lo graba] CTRL+c [cancela] - Editores de texto #joe #vi - Estructura de directorios Cuando se inicia una sesión bajo un sistema Linux el lugar de ubicación inicial es el propio directorio HOME. Estructura lógica del sistema de archivos: / +­­­­+­­­­­+­­­­+­­­­+­­­­­+­­­­+­­­­­+­­­­­+­­­­+­­­­+­­­­+ bin boot dev etc home lib mnt proc sbin tmp usr var | | +­­­+­­­+ +­­­+­­­+ us1 us2 usn bin lib sbin | +­­­­­+ notes labs 4 El sistema de archivos de Linux está organizado jerárquicamente desde el directorio raíz [root] representado / por el símbolo .Esta manera de estructurar la información es conocida como “estructura de tipo árbol”. Qué hay en cada directorio:* /bin - almacena programas (binarios) esenciales que necesita el sistema cuando se inicia o mientras trabaja, /boot - allí están las imágenes del kernel para el inicio y los archivos de configuración de booteo, /dev - archivos usados para acceder a los dispositivos hardware, /etc - archivos de la configuración del sistema, /home - los archivos personales de los usuarios individuales, /lib - módulos de librería utilizados por los programas, /mnt - punto de montaje de los dispositivos de almacenamiento de datos [este directorio lo utilizamos para montar disquetes, cds, discos rígidos, etc] /proc - almacena datos acerca de los procesos activos, /sbin - almacena comandos requeridos para administrar el sistema, /tmp - archivos temporales, /usr - programas, librerías, documentación, etc utilizada por los usuarios comunes, /var - datos del sistema almacenados acerca de usos y accesos frecuentes (system logs, mail and print, spool files, etc.) * Ver en el Anexo 1 una explicación más detallada. - Dentro del directorio /home cada usuario tendrá su propio directorio: /home/carlos /home/luis - MTOOLS Algunas distribuciones utilizan comandos mtools, iguales que los de DOS, pero con una M delante. Así es posible colocar letras para copiar archivos y para acceder a un disquete formateado bajo DOS. - Archivos importantes para la configuración del sistema /etc/fstab → Este archivo contiene información sobre los dispositivos que se montaran automáticamente durante el arranque del sistema. /etc/apt/sources.list → Aquí encontramos la lista de repositorios. /etc/passwd → Este archivo controla el uso de usuarios, en contraseñas, con permisos y grupos que pertenecen a cada usuario, archivo muy importante si uno quiere tener un superusuario además que el ya conocido root. /boot/grub/menu.lst → Aquí tenemos la configuración de GRUB (gestor de arranque). /etc/X11/xorg.conf → Este archivo contiene la configuración del entorno gráfico (pantalla, teclado, ratón, tarjeta gráfica ...). /etc/network/interfaces → interfaces Este archivo contiene los datos de configuración de la red. - Para iniciar en el modo gráfico hay tres comandos que pueden andar: xinit, startx, kdm - Para buscar archivos con LOCATE #locate nombre-archivo En el caso de no funcionar puede que no esté creada la base de datos de los nombres de archivos. Para crearla: #updatedb - Buscar archivos con FIND Del siguiente modo se puede buscar un archivo desde la raiz en adelante de modo recursivo: #find / -name archivo 5 - Comando CHMOD Administra el sistema de permisos sobre archivos y directorios Los permisos son R (lectura), W (escritura) y X (ejecución, -para programas-). Para ver los permisos usar ls –l. Si antes de rwx aparece la letra d quiere decir que es es un directorio. Si no hay permisos, en vez de una letra hay un guión “-”. - ¿A quién le damos ese permiso? U (usuario), G (grupo), O (otros usuarios), A (all, todos los usuarios). - Ejemplo de chmod: chmod u+x [archivo] (el usuario gana permisos de ejecución) chmod g-w [archivo] (el grupo pierde el permiso de escritura) - Para cambiar hacia superusuario directamente, #su pide la contraseña de inmediato Para volver al usuario normal, #exit - SUDO: En Ubuntu no es necesario pasar a superusuario, se puede usar el comando sudo cada vez del siguiente modo $sudo comando correspondiente - Creación de usuarios #adduser nombre - Cambio de contraseña #passwd nombre Manipulación de directorios #cd nombre [entra a nombre] #cd .. [atrás] #cd [va a tu directorio personal] #mkdir nombre [crea un directorio] #rmdir nombre [elimina un directorio] Manipulación de archivos #rm file.ext [elimina archivos] RM #cp file.ext /dirdestino [copia archivos] CP #mv file.ext /destino [mueve un archivo] MV #mv file.ext file.ext [cambia el nombre de un archivo] Manipulación de discos - Espacio libre en cada unidad #df [disk free space] Da el espacio libre de los dispositivos montados. - Dispositivos en Linux: HD, Floppy, CD Se deben montar para tener acceso a ellos. Comando mount. Es uno de los elementos más básicos para la navegación desde línea de comandos. Se pueden crear directorios dentro de /mnt para allí montar los dispositivos. 6 FD0 la disquetera. HDA (primer disco) HDA1, 2, 3, y siguientes son las particiones. HDB (segundo disco) HDB1 (primer partición del segundo disco) Los discos serial ata aparecerán como SDA. Los discos flash (pendrive, etc.) aparecerán también como SD (A, B, C, y siguientes). - Montar un disco A diferencia de los sistemas Micro$oft, aquí los dispositivos deben ser montados y desmontados por el usuario en la mayoría de los casos. Cuando se hacen tareas de administración sobre un disco montado los cambios son efectuados al desmontarlo. # mount -t msdos /dev/fd0 /mnt/fd0 [para montar un diskette. En algunos casos habrá que crear el directorio dentro de /mnt. Sino podemos montarlo dentro de /mnt directo, aunque es más desprolijo]. [En lugar de msdos se puede utilizar vfat]. #mount -t iso9660 /dev/hdb /mnt/hdb /dev/cdrom /mnt/cdrom - Desmontar #umount /mnt/fd0 - Formatear discos #mke2fs -c /dev/fd0 /dev/hda1 #fdformat [formatea disketes en bajo nivel. Ver #man fdformat] - Particionar Discos Rígidos #cfdisk - Para comprobar la integridad de una partición #fsck PARTICION Otros comandos: - #top [muestra el uso del cpu y los procesos que se ejecutan] - #free [muestra el uso de la memoria] - #ps [muestra los procesos que corren en el sistema. Si utilizamos el modificador -aux nos dará un completo listado]. - #kill PID (número de identificación del proceso, aparece en la primer columna del comando ps. Sirve para matar un proceso que no responde). - Midnight Commander #mc sirve para navegar el sistema de modo semi gráfico. 7 - Comando tar, genera un archivo a partir de varios. #tar -cf archivo.tar arch1 arch2 arch3 ... [cf, crear archivo, y agrega todos los archivos que le indiquemos al .tar determinado] #tar -xvf archivo.tar [extraer el contenido de un archivo, x extrae, v muestra el contenido detallado, f archivo] #tar -tvf archivo.tar [muestra el contenido del archivo tar, la t es de list] - GZIP: comprimir y descomprimir archivos .gz Es necesario siempre comprimir los archivos tar pues quedan con altos valores en bytes. Al final el archivo tiene el formato .tar.gz, aunque podemos aplicar el gzip directamente en un archivo común. #gzip -d archivo [-d decompress] #gzip -1 archivo [-1 fast hasta -9 better compress] 8 ANEXO 1 Por Fernando Pissani UN SOLO ÁRBOL ( / ) Cuando ustedes trabajan en DOS-Windows tienen muchas raíces: la raíz del A:, la del C: la del CD-ROM y las de otras particiones del hd, etc. La raíz del DOS se representa con el \ y como dijimos, hay muchas, una para cada dispositivo o partición. En Linux/Unix hay sólo una / Nota: recuerden que la raíz y la barra de separación de directorios, al revés del DOS, en Unix/Linux se representa con la barra común / Todos los dispositivos, sistemas, particiones, redes, etc., etc. se cuelgan de esa única raíz, que obviamente no tiene letras ni nada y se representa con un / En el capítulo anterior, cuando comenzamos a usar ls, veíamos cómo se veía la estructura tradicional de la raíz de Linux (la / atrás de un nombre indica que es un directorio) bin/ boot/ cdrom/ dev/ etc/ floppy/ home/ lib/ media/ mnt/ proc/ root/ sbin/ tmp/ usr/ var/ vmlinuz En el de ustedes no estará el /cdrom y el /floppy en el raíz, pues se encuentran dentro del /mnt. Así lo usaba antes Debian, lo pongo a título de ejemplo para que vean que puede ponerse en cualquier lado, aunque hay que tender a respetar los acuerdos que se hagan que verán que hoy tienden a guardar esos directorios en /media Dentro de cada uno de estos directorios se guardan ciertos tipos de archivos, hay convenciones, aunque no siempre ocurre así, de acuerdo a las distribuciones u otras versiones de Unix. Pero la tendencia es a ir respetando cada vez más cierto tipo de ordenamiento, que es el que vamos a trabajar en este curso. LOS DIRECTORIOS DEL RAIZ Ahora veremos un pantallazo sobre lo que contiene cada uno, aunque lo veremos más adelante en detalle en una futura clase /bin En el directorio bin se guardan los binarios (se llama binarios a los ejecutables) de uso elemental y básico por todos los usuarios. Por ej los programas ls y man estarán allí. Recordemos que los ejecutables no se identifican por el .exe, el .com o el .bat del DOS, sino por si tienen la x en el atributo, cualquiera que sea el nombre. Pero veremos que no están allí todos los ejecutables, sino los elementales del sistema operativo. /sbin En el directorio sbin también se guardan los binarios, pero los binarios que son de uso del administrador del sistema, del superusuario. De esta manera pueden bloquearse fácilmente ciertos ejecutables para que no los usen los usuarios comunes. Si sumamos los archivos que están en /bin y en /sbin tendríamos los archivos imprescindibles para el funcionamiento y mantenimiento del sistema operativo (diríamos los que tradicionalmente se guardaban en el subdirectorio \dos u hoy en el \windows\command) /etc En el directorio etc estarán casi todas las configuraciones del sistema: desde los archivos que guardan las claves y contraseñas, hasta los nombres y números IP de las distintas computadoras de la red, aparte de la propia. Allí estará desde el mensajes de bienvenida del login, hasta la lista de los sistemas operativos que pueden cargarse en el momento del booteo, los sistemas de archivos que se montan al momento de prenderse la computadora, la 9 configuración de la llamada al ISP, o de los que llamarán al servidor nuestro (si ponemos ese servicio) y cientos de cosas más. Es el subdirectorio sobre el que más trabajamos a la hora de configurar Linux /dev En dev estarán todos los dispositivos del sistema presentes y futuros. Los discos rígidos y posibles particiones, diskettes, cd, SCSI, modem, mouse, impresoras, etc, etc ¿Se acuerdan que en la parte anterior de la clase dijimos que todo se ve como archivos, que todos son archivos, desde una impresora a un modem?. Están allí, con nombres convencionales que aprenderán a reconocer. /lib Este directorio tiene las librerías, generalmente en "C" (un lenguaje de programación y el fundamental en el mundo Linux/Unix ya que permite portabilidad) que usará el núcleo u otros programas para ejecutarse, o para compartir con otros programas. Por supuesto que habrá muchos subdirectorios porque cada programa generalmente instalará sus librerías en su propio subdirectorio. En general aquí están las librerías del sistema, encontraremos otro subdirectorio de librerías en el subdirectorio /usr/lib Tengamos presente que en Unix/Linux está todo ordenado, no se ensucian los subdirectorios con instalaciones de programas de los que quedan restos cuando lo borramos ni se superponen versiones (al menos no debería ocurrir). /usr En este directorio estarán los programas que instalemos. Veremos que también habrá dentro de él unos subdirectorios que se llaman bin y sbin (/usr/bin /usr/sbin) donde guardaremos los ejecutables de los programas de los usuarios, y los ejecutables del sistema que hemos instalado nosotros. Generalmente aquí hay un subdirectorio importante /usr/src que es el que tendrá las fuentes de Linux, donde podremos compilar el núcleo, cambiar cosas, etc si sabemos C o perl. También uno que llamamos local (/usr/local) donde pondremos cosas nuestras. Y adentro de él también veremos que hay un bin y un sbin Y también hay uno que se llama /usr/share donde van la mayoría de los programas (graficadores, oficina, juegos, etc) que instalamos, así como los documentos, imágenes, etc. Todo esto lo iremos viendo en detalle más adelante. /home Los subdirectorios de los usuarios están dentro de home. Cuando en la computadora de la cabaña creamos un nuevo usuario llamado sherlock, automáticamente se creó un subdirectorio llamado sherlock dentro de home. Por ej, hoy en mi Linux, aparte de muchos otros subdirectorios de usuarios, están dentro de /home alero/ fjpisani/ gcaplan/ sherlock/ Y adentro de cada propio subdirectorio uno hace lo que desea. Verán que el superusuario, el root, no está con su propio subdirectorio allí. Como es un privilegiado no le gusta codearse con la plebe así que tiene su propia casa en /root (en realidad es entre otras una medida de seguridad) /root root es entonces el home del superusuario (mi subdirectorio como fjpisani es /home/fjpisani) Si como superusuario tecleo cd sin ningún parámetro automáticamente va a su home, es decir, adentro de /root o sea es como decir cd /root En cambio si estoy como sherlock y escribo cd voy directamente adentro de /home/sherlock /proc Hay un subdirectorio misterioso. Allí está lleno de nombres de archivos raros. Cuando la primera vez quise copiar ese subdirectorio al disco de respaldo que estaba haciendo se me cruzaron los cables, porque no entendía lo que estaba pasando. O no me daba bolilla o cuando ponía y arrancaba desde el respaldo no estaba lo que había copiado y aparecían otras cosas. Finalmente, como no entendía lo que pasaba y no me daba bolilla, lo ignoré, y no hice más respaldos de ese subdirectorio, y aparentemente todo estaba perfecto sin él. Por lo tanto, si él me ignoró a mi, yo lo ignoré a él y quedamos en paz. Luego, leyendo y posteriomente probando, aprendí que lo que allí ocurre no existe en el disco rígido, es decir no es un subdirectorio grabado en el disco rígido, son cosas que están ocurriendo en la memoria, los procesos que se desencadenan al ejecutar un programa y otras informaciones. Cuando llamo a un programa, se activan procesos, 10 que se identifican con un número. Lo veremos luego en detalle Bueno, allí, en esos archivos que están en /proc puedo saber lo que está pasando en el sistema. Pero son archivos del tipo que conocíamos cuando no teníamos hd y hacíamos un c: virtual para engañar a los programas que lo necesitaban, usando el "fabuloso" pedazo que quedaba entre los 640 y el mega. Si nadie pasó por esa experiencia, ignoren el comentario. Lo concreto es que lo que está allí es virtual, está en la memoria y desaparece cuando se apaga la computadora y permanentemente se va modificando según lo que hagamos, archivos aparecen, otros desaparecen, etc. Podemos pasarnos sin él, como él se pasa sin nosotros, aunque en algún momento podemos aprovechar algo de él, lo veremos. Concretamente allí estará la información vital de nuestro hard, las interrupciones que se usan, datos de todo tipo, reales y en tiempo real. /boot [editado por razones de uso] Acá están los archivos necesarios para el arranque del sistema, núcleo y cargador de arranque, es decir, el famoso GRUB. /mnt Y hablando de tradicionales, encontraremos un directorio que se llama mnt, que sería mount sin las vocales. Allí supuestamente deberíamos montar algún dispositivo cuando queremos acceder a él. En el ejemplo que vimos antes, supongamos que tenemos un disquete que grabamos en w98 y queremos guardar esos archivos en el hd con Linux. Damos la orden mount -t vfat /dev/fd0 /mnt y luego podemos dar la orden de cp /mnt/* /home/sherlock y todos los archivos en el disquete se grabarán en el subdirectorio /home/sherlock. Y si por ejemplo mi disco rígido tengo en la primer partición DOS o Windows y en las demás mi sistema Linux. Estoy en Linux y quiero leer todo el disco C:, es fácil mount -t vfat /dev/hda1 /mnt luego hago un cd /mnt y un ls ¿y qué veré?: todo el disco C: con sus subdirectorios, etc. Esto lo veremos luego, ahora lo estamos comentando. Las distribuciones Red Hat, Mandriva, Fedora, Suse, Asware y otras, crea dentro de /mnt dos subdirectorios: floppy y CD-ROM (es decir /mnt/floppy y /mnt/cdrom) sugiriéndonos que cuando tengamos que montar algo o crear nuevos puntos de montaje, especialmente los "removibles", los pongamos allí. Además, vienen con una orden en el archivo /etc/fstab de manera que por ejemplo para montar el disquete o el CD-ROM no tenemos que poner todos los parámetros que dijimos, sino simplemente: mount /mnt/floppy o mount /mnt/cdrom y ya está. Y para desmontar lo mismo sólo que con umount y el nombre del subdirectorio. Lo importante de todo esto es que en Unix/Linux hay una sola raíz, y de ella se cuelga todo lo demás. Y que existen ciertas convenciones, para que cuando guardemos algo lo hagamos con método, lo que facilita el borrado, la desintalación, la búsqueda. /media Ahora la tendencia es poner los dispositivos como los señalados anteriormente en /mnt en un subdirectorio que se llame /media. Ubuntu y varios basados en Debian lo hacen así. /opt Aquí se suelen guardar o instalar algunas aplicaciones, como por ejemplo el StarOffice, a veces el Openoffice, etc /tmp Bueno, está también el directorio /tmp que obviamente sirve para los archivos temporales, generalmente estará vacío y comenzarán a aparecer archivos allí a media que ejecutemos programas y se vaciará cuando cerremos Linux (por lo que nunca guardemos nada importante allí). Puede ocurrir que sigan quedando cosas luego de apagar la computadora. Varios días después miramos allí y vemos que hay archivos con fechas viejas. Es decir, no fueron borrados. ¿Por qué? porque algunas distribuciones planifican sus tareas de limpieza en ciertos horarios, por 11 ejemplo a media noche. Por lo que para que ese tarea diferida (cron) se realice deberíamos dejar la computadora prendida todo el día, o cambiarle la hora o borrar a mano. Generalmente no hay problema de borrar archivos que están en /tmp con fecha vieja. /var En el directorio var va todo lo que no metimos en los otros :-) Y en cierta manera es cierto. No obstante es un directorio muy importante con subdirectorios que usaremos mucho. Dentro de var hay uno que se llama spool que tiene archivos muy útiles Por ej en /var/spool/mail estarán todas las cartas que los usuarios reciben desde otras redes o sistemas antes de levantarla desde sus computadoras vía telefónica o por red (o antes de mandarlas a su propio subdirectorios /home/nombre-usuario, si se usa el servidor como depósito propio). Por allí cerca estarán también todas las cartas que se están enviando, o las que no han encontrado salida y esperan el momento para el reintento, que están en cola de espera. También estarán los trabajos de impresión que están esperando en cola. Otro importante es log (/var/log), especialmente cuando estamos configurando las cosas o para la administración del sistema o para cuando alguna cosa no está saliendo bien. Es muy importante: allí se guardan todos los mensajes periódicos del sistema: desde el error de un programa hasta quién fue el último en entrar al sistema o cuántas veces entró este mes, a qué hora, etc, por poner ejemplos. Ya volveremos más adelante sobre él. Si escribo last gcaplan, ella vive en BsAs, el servidor de InterCol está en Rosario, veré cuándo anduvo por la computadora por última vez. Y ella hará lo mismo, tecleará last -10 fjpisani y verá lo mismo ¿por qué puso -10, porque sólo quiere ver las últimas 10 veces, ya que está gastando comunicación telefónica con su proveedor de Internet y no le interesa todo, sino si anduve por allí y cuándo. Dentro de /var también hay otros subdirectorios importantísimos. Allí suele instalarse el named (var/named) que es donde se configura el servicio de nombres de dominios para que los mensajes se enruten correctamente, uno de los temas espinosos que veremos más adelante. (Espinoso no por lo difícil, sin por lo difícil configurarlo para que ande bien :-) (pero por suerte ahora es cada vez más sencillo configurar esto) También en /var algunas distribuciones (Debian por ej) guarda el directorio donde está la página web que sirve el servidor apache (/var/www) y lo que pongamos allí aparecerá como página web del sitio /lost-fount directorio donde se guardan restos de sectores perdidos, encontrados y que no se sabe qué hacer con ellos, cuando aplicamos alguna de las herramientas tipo scandisk (cada vez que se prende y carga Linux se revisan los sistemas de archivos buscando inconsistencias y uno de los programas semejante al scandisk se llama en Linux fsck) . ANEXO 2 Por Fernando Pissani Introducción al concepto de shell Como sabemos, la computadora no hace nada sin un sistema operativo. ¿Y qué es un sistema operativo?. Difícil pregunta porque admite muchas respuestas, incluso triviales. Podríamos decir que es el programa (o los programas) que permite que se puedan usar los recursos de la computadora. ¿Quién?: otros programas. Cuando guarde este capítulo, el programa que estoy usando no sabe cómo guardar los datos en el disco rígido y sería un arbur que cada programa se encargara por sí mismo de acceder a los dispositivos. De allí que cuando le 12 doy la orden al procesador de texto de guardar, éste le pide al sistema operativo que lo guarde. El sistema operativo, al mismo tiempo de tener que guardar esos datos, se debe encargar de proteger los datos existentes, por ejemplo no escribir donde están los datos de otro archivo. Por lo tanto tenemos dos funciones bastante definidas en un sistema operativo: dar servicio y proteger (si el sistema operativo es multiusuario deberá proteger los datos de cada usuario y actividades, por ej). Así podemos distingir los distintos sistemas operativos por la cantidad de servicios y el nivel de protección que tienen, aparte de la rapidez, eficiencia y eficacia que lo prestan. Y aquí aparecen dos ideas de lo que puede ser un sistema operativo. Por un lado una idea estricta, el (o los) programa(s) que se encarga(n) de dar en última instancia esos servicios y esa seguridad. Pero también está la idea amplia de sistema operativo, que incluye: el programa que permite que el usuario interactúe con el sistema operativo más un conjunto de programas que ayudan al normal funcionamiento del sistema operativo. Evidentemente si nos referimos al concepto estricto del sistema operativo, en Linux está perfectamente identificado en un archivo, llamado kernel o núcleo. Es propiamente el "verdadero" Linux. Si tomamos al sistema operativo en su concepto amplio (que es generalmente como se entiende) encontraremos que está compuesto por tres niveles perfectamente diferenciados: * el núcleo o kernel * el interprete de comandos o shell * los programas vinculados con la gestión/consulta de lo que maneja el núcleo o que permiten la interacción con él y los dispositivos que maneja en núcleo. No es una descripción muy brillante pero nos permite identificar sus componentes. Si comparamos con el DOS en kernel sería el io.sys y el msdos.sys (en el caso del DOS de Microsoft), el shell sería el command.com y los programas vinculados serían el format, el fdisk, el backup, el keyb, etc (entre 150 y 200 programas) En Linux el kernel puede tener el nombre que prefiramos (ya veremos que se lo podemos decir al LILO -Linux Loader, cargador de Linux- en su archivo lilo.conf que está en /etc), aunque generalmente se llama vmlinuz ; y puede estar donde querramos, aunque suele ponerse en el raiz o dentro del directorio /boot Los programas que forman parte del sistema operativo son muchos y generalmente están en /bin y en /sbin, ya vimos varios hasta aquí y veremos más. Claro que es difícil distinguir si tal programa forma parte del sistema operativo o no, pero es una distinción que carece de importancia. Lo que importa saber es si tal programa lo encontraremos normalmente en cualquier distribución o no (aunque también esto es ambiguo, porque el mc prácticamente lo vamos a encontrar en cualquier distribución pero no tiene para el sistema operativo el mismo papel que el fdisk.) ¿Y qué nos queda?: el shell o intérprete de comandos. Cuando nosotros pedimos un ls o ejecutamos el fdisk, en realidad lo hacemos gracias al shell. Sin shell no podríamos interactuar gran cosa con la computadora, si es que podríamos hacerlo. En el shell del DOS (incluyendo el DOS de Winodows 9x, existen varios comandos que están integrados a él, es decir, que no existen como programas .exe o .com, sino que son comandos internos al shell, caso dir, cd, md, rd, type, cls, time, date y algunos más. Generalmente el DOS viene con su interprete de comandos y no es común cambiarlo, aunque se puede. En el caso de Windows 95/98 /2000 el problema se complica más si quisiéramos producir alteraciones en el intérprete de comandos o cambiarlo por otro. ¿Y qué pasa con Unix/Linux? En Unix el papel del shell es mucho más grande porque es mucho más potente. Si bajo DOS queremos programar algo con el interprete de comandos, sólo tenemos a los comandos de los proceso de lotes, los conocidos archivos .bat con las sentencias cls, echo, goto, if, rem, pause, call, for y algunas pocas más. Los shell de Unix son otra cosa. ¿Y por qué "los shell"?. Porque en Unix disponemos de gran variedad de shell, siendo muy fácil cambiar de uno a otro (hay una orden chsh nombre, chsh= change shell y el nombre es el nombre del shell que queremos cargar) (el cambio se hace sólo para el usuario que da la orden de cambio). ¿Y qué es lo que hace el shell? 13 Cuando por ejemplo tenemos el cursor titilando pidiendo que le demos una orden, es el shell (o la shell, como la llaman algunos) el que nos está preguntando y esperando, el que manejará el teclado a medida que vamos ingresando las letras y números (o retrocediendo) y el que reconocerá el listo (enter) y dará la orden de inicio de ejecución (si reonoce el comando como válido). Naturalmente esto variará de acuerdo al sistema operativo que estemos hablando y es muy difícil a veces hacer una distinción a partir de qué parte se encarga el núcleo, pues el shel en realidad es como la cara visible del sistema operativo. Éste se comunicará con nosotros generalmente a través del shell y gracias el shell nos comunicaremos nosotros con el kernel y gracias a éste con los dispositivos físicos. A diferencia de otros sistemas operativos, en Unix/Linux es bien marcada la división de estas capas, lo que permite mucha mayor flexibilidad, ya que si estuvieran entremezcladas sería muy difícil de cambiar por otra utilidad de otro fabricante, o modificarla. En Unix los shell más conocidos son el Bourne Shell, que fue el primero más usado de los shell, seguidos luego por el KornShell , que es el usados en System V (una de las dos variantes principales de Unix) y el C Shell. En Linux el más usado (y el que pone por defecto la instalación) es el bash De nuevo aquí tenemos presente el espíritu de Unix: bash significa Bourne Again Shell. "¡de nuevo el shell Bourne!". Claro, el shell Bourne había sido abandonado por el Korn, que se basaba en él, pero era más potente; o por el C Shell , preferido por muchos programadores por la elasticidad de su programación y su similitud en el díalogo con el lenguaje C. (la mayor diferencia entre el C Shell (de Berkeley) y el Korn está no tanto en las prestaciones, sino en manera que se le dan las órdenes, en la sintaxis. En el C se parece al lenguaje C y en el Korn se parece a Bourne. El Bourne fue creado por Steve Bourne en los laboratorios Bell de la AT&T. El C shell por Bill Joy, el mismo autor del vi . En Linux vienen varios shell. El bourne es el /bin/sh, el C Shell es el /dev/csh, el bash es el /dev/bash, el T Shell /dev/tcsh que es algo más completo que el C Shell y es casi un lenguaje de programación. Si quiere cambiar de shell sin cambiarlo por defecto, puede ejecutarlo poniendo su nombre. En el caso del csh verá pronto una diferencia porque el tradicional símbolo $ que tiene como usuario se reemplazará por el símbolo % (aunque esto puede cambiarse a gusto). Si desea saber qué shell está ahora usando mire adentro de una variable de entorno que se llama $SHELL, puede verla tecleando echo $SHELL y allí le mostrará el shell que tiene cargado. Cada usuario puede tener su propio shell (o el root) y ello se consigue cambiando el nombre del shell en el archivo de contraseñas o con el comando chsh, lo vamos a ver después. Existe un archivo en /etc que se llama shells que contiene los shell permitidos por el sistema (esto es porque puede haber otros shell pero no estar permitidos). Para ver la lista sin mirar ese archivo, puede teclear chsh -l ANEXO 3 Por Fernando Pissani PATH Una de la variable más importante es el path. Como saben, el path indica la ruta de búsqueda cuando queremos ejecutar algún programa. Generalmente cuando Linux se instala pone a los usuarios con una variable path que contiene los subdirectorios de los programas ejecutables a los que puede acceder el usuario. Supongamos que tenemos este path: /usr/bin: /usr/sbin: /bin y tomemos el ejemplo del programita que hice recién, el majo, que lo creé en mi subdirectorio personal. Si pretendo ejecutar majo, el shell me dirá comando no reconocido. Miraré en qué subdirectorio estoy metido, haré un ls para ver si majo está en donde yo estoy metido y veo que efectivamente estoy justo en ese subdirectorio, por lo que reviso si lo escribí bien, tipeo de nuevo y obtengo en mismo efecto: no lo encuentra. En el DOS, la manera de garantizar de ejectuar un programa era meterse en su subdirectorio y desde allí ejecutarlo. Si no lo encontraba allí, recién entonces el command.com se ponía a buscarlo por los diversos subdirectorios escritos en el path. Y si no lo encontraba allí, daba el tradicional mensaje de comando no hallado. 14 Con Linux no funciona así. Si no está en el path, no lo encuentra . La única manera de ejecutar algo que no esté en el path es dándole la ruta completa. Para quienes han "nacido" con MSWindows este problema generalmente no se presenta, porque sólo aprietan íconos, y bajo el ícono en realidad está la ruta completa. Volviendo a Unix/Linux, tenemos un comodín para poder escribir la ruta completa sin escribirla, me refiero a la ruta completa donde estamos parado, que es el punto (un sólo .), cuestión esta que también existía en el DOS ya que fue copiado de Unix. Por lo tanto, en el caso que venimos hablando del programita majo, para no tener que escribir todo y suponiendo que estamos donde hemos creado nuestro programa, escribiremos ./majo, donde el . significa el subdirectorio actual. Por eso puede ser conveniente poner al final del path que ya viene el punto . como un directorio más de búsqueda, para que se ejecute cualquier programa que llamemos dentro del subdirectorios que estamos "parado". Y digo puede ser conveniente, pero puede que no . Dependerá de otras consideraciones. Vayamos a ellas. El path tiene mucha importancia por cuestiones de seguridad. Saben que en Linux prácticamente no existen virus, casi no pueden existir porque los programas no pueden acceder directamente a la cpu, a las interrupciones y a la memoria, deben pasar primero por el núcleo, y obvio, no se puede acceder al núcleo así como así (sólo andaría un virus que dañase al sistema si estuviéramos como root, por eso es aconsejable no trabajar como root a menos que sea imprescindible). No hay casi virus, pero sí varios troyanos, es decir, programas que se supone hacen una cosa pero hacen otras. Pongamos el caso que creo un programa que borre todo, lo llamo ls y ya se imaginan qué puede pasar si se ejecuta ese troyano llamado ls ¿Pero cómo hacer que el usuario inadvertido, al ejecutar ls no ejecute el verdadero ls sino el troyano? En el path hay un orden de ejecución. Si miran la variable path estando de usuario común, verán que es distinta a la variable path estando de root (pueden mirarla con echo $PATH ) Si como root tengo el orden de ejecución /bin: /sbin, /usr/bin, etc es evidente que la orden ls que ejecutaré será la que está en /bin, y allí un intruso sin privilegio de superusuario no puede cambiar ese programa. Pero supongamos por un momento que tenemos un intruso que consiguió la clave de un usuario común, pepe, por lo que puede escribir en el subdirectorio de pepe y bajar allí su troyano. ¿Qué pasaría si dicho intruso pudiera modificar la variable de ambiente path del root (o de pepe) y pusiera /home/pepe: /bin: /sbin etc? Obvio que cuando el root escribiera ls se leería primero el troyano, produciendo el daño que se imagina. Conclusión, la variable path es muy importante para la seguridad. (O si lo ejecutara pepe, aunque no podría borrar todos los datos de la computadora, al menos borraría sus propias cosas, lo que igual es no deseable) Esto nos lleva también a otras consideraciones. Tenemos que trabajar con un cierto orden. Si yo hubiera hecho ese programita majo y lo hubiera dejado en /home/fjpisani, realmente sería un "sucio", pues estoy haciendo las cosas sin criterio, y el Unix/Linux las cosas hay que hacerlas bien, con criterio. Al respecto lo más apropiado es guardar los programas que hacemos en un subdirectorio: /usr/local/bin o /usr/local/sbin (o en todo caso, como veremos luego, en /home/fjpisani/bin) En algunas distribuciones aquel subdirectorio se crea sólo, si no ocurre así, es conveniente crearlo y luego agregar en el path ese subdirectorio, al principio si queremos que tengan preponderancia nuestros programas, o al final. Otra posibilidad, si en el sistema concurren muchas personas y no queremos arriesgarnos a que pueda pasar algo extraño con las cosas que se ponen en /usr/local/, es hacer que cada uno dentro de su propio subdirectorio cree un subdirectorio que se llame bin (/home/fjpisani/bin), claro que aquí se nos puede complicar un poco la cosa ¿cómo hacemos para que cuando se dé de alta un usuario en el path se agrege ese directorio, que depende de su nombre? Decimos esto porque cuando queremos que se automaticen las cosas, como lo hace Linux y que no tengamos que escribir el path de cada uno, directamente damos la orden general en el archivo profile que está en /etc y allí ponemos por ej: path /usr/local/bin, /usr/bin ... ¿pero cómo ponemos el subdirectorio bin que se ha creado o se puede crear en el subdirectorio de cada usuario? Aquí viene en nuestra ayuda otra variable de ambiente $HOME 15 La variable $HOME tiene nuestro directorio home Si ingresamos como sherlock y tecleamos echo $HOME nos devolverá /home/sherlock Si ingresamos como root y tecleamos echo $HOME nos devolverá /root Por lo tanto podemos agregar al path el subdirectorio de cada uno sin problemas escribiendo /$HOME/bin (recuerden que se separan con dos puntos, no con punto y coma como en el DOS) Si transitoriamente queremos probar esto y agregar algún sudirectorio al path desde el prompt tenemos dos alternativas: teclear todo el path anterior y agregarle le nuevo o directramente escribir: PATH=$PATH: $HOME/bin Con esto lo que estamos haciendo es redefinir la variable PATH y guardar en ella el path viejo ($PATH) más el que le agregamos ahora, si estamos como sherlock se le agregaría /home/sherlock/bin Con esto terminamos de ver otra cosa: para darle un valor a una variable de entorno hay que escribirla, poner el signo igual y agregarle el valor. Otra variable útil de saber, especialmente cuando nos estamos conectando por teléfono y queremo hacer un telnet para trabajar en modo terminal, es la variable TERM, que define que tipo de terminal estamos trabajando. Si tenemos problemas con el movimiento de los renglones, o vemos muy mal la salida, es probable que tengamos mal definida la terminal. Tiene que coincidir la emulación de terminal que tiene definida el programa que estamos usando y la que tiene definida Linux. Muchas veces resuelvo el problema tecleando TERM=vt100 vt100 es una muy vieja terminal, que hace mucho que no existe más, pero que se sigue usando como referencia para definir el comportamiento de una terminal. También podemos probar con TERM=linux ¿Y qué otras variables de ambiente hay? Teclemos env y veremos la lista de variables. Por supuesto que nada de esto es necesario saber para usar Linux. Pero al menos tener una idea de ello saca "lo mágico" del funcionamiento y nos permite tener una visión del funcionamiento general y permitir encarar problemas más complejos. Estas variables son muy útiles para los programas, que con frecuencia recurren a ellas. Por ej cuando ejecutamos un procesador de texto en DOS/Windows, este guarda sus archivos en un subdirectorio predefinido en algún lado (opciones, preferencias, etc) Supongamos que como política de administración hacemos que cada uno guarde sus cosas en sus subdirectorios, por ej dentro de un subdirectorio que se llame documentos Si le decimos que guarde las cosas en $HOME/documentos, el programa las guardará según quién lo esté usando en cada subdirectorio propio, ya que reemplazará la variable por el nombre real. Otra de las variables de ambientes importante es la que define el shell por defecto que puede usar ese usuario. Esta variable toma los datos del archivo /etc/passwd, que muestra en uno de sus campos cuál es el shell que le corresponde a cada usuario.