next up previous contents
Next: Manejo de Linux en Up: Manejo Previous: Manejo   Contents

Subsections

Manejo de Linux en ambiente textual

login

En un sistema multiusuario (como Linux) tienen que diferenciarse los espacios (ambientes de trabajo) de los diferentes usuarios. Esto es una función del login que se encuentra como portal cada vez que se accede a la computadora. El segundo objetivo del login es la autentificación del usuario, o sea, detectar a través de una clave (secreta)=Password que la persona que utiliza el espacio de usuario indicado es este mismo. Es una medida básica de protección de los datos individuales de cada usuario.

Posibles formas de presentación son:

login: nombre 
Password: 
o también

Username: nombre 
Password: 
El nombre del usuario es visible, pero la clave no se repite en la pantalla. Si, y solamente si, el par nombre/clave coincide con un par de valores grabados en el sistema se provee acceso. En cualquier otro caso se denega el acceso. Es otra medida de seguridad que no se indica si fallo el nombre o la clave.

El nombre designa una cuenta (account) que es el espacio o ambiente de trabajo del usuario.

shell

El sistema prove directamente después de la autentificación una facilidad para interactuar, es decir efectuar comandos y visualizar las respuestas correspondientes del sistema. Esta facilidad se llama procesador de linea de commandos - command line processor -, o ``shell'' en la nomenclatura de unix. ``shell'' signigica la cáscara de la concha y es un sinónimo para la capa visible del sistema operativo.

