Documentos de Académico
Documentos de Profesional
Documentos de Cultura
o también
ls /etc 1> etc.txt
• Para enviar el contenido del archivo numeros.txt como entrada al comando sort
(que veremos más adelante en este mismo capítulo con más detalle), los dos
comandos siguientes son equivalentes:
sort < numeros.txt sort 0< numeros.txt
Por defecto, el operador > al ser empleado sin ningún otro modificador
asume 1>, de la misma manera que < es sinónimo de 0<.
En este último ejemplo, stderr (2) es redirigido a stdout (&1, donde & indica que 1
debe interpretarse como un descriptor de archivo en vez de un archivo propiamente
dicho llamado 1 a secas) y luego todo el conjunto es enviado a /dev/null.
Variables de entorno
Una variable de entorno es un objeto que contiene datos utilizados por una o más
aplicaciones. En términos simples, se trata de un conjunto nombre/valor. Para ver la
lista de las variables disponibles en nuestra sesión de usuario utilizaremos el
comando env.
Algunas de ellas son las que mostramos en la lista siguiente, junto con su propósito. Es
importante aclarar que la disponibilidad de una cierta variable puede depender del
uso actual del sistema. Por ejemplo, SSH_CONNECTION no estará presente si no
estamos conectados a un servidor SSH remoto.
• HISTSIZE: máxima cantidad de comandos contenidos en el historial (aplica al
usuario logueado actualmente).
• PATH: listado de directorios, separados por dos puntos, donde se deben buscar
los ejecutables correspondientes a los comandos ingresados por el usuario.
En la imagen vemos los valores correspondientes a las variables mencionadas en el
listado anterior utilizando el comando echo y anteponiendo el signo $ al nombre de la
variable. Como podemos notar, no se ha establecido ningún valor para EDITOR.
o al principio:
PATH=~/bin:$PATH
y luego indiquemos que la variable se deberá exportar al inicio de sesión del usuario
actual:
echo 'export HISTSIZE' >> ~/.bash_profile
Si deseamos que los cambios efectuados tomen efecto de manera inmediata podemos
utilizar el comando
source ~/.bash_profile
Para empezar, ejecutemos los siguientes comandos en una terminal, cuyo resultado
vemos en la imagen siguiente:
• Un alias: type ls
Por supuesto, type acepta varias opciones que pueden modificar su uso. En primer
lugar, podemos mencionar -P, la cual obliga a una búsqueda dentro de los directorios
indicados en la variable de entorno PATH. Además, también podemos utilizar -a para
mostrar todas las coincidencias encontradas en los mismos.
Ahora veamos cómo crear alias para nuestro uso que se adapten a nuestros deseos o
necesidades.
Por ejemplo, el comando
cd ../../
Para deshabilitar un alias bastará utilizar la herramienta unalias seguida del nombre
del alias en cuestión:
unalias ..
Por otro lado, si deseamos que un alias sea permanente deberemos guardar su
declaración al final de ~/.bash_profile o ~/.profile.
El historial de comandos
Cuando iniciamos sesión en una terminal, el entorno de la shell se pone en
funcionamiento de acuerdo a nuestras configuraciones personales. Para cada usuario,
las mismas se encuentran dentro de archivos ocultos en su correspondiente directorio
personal. Uno de estos archivos es ~/.bash_history, donde se guarda el historial de
comandos en Linux.
Por suerte, al disponer del historial podemos ejecutar un comando fácilmente sin
volver a tener que escribirlo nuevamente. En primer lugar, recordemos que con el
comando history podemos listar los comandos disponibles. A continuación,
colocando un signo de exclamación y el número del comando en el historial podremos
ejecutarlo otra vez. En otras palabras,
history 10
y presionar Enter. Como resultado, se abrirá nuestro editor de texto por defecto. Esto
nos permitirá modificar cualquier parte del comando y ejecutarlo automáticamente al
guardar los cambios.
Esta herramienta también nos permite modificar una serie de comandos y ejecutarlos
a continuación. Por ejemplo
fc 2000 20005
nos permitiría editar los comandos que ocupan desde la posición 2000 a la 2005 en el
historial.
Localizar comandos
El comando which nos muestra la ubicación del archivo ejecutable correspondiente a
un comando dado. Para hacerlo, busca en orden dentro de los directorios que
aparecen en PATH. Como podemos apreciar abajo, podemos indicarle más de un
comando a la vez:
which ls
which ps top
which whereis whatis man
Dos detalles interesantes sobre el uso de which son los siguientes:
• Una vez que se identifica un binario dado en un directorio incluido en PATH, la
búsqueda se detiene a menos que se utilice la opción -a. En ese caso se buscará
en TODOS los directorios en vez de finalizar con la primera ocurrencia.
Manipulación de texto
Gran parte de las tareas de un sysadmin se llevan a cabo al manipular archivos o flujos
de texto. Para ayudarnos en esta responsabilidad podremos utilizar los comandos que
listamos a continuación.
El comando cat puede ser interesante para ver el contenido de archivos pequeños,
pero en general more o less resultan de mayor utilidad en la mayoría de los casos, en
especial si tratamos con archivos extensos.
Estas dos herramientas paginan (dividen en páginas) uno o varios archivos y los
muestran en la terminal. De no indicárseles un archivo dado, paginan la entrada
estándar. Se diferencian en las facilidades que brindan como indicamos a
continuación:
• more es más restrictivo en cuanto al movimiento dentro del texto, y visualiza
sucesivamente el porcentaje del archivo examinado hasta el momento. Cuando se
alcanza el final del último archivo a paginar, more termina automáticamente.
• Por otro lado, less cumple la misma función que more, pero además, nos permite
realizar búsquedas de palabras dentro del contenido del archivo, resaltar los
resultados, y saltar entre una ocurrencia y otra.
Por ejemplo:
less /etc/password
more /etc/passwd
Para examinar un archivo (o más) con cualquiera de estas dos herramientas:
• la tecla q permite interrumpir el proceso y salir.
• h para mostrar la ayuda disponible (también salimos de la misma con la tecla q).
El comando man (que utilizamos para acceder a los man pages o manuales de los
comandos), utiliza por defecto el paginador less para dar formato a su salida. Existen
además los comandos zless y zmore que permiten paginar a los archivos
comprimidos sin necesidad de descompactarlos previamente en nuestro disco.
o su equivalente
sort -u datos.txt
ordenará las líneas del archivo datos.txt omitiendo cualquier repetición presente.
En capitales.txt:
Buenos Aires
Montevideo
Asuncion
Santiago
La Paz
Brasilia
Para unir ambos archivos en un tercero llamado info.csv utilizando una coma para
separar campos, haremos
paste -d, paises.txt capitales.txt > info.csv
Esta herramienta siempre nos será útil cuando necesitemos pegar el contenido de un
archivo en otro y especificar un separador entre ambos. Los archivos con campos
separados por comas generalmente son empleados para procesar datos a través de un
programa de hojas de cálculo como Microsoft Excel o LibreOffice Calc.
nos permitirá ver los accesos a nuestro servidor web Apache a medida que ocurran
(esta ruta corresponde a CentOS 7).
Otras situaciones en las que el uso de cut puede resultarnos útil es al extraer una
cierta cantidad de caracteres (mediante la opción -c) de cada línea. Podemos
especificar un rango definido, una posición de comienzo e indicar que se extraiga
hasta el final, o una posición final y pedir que se muestre desde el principio hasta la
misma:
• Para extraer los primeros 4 caracteres de cada línea: cut -c1-4 /etc/passwd
• Para mostrar desde el caracter en la posición 10 hasta el final de cada línea: cut
-c10- /etc/passwd
• Para ver desde el principio de cada línea hasta la posición 7: cut -c-7
/etc/passwd
Vale la pena recordar que el comando cut puede aceptar como entrada el resultado de
un comando anterior a través de una tubería. Por ejemplo,
date | tr -s " " | cut -d' ' -f6
devolverá el año actual a partir de date (que devuelve la fecha), tr (que a partir de la
opción -s remueve los espacios repetidos y los combina en uno), y de cut. Estos
comandos combinados nos permiten mostrar la información de interés.
nos indicará cuántos procesos están corriendo bajo el usuario www-data. (Pista: grep
-v PID se utiliza para no incluir el encabezado de la lista de procesos en el conteo de
líneas).
La opción combinada -dc indica que se debe mostrar el resultado por pantalla en vez
de guardar el archivo descomprimido en el disco. Si se desea almacenar el archivo
original, tendremos que omitir la opción c:
gzip -d datos.txt.gz
bzip2 -d datos.txt.bz2
xz -d datos.txt.xz
Dividir archivos
Linux provee una herramienta muy útil llamada split para dividir archivos de gran
tamaño. Comencemos primero creando un archivo llamado archivoprueba.iso de 2 GB
(bs=1M * count=2000) en el directorio actual:
dd if=/dev/zero of=archivoprueba.iso bs=1M count=2000
Con la opción --bytes indicamos el tamaño máximo que deberá tener cada archivo
individual. Por otra parte, --numeric-suffixes nos permite agregar un número al
final del nombre de cada uno. Finalmente, archivoprueba.iso es el nombre del
archivo a dividir, mientras que archivoprueba.iso. (notar el punto al final) es el
prefijo de salida.
Una vez que hayamos compartido los archivos, podemos regenerar el original muy
fácilmente. Nombraremos el archivo destino como archivoprueba.iso.nuevo para
distinguirlo del original propiamente dicho:
cat archivoprueba.iso.* > archivoprueba.iso.nuevo
El comando ls
Este comando nos permite distinguir los siguientes tipos de contenidos en un
directorio. También vale la pena mencionar que si el argumento representa un
archivo, enlace simbólico, dispositivo, etc., veremos datos sobre el mismo en la salida
de ls.
• En blanco (en el caso de que el color de fondo de la terminal sea negro u otro
color oscuro, que es lo más común), los archivos de texto o binarios no
ejecutables.
• En fondo negro con letras rojas, los enlaces simbólicos rotos. Nos referimos a
aquellos que apunten a un recurso del sistema que no existe.
En este caso, adm.txt y datostutor.txt son ejemplos de archivos. Por otro lado,
archivo3 (contrario a lo que podría sugerir su nombre) se trata de un directorio,
link_archivo2 es un enlace simbólico activo, link_archivo1 uno roto, y archivo2 es
un archivo binario ejecutable.
En Linux podemos ver que tanto los archivos como los directorios pueden tener
varios puntos en su nombre, pero cuando el punto está adelante los transforma en
ocultos. Por ejemplo, .hola no se verá con un ls normal. Sin embargo, al utilizar el
modificador -a, podremos ver todos los archivos ocultos que se encuentran en ese
directorio.
Generalmente los archivos ocultos son los que contienen información
acerca de configuraciones. Al no ser visibles fácilmente es menos
probable que sean borrados de forma accidental.
2. Esta columna nos dice si este objeto posee enlaces que lo estén apuntando.
5. Tamaño en bytes del objeto. Para mostrar este dato en una unidad más amigable
(KB, MB, etc.) podemos agregar la opción -h.
El comando cp (copy)
La herramienta cp se usa para copiar archivos. A continuación del comando
propiamente dicho, se debe escribir el archivo que se desee copiar y el destino donde
se habrá de guardar la copia.
Una opción interesante de este comando es -a, la cual hace una copia
exacta de los directorios y subdirectorios. Esto también incluye los
permisos o links que pudiera haber en el directorio de origen.
Por ejemplo:
cp pruebas/holamundo.txt .
hará una copia del archivo ejemplo.txt que se halla dentro de pruebas, en el
directorio actual, pero con el nombre copiaejemplo.txt.
Veamos el resultado de los dos comandos anteriores:
El comando mv (move)
Esta herramienta se utiliza tanto para mover archivos de un lugar a otro como
también para renombrarlos. Es importante tener en cuenta que si el archivo de destino
existe, se sobreescribirá mediante este proceso.
Para ilustrar, cambiemos el nombre de copiaejemplo.txt a nuevacopiaejemplo.txt.
Luego de ejecutar el comando
mv copiaejemplo.txt nuevacopiaejemplo.txt
2. identificar archivos
Para buscar un archivo por nombre, utilizamos find seguido del directorio a partir del
cual deseamos realizar la búsqueda, de la opción -name (o -iname si deseamos ignorar
mayúsculas y minúsculas), y finalmente el nombre del archivo.
Si utilizamos un comodín (*) en el nombre del archivo como criterio de búsqueda,
deberemos encerrar el mismo entre comillas para evitar que la shell lo expanda (lo
cual sucedería ANTES de efectuar la búsqueda propiamente dicha).
Veamos los siguientes ejemplos:
• Buscar en el directorio /etc todos los archivos con extensión .conf: find /etc -
name '*.conf'
• Buscar los archivos cuyo tamaño esté entre 10 MB y 20 MB: find / -size
+10240k -size -20480k
• Buscar todos los archivos con find dentro del directorio /etc cuyo dueño sea el
usuario root y que fueron modificados exactamente hace 2 meses (60 días): find
/etc -type f -user root -mtime 60
Si quisiéramos ver la misma lista de archivos que fueron modificados hace más de un
cierto número de días, deberemos usar dicha cantidad con el signo + delante. En
resumen:
• -mtime x: archivos modificados exactamente hace x por 24 horas (lo cual se
traduce en x cantidad de días).
• Buscar archivos vacíos a partir del directorio raíz: find / -type f -empty
Para ejecutar una acción determinada sobre los resultados de una búsqueda
emplearemos la opción -exec. Por ejemplo, para cambiar los permisos de 777 a 644,
utilizaremos -exec seguida de la acción que deseamos realizar (en este caso chmod
644 a todos los archivos resultantes, simbolizados por {}+:
find . -type f -perm 777 -exec chmod 644 {} +
Para borrar archivos usaremos la opción -delete de GNU find (en este caso no es
necesario recurrir a -exec para especificar la acción deseada ya que la misma es
provista por una opción en particular). Veamos cómo borrar archivos vacíos:
find . -type f -empty -delete
La diferencia entre find y locate (otra herramienta utilizada para realizar
búsquedas) es que el primero emplea la estructura del sistema de archivos (o una
porción de esta) para realizar una búsqueda, mientras que locate lee la ubicación de
los archivos desde una base de datos interna.
nos mostrará un listado detallado de los contenidos del directorio actual. Esto incluye
permisos, dueño, grupo propietario, y fecha de última modificación de cada ítem,
entre otros datos. Al complementar este comando con una tubería y enviando la salida
hacia tee lograremos nuestro objetivo. La salida será mostrada por pantalla y será
guardada en el archivo listado.txt:
ls -l | tee listado.txt
Si acertamos al afirmar que nos permite descargar una imagen ISO de CentOS 7,
guardarla en el archivo centos7.iso y al mismo tiempo calcular su hash sha256 (y
guardarla en dvd.sha256) para verificar su integridad, ¡estamos en lo correcto! Como
podemos ver, la combinación de las redirecciones, tuberías, y el comando tee nos
permite realizar las más variadas tareas.
Otro punto importante a tener en cuenta cuando hablamos de redirecciones es la
necesidad de ejecutar un comando sobre todos los resultados de otro. Para esto
usamos la herramienta xargs.
Consideremos el siguiente ejemplo para ilustrar. Con el comando find localizamos
todos los archivos con la extensión .txt y mostramos su ubicación. Al enviar la salida a
xargs podemos especificar que se realice una acción diferente sobre cada línea del
resultado (ls -l en este caso):
find . -maxdepth 1 -type f -name "*.txt"
find . -maxdepth 1 -type f -name "*.txt" | xargs ls -l
Veamos el resultado:
En síntesis, podremos utilizar xargs cada vez que necesitemos operar sobre los
resultados de una búsqueda con find (que es lo más usual) o de algún otro comando.
Archivado y compresión
En Linux, el archivado y compresión se realiza utilizando el comando tar (archivado)
en conjunto con gzip, bzip2, o xz (compresión). La posibilidad de disponer de un solo
archivo comprimido (a menudo llamado tarball) que contenga muchos otros
(incluyendo directorios) nos permite distribuirlo fácilmente mediante correo
electrónico o transferirlo a través de una red, con la ventaja adicional de que su
tamaño es menor que la suma de sus contenidos.
A modo informativo, las nuevas versiones del kernel se distribuyen
desde kernel.org comprimidas con xz.
A continuación, veamos cómo comprimir este grupo de archivos con cada una de las
herramientas que mencionamos hace instantes:
• Para comprimir y empaquetar archivo1.txt, archivo2.txt, y archivo3.txt con
gzip y tar en un archivo de nombre tarcongzip.tar.gz dentro del subdirectorio
resultados debemos hacer lo siguiente:
tar -czvf resultados/tarcongzip.tar.gz archivo1.txt archivo2.txt
archivo3.txt
Como observamos en los ejemplos, los comandos en cada caso son prácticamente
idénticos. La única diferencia reside en el uso de las opciones -z, -j, y -J que
representan la compresión con gzip, bzip2, y xz respectivamente.
Antes de descomprimir, crearemos tres directorios auxiliares dentro de resultados:
mkdir resultados/1
mkdir resultados/2
mkdir resultados/3
Y luego descomprimiremos los contenidos en tarcongzip.tar.gz,
tarconbzip2.tar.bz2, y tarconxz.tar.xz en resultados/1, resultados/2, y
resultados/3. La opción -C (mayúscula) nos permite indicar un directorio destino
para los archivos descomprimidos antes de realizar la operación propiamente dicha:
tar -xzvf resultados/tarcongzip.tar.gz -C resultados/1
tar -xjvf resultados/tarconbzip2.tar.bz2 -C resultados/2
tar -xJvf resultados/tarconxz.tar.xz -C resultados/3
• Cabe destacar que todas las opciones de tar (que podemos consultar en el man
page correspondiente) se pueden utilizar con cualquiera de las herramientas de
compresión mencionadas anteriormente.
Si bien existen otras herramientas más potentes y versátiles (aunque complejas) para
realizar copias de respaldo en Linux, todo administrador de sistemas debe conocer
tar y las herramientas de compresión como la palma de su mano.