El shell lee una línea de texto que el usuario teclea. Al pulsar la tecla [Enter] interpreta el texto (por lo que también se le llama 'interpretador de línea de commandos=command line interpreter) y ejecuta los comandos encontrados. Si se cometió un error lo indica así. Al terminar los comandos el shell muestra una cadena de identificación llamado ``prompt'' y procede a leer la siguiente línea.

Existen diferentes shell, los tradicionales se llaman 'sh' y 'csh', otros son:bash, ash, zsh, ksh, csh, tcsh,... nosotros trabajamos unicamente con bash, que es compatible con sh y el shell official del software GNU.

línea de commandos

En una línea de commando se escriben todos los elementos de un comando, separados por espacio en blanco ([Espacio]). Pueden concatenarse varios commandos, separados por el símbolo ';' (semicolon) en una sola línea.

Un commando tiene tres partes: nombre, opciones y parámetros. Solamente el nombre es obligatorio. Ejemplo:

ls     -l -all   *.c

nombre [opciones] [parámetros]

nombre
nombre del comando. Puede ser el nombre de cualquier archivo de programa. Ejemplo: 'ls'
opciones
indicacan al comando, que tiene que modificar su comportamiento de una cierta forma. La forma tradicional de introducir una opción es una sola letra, introducida con el símbolo '-' (guión). Ejemplo: -l

El proyecto GNU ha introducido opciones explicativas (long options) que consisten de una palabra entera y estan introducidas por dos guiones consecutivos: '-'. Ejemplo: -all

Opciones por su parte también pueden tener parámetros.

Ejemplos: -s15, -with_gettext=yes

parámetros
indican los objetos sobre cuales el comando debe actuar. Normalmente nombres de archivos o de directorios. Ejemplo: '*.c'
Tradicionalmente tienen que escribirse los parámetros antes de los parámetros. En los programas GNU muchas veces eso no está exigido, pero es buena práctica hacerlo de todas formas.

Wildcards o comodínes

son símbolos que pueden aparecer en los nombres de archivos, a veces también en los de los directorios. El comodín es sustituido por el shell con todos los nombres de archivos que cumplen con su forma.

*
sustituye una cadena arbitraria de caracteres.
?
sustituye cualquier caracter individual.
En el ejemplo de arriba se sustituye '*.c' con todos los archivos del directorio actual que terminan en los caracteres punto - '.' y 'c'.

comandos básicos

Manipulación de directorios


\begin{labeling}{rmdir nombre -}
\item [ls]listado de archivo en un directori...
...
\item [df](disk free) calcular el espacio libre en un disco duro
\end{labeling}

Manipulación de archivos


\begin{labeling}{00.00.0000}
\item [rm]remover uno o varios archivos
\item [cp]c...
...or y visualizador primitivo
\item [grep]buscar textos en archivos
\end{labeling}

Obtener ayuda


\begin{labeling}{00.00.0000}
\item [\emph{comando} \texttt{-{}-help}]muestra una...
...n hiperenlaces,
ejemplos y mucho más para todos los programas GNU
\end{labeling}

Manipulación de archivos

El objeto principal en el uso de los sistemas operativos son los archivos. Los comandos mas usados para manipularlos se discuten aqui en brevedad.

cp

'cp' puede copiar una lista de archivos, explícitamente nombrada, como directorio, o con wildcards hacia otro directorio. Si el directorio no existe se crea. No se pueden especificar jerarquías de directorios como destino, el comando

$ cp documentos/carta.txt archivo/2003/Marzo/
falla si archivo, archivo/2003 y archivo/2003/Marzo no existen. Por otro lado el comando

$ cp documentos/carta.txt archivo/2003/Marzo
es exitoso si solo el directorio archivo/2003 existe, creando una copia de carta.txt con el nombre Marzo. Se puede copiar un archivo a otro, que tiene un nombre diferente. Si el destino existe se sobreescribe (!).

ln

'ln' crea enlaces (links). Esto no son archivos, sino referencias hacia archivos, que se pueden imaginar como entradas duplificadas en un directorio. Existen enlaces simbólicos (soft link) y directos (hard link). Los primeros son como hiperenlaces en la web: un cadena de caracteres que refleja la ubicación original de un archivo o directorio, los segundos son copias directas. Por lo general se prefieren usar soft links.

ln -s 
Una vez que llega a tener práctica descubrira que el comando mv es utilizado mas veces que el comando cp. mv tiene la misma funciónalidad de ubicar un archivo en otro lado, mas se elimina el archivo original. mv es mucho más eficiente que cp, ya que solo tiene que cambiar una entrada en el directorio, y no necesita hacer copia del contenido del (posiblemente largo) archivo.

find

find itera por todos los archivos del directorio especificado, o por omisión por el actual, y repite esta función recursivamente por todos los subdirectorios. Si no se especifica una operación, find imprime los nombres de archivos y directorios encontrados. Este comportamiento se puede modificar, usando operadores en forma de opciones con parámetros. Ejemplos:


\begin{labeling}{00.00.0000}
\item [\texttt{find}]genera una lista de todos los ...
...ttt{-print}: ademas imprime el nombre del archivo en la pantalla.
\end{labeling}
find es un comando muy poderoso y se utiliza mucho en la administración automatizada de sistemas. Para encontrar la ubicación de un cierto archivo, por otro lado, es muy ineficiente ya que itera cada vez por todo el disco duro. Para encontrar la ubicación de un archivo se utiliza mejor el comando locate. Este comando utiliza una base de datos indexados de todos los archivos en el disco duro, y extrae de esta la ubicación. Ejemplo:


\begin{labeling}{00.00.0000}
\item [\texttt{locate fernando}]este comando imprim...
... parte de su nombre contienen
la cadena de caracteres 'fernando'.
\end{labeling}
Cuando un archivo es renombrado, borrado, se crea un nuevo archivo, etc. la base de datos no se actualiza automáticamente. Por eso locate no reporta correctamente las ubicaciones, después de un cierto tiempo de uso. El programa updatedb que se ejecuta automáticamente una vez por semana actualiza esta base de datos. locate utiliza find para registrar todos los archivos que se encuentran en el (los) disco(s).

echo y cat

Consta que los comandos básicos que hemos visto hasta ahora mas que todo tratan con la destrucción de archivos o directorios: rm, rmdir etc. y que no hemos visto comandos para crear archivos. Una razón es, que para la creación arbitraria de archivos a mano se utilizan programas dedicados, según el tipo de datos a crear: programas de dibujo gráfico, captura de imágenes, sonido, etc. o en el caso de programas o textos sencillos: editores.

Por otro lado se pueden crear pequeños archivos mediante comandos sencillos, haciendo uso de las funciones de redireccionamiento del shell:


\begin{labeling}
% latex2html id marker 230
{00.00.0000}
\item [\texttt{echo}~\e...
...l capítulo \ref{cha:Scripts},
y la creación de pequeños archivos:
\end{labeling}

# echo domain magma.com.ni > /etc/resolv.conf

# echo nameserver 165.98.128.2 >> /etc/resolv.conf

crea (en caso que no existe) un archivo /etc/resolv.conf con el contenido:

domain magma.com.ni

nameserver 165.98.128.2

el uso de > y >> en la primera y segunda línea es a proposito. Lo primero sobreescribe el contenido actual del archivo con la salida del comando anterior y lo segundo - >> - anexa el texto ubicado después de echo al final del archivo.

echo no es un programa propio sino un comando internto del shell.


\begin{labeling}
% latex2html id marker 248
{00.00.0000}
\item [\texttt{cat~-~>~...
...a por línea, y terminado con \texttt{{[}Ctrl{]}}+\texttt{{[}D{]}}
\end{labeling}

grep

Si buscamos un archivo que contiene una cierta cadena de caracteres podemos usar este comando de la siguiente manera:

$ grep -r -l cadena *
La salida del comando es una lista de cero o mas líneas que contienen uno por uno los nombres de archivos en el directorio actual y sus subdirectorios (-r ...recursivo).

Otro uso de grep es, imprimir todas las líneas de un archivo, que concuerdan con una cierta cadena de caracteres.

$ grep cadena archivo
O por otro lado, imprimir todas las líneas que no contienen la cadena:

$ grep -v cadena archivo
un ejemplo práctivo para lo último es para leer archivos de configuración. En estos, muchas veces hay innumerables líneas de comentario, que comienzan con el caracter #.

$ grep -v '#' archivo
lee el archivo con el nombre archivo, y lo repite en la pantalla, oprimiendo las líneas que comienzan con #. Las comillas sencillas previenen que el shell interprete por si mismo la parte ``' archivo'' como comentario y lo omite, y el circumflejo simboliza el comienzo de la línea. Este símbolo previene de las expresiones regulares, que son explicadas prevemente en el capítulo G. La cadena de búsqueda no solamente puede ser una cadena fija de caracteres sino una expresión regular

sed

El nombre sed es una abreviación de 'stream editor'. En vez de editar interactivamente un archivo, sed lee línea por línea un archivo de la línea de comandos o desde el teclado, y aplica comandos de edición de texto, como reemplazar una cadena por otra, borrar o insertar cadenas de caracteres etc. Para ubicar en qué parte del texto aplicar los comandos, se usan expresiones regulares. El síntaxis común de una invocación de sed puede ser:

$ sed líneacomandos archivo
La expresión linea selecciona las líneas a las cuales se refieren los comandos, formas comunes para línea son:


\begin{labeling}{00.00.0000}
\item [\emph{número}]selecciona la línea que corres...
...comienzo} y la subsiguiente
línea que concuerda con \emph{final}.
\end{labeling}
Los comandos de edición consisten de una sola letra, seguida eventualmente por comentarios. Varios comandos pueden ser concatenados con ';' y grupos de comandos se encierran entre llaves: {}. Algunos de los comandos son:


\begin{labeling}{00.00.0000}
\item [\texttt{s/}\emph{busca}\texttt{/}\emph{reemp...
...t{sed -n}]No imprime por omisión las líneas leídas en la
entrada.
\end{labeling}
Es tiempo para algunos ejemplos. Si ha aplicado el ejemplo para eliminar las líneas de comentarios de un archivo del capítulo anterior, tal vez se hay dado cuenta, que hay archivos de configuración que contienen también muchas líneas vacías. Estos se pueden eliminar juntos con los de comentario con:

$ grep -v '$' archivo | grep -v '#'
La expresión regular $ es: comienzo de línea seguido por final de línea - una línea vacía. Con la concatenación de dos expresiones regulares por el operador lógico 'OR' - | - la barra vertical podemos combinar la selección de líneas a suprimir, pero grep no hará lo correcto (intentalo). sed nos ayuda:

$ sed '/#\|$/d' archivo
En palabras profanas: lee el archivo archivo línea por línea, y copialos a la salida - pero: si encuentras una línea que comienza con # o que está vacía, borrala.

Otro ejemplo, para solo imprimir cada segunda línea de un archivo:

$ sed -n 22p archivo
Concatena cada segunda línea con la primera, separada por espacio-guión-espacio:

$ sed -n '12{N;s/\n/ - /p;}'
Imprimir un archivo a partir de una línea que contiene ``estimados señores'':

$ sed 1,/estimados señores/d archivo
Imprimir un archivo a partir e inclusive esta misma línea:

$ sed -n '/estimados señores/,$p' archivo
Es sencillo modificar archivos existentes:

$ sed s/Ana/Eva/g carta_ana.txt > carta_eva.txt
sustituye en el archivo carta_ana.txt todas las ocurrencias de ``Ana'' por ``Eva'', y escribe el resultado en el archivo (nuevo) carta_eva.txt. Notemos, que no se puede sustituir un archivo en si mismo, sino tiene que escribirse en un nuevo archivo, y eventualmente renombrarse posteriormente.

Una aplicación más amplia de este último ejemplo es escribir un archivo plantilla, y crear de este automáticamente configuraciones individualizados. Para el siguiente ejemplo regresamos a la administración de sistemas. Supongamos que tenemos que crear archivos de configuración individuales para dominios Web virtuales. Elaboramos un archivo plantilla, virtualdomain:

<VirtualHost NRO_IP>

  ServerAdmin webmaster@DOMINIO

  DocumentRoot /var/www/DOMINIO

  ServerName www.DOMINIO

</VirtualHost>

Cada dominio virtual requiere que especifiquemos el número IP y el nombre del dominio, un ejemplo: 165.98.128.4 y linuxbook.org.ni.

# sed s/NRO_IP/165.98.128.4/\;s/DOMINIO/linuxbook.org.ni/ \

      virtualdomain > /etc/apache/linuxbook.org.ni

Crea el archivo de configuración /etc/apache/linuxbook.org.ni con el siguiente contenido:

<VirtualHost 165.98.128.4>

  ServerAdmin webmaster@linuxbook.org.ni

  DocumentRoot /var/www/linuxbook.org.ni

  ServerName www.linuxbook.org.ni

</VirtualHost> 

Editores de texto

No pretendemos dar un tutorial para cada uno de los editores de texto en esta sección. Hay fichas de referencia para algunos de ellos en el anexo. Primero explicamos en breve su función y después les damos a conocer los editores más comunes en Linux.

Un editor de texto se distingue esencialmente de un procesador de palabras. Mientras el segundo comúnmente utiliza un formato de archivo especializado y se orienta en la presentación del texto, los editores de texto, o editores ASCII, son orientados a la creación de archivos de ``texto plano''. Un archivo de texto plano es una concatenación de líneas, compuestas por caractéres, normalmente en código ASCII, separados por la secuencia final de línea - EOL, end of line - en Unix [Ctrl]+[J] - el símbolo para avance de línea - LF, linefeed - correspondiente al número hexadecimal 0x0a. Para introducir esta secuencia se utiliza la tecla [Enter]. Cabe mencionar, que en los sistemas operativos de la empresa Microsoft (Dos, Windows) se utiliza una secuencia [Ctrl]+[M] [Ctrl]+[J], para indicar EOL, y en los sistemas de Apple se utiliza [Ctrl]+[M]. [Ctrl]+[M] es el símbolo para el retorno al comienzo de la línea - CR carriage return - correspondiente al número hexadecimal 0x0d. Hay programas para convertir todo un archivo de texto entre uno y otro formato de final de línea (p.ej recode) y algunos de los editores reconocen el formato de fín de línea y se adaptan a el, o lo convierten según necesario. Un archivo de texto plano por lo general se puede copiar directamente a la impresora, la cual imprime caracter por caracter y - si es configurada correctamente - realiza correctamente los saltos de línea. No se necesita una conversión del archivo al formato de impresión.

Los archivos de texto plano tienen una importancia grande en la programación y para los archivos de configuración: los programas compilados y scripts por lo general son escritos en forma de archivos de texto plano, igual como los archivos en los cuales se definen los parametros y configuración del sistema operativo y de las aplicaciones que se ejecutan en ello.

En la edición de archivos a menudo se encuentran dos dificultades para principiantes: primero, el reconocer de que una o varias ``líneas vacías'' no son nada mas que una repetición de la secuencia final de línea, que es insertada como un simple caracter y que también es borrada como un simple caractér, de hecho, es (en Unix y Macintosh) una secuencia de simples caractéres. La segunda dificultad es acerca del cursor, o punto de inserción y la eliminación de un caracter del archivo. Al visualizar el texto, muchas veces se mira un caracter resaltado, o una linea vertical entre dos caracteres. Este es el punto de inserción: el siguiente caracter que se pulsa en el teclado se anexa después del caracter que está a la izquierda del punto de inserción. En los terminales de texto, donde el punto de inserción es marcado con un rectángulo iluminado en el caracter ``actual'', el punto de inserción es a la izquierda de este, entre el caractér marcado y el caracter próxima a la izquierda. Hay dos teclas para borrar un caractér: [Del] elimina el caractér a la derecha del punto de inserción, y [BkSp] o [$\leftarrow$] en la parte superior derecha del teclado elimina el caractér a la izquierda del punto de inserción.

El editor tradicional de los unices es:

vi
- sinónimo para visual editor, es basado en ex, un editor simple que manipula un archivo línea por línea. vi manipula el punto de inserción y el texto con comandos que consisten en un solo caracter: [x] para borrar un caracter, [j] para mover el punto de inserción a la izquierda, [/] para búsqueda, [s] para búsqueda y reemplazo etc. Estos comandos se encuentran en muchos otros programas de unix. Una carta de referencia se encuentra en el anexo [*].
El editor oficial del proyecto GNU es

Emacs.
Emacs no solo es un editor sino un ambiente de trabajo completo con capacidades y extensiones inmensos. Igual como vi utiliza teclas para su manejo, pero utiliza como prefijo las teclas [Alt] y [Ctrl], ambos editores pueden ser usados hasta con los teclados más sencillos, sin teclas de cursos y con terminales (monitores) con mínimas capacidades de manipulación de la pantalla. Por eso son muy práctico en la edición de textos en computadoras remota, donde a veces el método de conexión impide el uso de caracteres especiales o efectos avanzados en la pantalla. Las versiones Emacs para el ambiente gráfico también son manejados por menús, el ratón, y por lo general todas las teclas de movimiento de cursor y el borrado de caracteres son habilitados. En concepto de comparación con vi he aqui los comandos respectivos: [Ctrl]+[d] (delete) borra un caracter, [Ctrl]+[b] (back) mueve el punto de inserción a la izquierda, [Ctrl]+[s] (search) inicia la búsqueda, [Esc] [%] inicia búsqueda y reemplazo. La carta de referencia para emacs está en [*].
Otros editores son:

jove
mini editor con semejancias a emacs
jed
otro editor similar a emacs de escala media y muy flexible
nano
una reimplementación de licencia libre del editor pico, que es muy conocido por usuarios del programa famoso de correo electrónico pine.
mcedit
el editor integrado en Midnight Commander, clonado del Norton Commander para MS-Dos.
Todos estos editores trabajan en ambiente de texto, algunos también en ambiente gráfico y con soporte para el ratón.

stdin/stdout/stderr

En [*] ya nos hemos encontrado con los operadores > y >>, en [*] con |. En esta sección vamos a profundizar un poco sobre los conceptos detrás de ellos.

Los comandos usados en los shell de unix pueden considerarse en la mayoría de los casos como filtros, parecidos a filtros o procesadores de agua. Ellos reciben una serie de caracteres - stream = corriente, en su entrada, los manipulan y remiten el resultado a la salida. Si surgen iregularidades, por ejemplo no hay suficiente espacio en el disco duro para el procesamiento, se suele dar al operador un mensaje respectivo. Estos mensajes se transmiten por una salida aparte, llamada la salida estándar de error - stderr. La entrada y salida estándar se llaman stdin y stdout respectivamente. En el shell interactivo stdout y stderr por defecto son conectados a un canal de entrada/salida que transmite los caracteres producidos a la pantalla y el stdin esta conectado a un canal que recibe los caracteres que pulsamos en el teclado. Notese, que de esta manera los mensajes de errores y avisos sobre el procesamiento efectuado por un programa se intermezclan con la salida del programa.

Los operadores arriba introducidos sirven para reconectar las intradas y salidas de los programas a canales de entrada/salida diferentes, antes de ejecutarlo.


\begin{labeling}{00.00.0000}
\item [\emph{canal}]un canal de entrada salida pued...
...irección de la salida estándar
de error al \emph{canal} indicado.
\end{labeling}
Pueden redirigirse las entradas y salidas en cualqier combinación. Algunos ejemplos:

$ grep -r hda /etc/* 2> /dev/null
Este comando resultaría en muchos mensajes de error cuando intenta recursivamente entrar en subdirectorios de /etc/ que son protegidos contra lectura de usuarios comunes. La redirección envía todos los mensajes a /dev/null que es un canal de entrada salida que descarta cualquier caracter que es enviado hacia el. Muchas veces se refiere a /dev/null como bitbucket, o sea, el basurero de bits.

# X -probeonly 2> test.log
Ejecuta el gestor gráfico X del ambiente gráfico X Window System en modo de prueba, y acumula los resultados, que son escritos en la salida estándar de error en el archivo test.log. Eso es útil, ya que este programa emite una grán cantidad de diagnósticos sobre memoria, tarjeta gráfica detectada y disposición del monitor, que no calzan en una sola pantalla. Posteriormente el archivo test.log puede ser visualizado con un editor o un visualizador (vea E).

# tai64nlocal < /var/log/qmail-send/current > qmail.log
Lee el primer archivo, lo filtra a través del programa tai64nlocal que convierte sellos de tiempo en formato 'temps atomiqué internacional' al formato del horario local, y escribe el resultado al archivo qmail.log en el directorio actual.

$ </etc/apache/httpd.conf   sed '/#/d'   >apache.config
Imprime en la pantalla las líneas del archivo /etc/apache/httpd.conf que no comienzan con #, el caracter que introduce un comentario. Este ejemplo ilustra, que no es preciso, que la redirección se indique después del comando, también puede ubicarse en frente, y que no se require introducir un espacio en blanco entre el operador de redireccionamiento y el canal.


\begin{labeling}{00.00.0000}
\item [\emph{comando}1~\texttt{\vert}~\emph{comando...
...ación de archivos
que trae la {}\lq\lq caja de herramientas'' de unix.
\end{labeling}

$ grep -v  '<Directory' /etc/apache/httpd.conf \

  | grep -v '</Directory' | grep -v '#' |less

lee el archivo de configuración del servidor web apache, y elimina con el primer grep todas las líneas que contienen <Directory, con el segundo grep todas las líneas que contienen su contraparte </Directory, y con el último grep todas las líneas de solo comentario. El resultado final de este filtraje es visualizado con el paginador less. Tal vez esto no parece un ejemplo muy convincente, pero uno/a puede verse en una situación que quiere filtrar información de un archivo, y concatena de esta manera en un proceso de intento y error los filtros, hasta obtener un resultado conveniente. También mostramos en este ejemplo, que igual como con >, < y >> no es necesario interponer un espacio en blanco entre el operador pipe y sus operandes.


next up previous contents
Next: Manejo de Linux en Up: Manejo Previous: Manejo   Contents
Georg Lehner 2003-10-28