Apuntes mientras aprendo sobre software y computadoras.

Linux

Guía mínima para empezar con la terminal de Linux

Introducción

Hola, mi nombre es Gustavo. No soy un experto en la terminal de GNU/Linux. Y por eso mismo es que hice la “Guía mínima para empezar a usar la terminal de Linux”.

¿Cómo es eso? ¿Qué hace un principiante escribiendo sobre un tema del que hasta hace unos días no tenía ninguna idea? Esas y otras preguntas son pertinentes para el caso. Para todo eso tengo dos respuestas.

Voy a comenzar diciendo que no es la primera vez que escribo algo como esto.

Antes escribí la “Guía total para empezar con Ubuntu Linux” y la “Guía mínima para empezar a programar en bash”. En los dos casos también comencé a escribir antes de tener la más pequeña noción de lo que estaba haciendo.

Puedo ser un principiante en los temas que estudio, pero no soy un principiante en escribir sobre cosas que me resultan nuevas o de las que estoy aprendiendo.

Lo segundo: estoy escribiendo para enseñarme a mi mismo. Soy una de esas personas que creen que la idea de “enseñar para aprender” es realmente valiosa. Así que escribir una guía de algo mientras lo voy practicando es solamente una de las formas posibles de desarrollar esa idea.

Desde un punto de vista, comenzar a escribir desde cero es una desventaja al encarar un proyecto de este estilo. En el mercado hay miles de opciones para aprender las mimas cosas, escritas por personas expertas en la materia. No hay falta de opciones y me resultaría imposible mejorarlas, descontando algún golpe de suerte.

Pero desde otro lugar, no saber nada de un tema antes de empezar a aprender es una ventaja. Realmente no tengo ninguna parcialidad respecto a que información es más o menos valiosa. Escribo sobre los tópicos que me resultaron más útiles o más interesantes.

Puedo equivocarme, pero al final del día esto no es más que mi propio apunte personal. Un apunte hecho público, pero personal. Es lo que yo considero “mínimo” para usar la shell de Linux, aun sabiendo que en ese proceso de recorte dejé muchísima información afuera.

Así que, en resumen, espero que el material te resulte de utilidad. Si te interesa mi proyecto, no olvides escribirme un correo electrónico contándome tu opinión.

Y si encontrás errores o ejemplos confusos en el material, por favor decímelo para que pueda corregirlos. De ese modo el texto va a mejorar, y yo voy aprender algo nuevo.

Capítulo 1: sistema de archivos

Cuando empecé a utilizar GNU/Linux me costó entender exactamente como se encuentra organizado el sistema de archivos.

No entendía en que carpeta estaba cada cosa.

Puedo explicar esto fácil con un ejemplo. Es fácil suponer que puedo encontrar en la carpeta “Imágenes” pero… ¿qué puedo esperar en una carpeta llamada “/etc/”?

Este es mi intento para, de forma mínima y ligera, dar un vistazo rápido del árbol de directorios que por lo general se puede esperar en un sistema operativo GNU/Linux.

Para darles una imagen rápida, ahora en la cabeza tengo una tenue idea de donde se encuentra cada cosa. No me interesé en el tema más que para tener unos puntos de referencia por lo que guiarme.

¿Directorios o carpetas?

¿Las dos palabras significan lo mismo? ¿Se trata de ideas intercambiables?

Según entiendo, lo mejor es no usar las dos palabras como completamente intercambiables. La diferencia entre ambas va a ayudar con el resto de la lectura de esta guía.

Una carpeta es un lugar donde guardo archivos y documentos. También puedo usarla para guardar otras carpetas. Un directorio también.

La carpeta es la representación “simbólica” del directorio; es un directorio de la forma en que se me representa por fuera de la terminal.

Para hablar de un directorio, el mismo tiene que tener un camino definido a un lugar en el disco duro.

En la terminal, cuando busco una carpeta específica, busco un directorio.

Los directorios hacen un sistema de carpetas ordenadas. Esto forma un índice si se quiere, por el que puedo moverme en la terminal. En su conjunto, un sistema de archivos.

¿Qué es un sistema de archivos?

Si busco un poco en la red, encuentro sobre el sistema de archivos lo siguiente:

A filesystem is the methods and data structures that an operating system uses to keep track of files on a disk or partition; that is, the way the files are organized on the disk. The word is also used to refer to a partition or disk that is used to store the files or the type of the filesystem.

Proyecto de Documentación de Linux

Entonces bien, si tradusco esto al castellano, me queda que el sistema de archivos en Linux es:

1 – Los métodos y la estructura de los datos que el sistema operativo usa para seguir la pista de los archivos en un disco o una partición de disco.

Esto se une con lo que pensaba antes de los directorios. Un directorio me da, por decirlo de alguna forma, una dirección para encontrar un determinado algo guardado en el disco duro.

2 – El sistema de archivos puede ser de varios tipos, depende del sistema operativo. Y hace referencia al espacio que usan los programas para guardar cosas. Si los programas guardaran sus archivos en cualquier lado, constantemente se estarían sobrescribiendo cosas. Un filesystem le da un orden a eso.

El árbol del directorio:

Para imaginarlo, puedo seguir ese camino de directorios como si me moviera por un árbol.

Puedo comenzar por la raíz (directorio principal), luego desde el tronco aparecen dos ramas (otras dos subdirectorios) y cada rama tiene ocho pequeñas ramas en ellas (nuevos subdirectorios).

El ejemplo del árbol funciona porque el sistema de directorios tiene un orden jerárquico. Si algo le pasa al tronco, el árbol esta en problemas. Aunque no sea siempre así, como voy a ver más adelante.

Algo a tener en cuenta, dentro del sistema Linux todo es tratado como un archivo o un directorio.

Nada de letras

Bien, este es el primer detalles que salta a la vista:

Linux no utiliza letras para distinguir los discos duros o sus particiones. No encuentro “C:\ “ por ninguna parte, como lo podía ver en mis épocas de utilizar Windows.

Los discos son “montados” (mounted) con la estructura de los directorios, y desde ahí el sistema accede a los datos.

Mayor flexibilidad

En Linux existe la posibilidad de “dividir” el sistema operativo en varios discos duros o particiones.

De este modo el sistema de archivos funciona como un todo que puede tener sus partes separadas.

Puede estar el “árbol de datos” completo dentro de un mismo disco, o no. Los mismos programas reparten sus componentes en distintos subdirectorios.

Esta forma modular le da una mayor flexibilidad al sistema. Si uno de los directorios en un disco resulta dañado, esto no golpea a todo el conjunto íntegramente.

Por ejemplo, puedo establecer el directorio raíz en un disco, y el directorio /home en otro. Si el disco con el directorio raíz se rompe, los archivos personales aun siguen en el otro disco con el directorio /home intacto. O si me quedo sin espacio, puedo expandir mi directorio personal hacia otros discos.

Es importante recordar esa versatilidad para entender el sistema de archivos en Linux.

Lo que sigue es un mínimo vistazo al sistema de archivos. No son todos los directoriod que hay, pero son los que por una razón u otra tuve que visitar en algún momento.

Un vistazo por el directorio:

/

El directorio root / se conoce como la “raíz” del sistema (su símbolo es una barra slash). Es la carpeta de mayor jerarquía. Todas las demás carpetas tiene su origen en el directorio raíz.

De forma directa o indirecta, el resto del sistema de archivos esta formado por subdirectorios de root. Pero no todos los subdirectorios tienen que estar en la misma partición del disco.

El contenido de esta carpeta funciona para iniciar, reparar y recuperar el sistema. Si al iniciarse el sistema esta carpeta no aparece, la máquina no va a funcionar.

/bin

Este directorio contiene todos los archivos ejecutables que son necesarios para administrar y utilizar el sistema operativo. Entro estos la terminal y sus comandos.

Es un directorio importante para que todo funcione correctamente. En las particiones manuales generalmente es instalado junto con el directorio raiz, porque se lo considera como un directorio necesario para usar el sistema, aunque sea solamente desde la terminal.

/sbin


Este subdirectorio tiene archivos ejecutables necesarios para mantener y administrar del sistema (ejemplo: init, ifconfig, etc). Según entiendo, los sistemas binarios que aparecen en este directorio no pueden ser ejecutados por otra cuenta que no sea la de nivel root.

/boot

Archivos que Linux utiliza cuando se inicia el sistema. Se trata de archivos de configuración (solamente los esenciales), una imagen del kernel que mapea el inicio de Linux.

/dev

Los “device files”, archivos que forman parte del hardware: discos duros, parlantes, impresoras, etc.

Se los considera “pseudo archivos”, porque en Linux incluso el hardware es visto como un archivo.

/etc

Aquí encuentro los archivos de configuración de Linux. Estos archivos son muy importantes, por lo que tienen que ser “estáticos y no ejecutables”.

A lo largo de la guía voy a entrar una o dos veces a esta carpeta, que tiene archivos por ejemplo para modificar detalles de las cuentas individuales.

/home

El directorio home es “el hogar” de mis propios archivos. Es el espacio de uso personal donde organizo mis fotos, archivos de texto y todas esas cosas.

Linux es un sistema operativo que permite múltiples cuentas, por lo que varias personas podrían tener su propia carpeta /home en el mismo equipo.

Al contrario de otros subdirectorios, el tamaño de este crece y decrece constantemente, según le quito o agrego archivos.

/lib

Librerías y módulos compartidos del kernel. Este directorio es necesario para iniciar el sistema operativo.

Suele ser alojado junto a / durante las particiones manuales y en lo que a mi respecta, no voy a modificarlo a lo largo de esta guía (o al menos no que recuerde).

/media

Es el directorio donde agrego dispositivos de almacenamiento de datos. Es el lugar donde voy a encontrar otros discos duros, memorias usb, etc.

Dicho de otro modo es donde “monto y desmonto” estos dispositivos. Emplo, cuando el sistema se inicia no voy a encontrar los discos duros directamente (los discos que no contienen el sistema de archivos). Tengo que montarlos antes, haciendo clic en ellos.

Suena algo difícil de hacer, pero es realmente muy sencillo. Sin embargo es un tema profundo, del que mejor voy a estudiar en otra ocasión.

/lost+found

En algunas ocasiones el sistema operativo puede sufrir un error inesperado (por ejemplo, un corte de luz). Al volver a re-iniciarse, Linux realiza un chequeo de los archivos, para ver si algo de información sufrió algún daño. El resultado de recuperar estos archivos posiblemente dañados termina en este directorio.

/opt

Este directorio contiene algunas aplicaciones que no forman parte de la instalación básica del sistema operativo. Ejemplo, navegadores.

Se supone que es la carpeta indicada para instalar programas de terceras partes, aunque por algún extraño motivo (que no conozco) casi nunca la uso.

/tmp

Directorio donde se guardan los archivos temporales, como por ejemplo los que se crean mientras navego la red o escribo en un procesador de texto.

Eliminar archivos en este directorio puede afectar el funcionamiento de programas que están en funcionamiento, causando problemas inesperados.

/usr

Este es el directorio donde Linux guarda la mayoría de la documentación, librerías, archivos binarios“ de uso común”. Estos pueden ser usados por cuentas individuales.

En su interior hay múltiples subdirectorios. Los programas que vienen por defecto por el sistema, por ejemplo Firefox en algunas distribuciones, se encuentra en este subdirectorio.

/root

No tengo que confundir este subdirectorio con el subdirectorio superior / (tambien conocido como root o raíz). La misma documentacion de Linux bromea con esto diciendo que es como “raíz dentro de raíz”

Este subdirectorio contiene los archivos de la cuenta individual con nivel de administración “root”. Es algo así como el directorio personal home para la cuenta de mayor nivel de seguridad. Dedicado para tareas de administración del sistema.

Resumido a lo mínimo:

Cuando trabajo en la terminal, me muevo entre directorios. Cada directorio tiene una dirección especifica dentro del disco.

La suma de los directorios crea algo que puedo imaginar como un árbol de datos. Toda esta estructura es modular, y comienza desde el directorio raíz (root).

Capitulo 2: El Sistema de permisos

En el ecosistema del sistema operativo GNU/Linux hay muchos archivos y directorios. Sin embargo no todos esos documentos son accesibles para cualquier persona.

A modo de sistema de seguridad, se dispone de un conjunto de permisos y derechos para darnos un mayor de nivel de control.

Se utilizan estos permisos para poner barreras. Los mismos permisos están detrás de lo que puedo hacer con cada archivo y documento.

Y deciden ademas quienes puede acceder o no a ellos. Una carpeta, un programa o un documento puede ser bloqueado o parcialmente restringido simplemente manipulando los distintos permisos.

En Linux existen tres clases de permisos

  • Read (Lectura) se simboliza con la letra r. Este permiso permite ver el contenido de un archivo o directorio.
  • Write (escritura) reconocido con la letra w. Permite modificar el contenido de un archivo o directorio.
  • Execute (ejecutar) simbolizado con la letra x. Permite ejecutar tanto un programa o un scrip/código. Ademas de poder entrar y ver el contenido de un directorio dado.

Esos tres permisos/derechos resumen lo principal que es necesario recordar.

Sabiendo esto, voy a ver ahora en que forma los permisos sirven para mediar entre los archivos del sistema y las personas que los utilizan.

Ver los permisos de un archivo con el comando ls -l

Todo lo anterior puede parecer difícil de seguir. A mi me pareció algo confuso al principio, uno de esos casos de “sobrecarga de información”.

Por eso que tal vez puedo mejorar la explicación haciendo uso de algunos ejemplos.

Para eso voy a utilizar el comando ls, que sirve para mostrar de forma ordenada los archivos contenidos en un directorio en forma de lista. La descripción en inglés del comando es “list directory contents”.

Entonces al usar el comando en un directorio:

ls  (nombre del directorio)

Aparece un listado de los archivos ahí contenidos.

Aunque realmente también puedo no especificar un camino al comando, y en ese caso voy a recibir un listado del directorio en el que se encuentra trabajando la terminal.

Pero voy a pasar a lo que me interesa ahora, ver los permisos de cada archivo. Eso lo consigo agregando la opción -l al comando

ls -l 

Agregar la opción -l significa darle Long Listing o mostrar una Lista Aumentada con datos del documento.

Ahora este comando modificado me muestra lo que estoy buscando, conocer los permisos que tiene un archivo o directorio.

Ahora un ejemplo. Voy a analizar con ls -l un documento.

Por ejemplo, el resultado de inspeccionar un archivo de texto

ls -l novela

es

- rwxr-xr-x 1 ezequiel admins 76 2018-05-20 17:18 novela

En cualquier caso, toda esa información a primera vista resulta abrumadora: al verlo, el conjunto de los datos parece una ensalada de letras (y números) difícil de entender.

Pero si se analiza cada columna por separado, se puede ver que en total hay 10 compartimientos (a los que voy a numerar del 1 al 10) por delante del nombre del archivo .

- rwx r-x r-x 1 ezequiel admins 76  2018-05-20  17:18  novela
1  2   3  4   5   6        7    8     9         10    (archivo)

La primera columna (1) informa de alguna de estas posibles opciones:

| significa que se trata de un archivo
d | quiere decir que se trata de un directorio
l | significa que es un link simbólico a otro archivo o directorio.
b | block o bloque.
c | significa un carácter.
p | es para FIFO.
S | significa socket.

En este caso mi primera columna dice « – », y por consiguiente puedo saber que se trata de un archivo y no de un directorio, por ejemplo.

Luego siguen tres columnas, y cada columna entrega tres posibles datos diferentes.

Suena extraño, pero recortando el diagrama de arriba se va a ver de forma más sencilla.

Son los compartimientos (2), (3) y (4).

rwx    r-x    r-x
(2)    (3)    (4)

¿Qué significan estas letras?

El compartimiento de adelante (2) corresponde a los permisos que tiene una cuenta específica. En este caso el usuario Ezequiel, quien es el creador del archivo.

El compartimiento que sigue (3) corresponde a los permisos para el grupo que también tiene acceso al documento. Ezequiel es parte de ese grupo. Es valioso saber que todos los archivos incluyen los permisos de grupo, aunque en este caso el grupo solamente esta integrado por Ezequiel.

Termina con el compartimiento (4) donde muestra los permisos para el resto del mundo (world). Esto es, para cualquier persona o entidad cibernética que acceda al documento, que no sea la cuenta Ezequiel o sus grupos autorizados.

Esas categorías son importantes, hay que releerlas varias veces para entender permisos y derechos en Linux.

Como la computadora del ejemplo corresponde a un único usuario (sin grupos), puedo concentrarme ahora en el primer compartimento de permisos:

rwx

Teniendo esto en cuenta, esa información quiere decir que la cuenta del usuario Ezequiel puede leer (r), escribir (w) y ejecutar (x) el archivo titulado “novela”.

Los permisos siempre vienen expresados en ese orden: leer, escribir y ejecutar. Por otro lado si uno de los permisos no fue otorgado, viene tachado con un guion .

Digamos que por ejemplo el resto del mundo puede leer el archivo «novela», no puede escribir en el, pero si pueden ejecutarlo. La información vendría expresada de este modo:

r – x

Entonces, si quiero seguir analizando, puedo volver a revisar los tres compartimientos.

terminé de analizar lo que vendría a ser (2). Pero puedo ver que en (3) grupos y en (4) esto del mundo tengo los mismos permisos.

r-x   r-x
(3)   (4)

r | lectura
| (no puede escribir o modificar)
x | permite ejecutar

Y con eso puedo cerrar el análisis de la información de un archivo analizado con el comando ls -l

Asignar permisos con el comando chmod

Los permisos los asignamos con el comando chmod.

chmod (opción) (permiso) (nombre del archivo o directorio)

Chmod me pide saber a qué cuenta voy a cambiarle los permisos. Después de esto quiere saber qué permisos voy a cambiar, y cuales son los archivos a los que voy a cambiárselos.

Para entender en que forma se usa este comando, voy a ver como puedo asignar los permisos utilizando números o letras.

Asignar permisos utilizando números

Ya conozco que hay tres permisos posibles: r (lectura), w (escritura), x (ejecutar).

Y puedo asignar esos permisos a tres tipos de cuentas posibles, clasificadas en: cuenta individual, por grupo y por resto del mundo.

Para entender permisos y derechos en Linux en otro nivel de complejidad, voy a asociar las letras (r, w , x) con números.

¿Por qué hacer esto? De ese modo voy a poder asignar los distintos permisos usando las siguientes combinaciones de números:

Núm.Permiso
0Ninguno
1Ejecutar (- – x)
2Escribir (- w -)
3Escribir y Ejecutar (r-x)
4Leer (r – -)
5Leer y Ejecutar (r – x)
6Leer y Escribir (r w -)
7Leer, Escribir y Ejecutar (r w x)

Puedo asignar permisos usado una combinación de cualquiera de estos tres números.

¿Por qué una combinación? Necesito elegir tres números, el primero para darle tres opciones a la cuenta individual, el segundo para darle opciones al grupo y el tercero para el resto del mundo.

Pensemos un ejemplo: quiero cambiar los permisos para el archivo novela que ya analicé anteriormente.

Para hacer esto voy a darle a la cuenta de usuario Ezequiel solamente los permisos de leer y escribir (combo de permisos número 6 en la tabla).

Y no quiero darle ningún permiso al grupo (permiso número 0 en la tabla) y solo la posibilidad de lectura al resto del mundo (permiso número 4 en la tabla).

La asignación de todo lo anterior expresado solo en el combo de números me queda:

704

Y el comando chmod me queda entonces escrito de la siguiente manera:

chmod 704 novela

Si ahora reviso el archivo novela con el comando ls -l encuentro la información de permisos expresada del siguiente modo:

r w x  - - -   - - x

El resultado refleja el cambio que terminé de hacer: todos los permisos para el usuario Ezequiel, ningún permiso para su grupo y permisos de ejecución para el resto del mundo.

Sabiendo esto, también otro modo de dar permisos y voy a pasar a resumirlo. Aunque en mi opinión el método de los números sigue siendo es el más práctico.

Asignar permisos utilizando el sistema de letras

Para usar este método, primero tengo que saber a qué categoría de cuentas le estoy modificando los permisos.

letraopción
ucuenta individual
ggrupo
oworld – resto del mundo)
atodas las opciones de arriba

En segundo lugar tengo que saber si estoy agregando, quitando o manteniendo permisos

signoopción
+añadir permiso
remover permiso
=mantener el permiso como estaba previamente

Y por supuesto, ya conozco los tipos de permisos que puedo asignar

r | lectura
w | escritura
x | ejecutar

En este momento voy a modificar los permisos del archivo novela. Para eso voy a quitarle al usuario Ezequiel el permiso de escribir. Inicialmente, en la anterior modificación, había conservado la posibilidad de leer, escribir y ejecutar.

Para conseguir ese efecto el comando me queda del siguiente modo:

chmod u-w novela

En este caso:

u representa a la cuenta individual. Conozco por los datos del comando ls -l que el usuario asociado al documento es Ezequiel.

el signo menos representa la remoción de un permiso.

w representa el permiso de escribir.

En principio eso seria todo… pero siempre hay algo más para entender permisos y derechos en Linux… ¿Cómo saber qué cuenta y qué grupo esta asociado a cada documento?

Conocer quién tiene la propiedad de un archivo

Vuelvo al ejemplo original.

Usando el comando:

ls -l novela

Me daba el resultado:

- rwx r-x r-x 1 ezequiel admins 76 2018-05-20 17:18  novela
1  2   3   4  5    6        7    8    9         10  (archivo)

Al fijarme en la columna (6), me dice a que cuenta individual pertenece el archivo. El nombre de lacuenta del propietario en este caso es Ezequiel.

La columna 7 me habla del grupo que tiene acceso al archivo, con esto vemos que el grupo llamado admins tiene acceso a este archivo.

Derechos de propiedad

Cada archivo o directorio puede ser accedido a la vez por un cuenta individual (en inglés user) o por un grupo, y los derechos de propiedad pueden ser asignados a diferentes personas o grupos.

Puedo conocer los derechos de propiedad de propiedad de una cuenta usando el comando:

id (nombre de la cuenta)

El comando identificación también va a decirnos a que grupos pertenece una cuenta.

Intercambiar la propiedad de un archivo o directorio | chown | chgrp

La propiedad de un archivo o directorio puede ser intercambiada. Para usar un ejemplo de esto anterior, la cuenta “Ezequiel” quiere dejar de tener la propiedad del archivo novela, para que la nueva propietaria sea la cuenta “Juliana”.

Eso lo consigo con el comando chown (change ownership o cambiar propiedad). Voy a realizar el cambio de propiedad.

chown Juliana novela

Nada más, la sintaxis es muy fácil.

Por otra parte, digamos que quiero que el grupo admins deje de tener acceso al documento. Quiero que el nuevo grupo con acceso sea ensayistas.

Utilizo ahora el comando chgrp (change group o cambiar grupo)

chgrp ensayistas novela

Queda un detalle más: puedo cambiar quien tiene la propiedad de un grupo usando el comando chown. Digamos que la propietaria del grupo ensayistas pasa a manos de Juliana.

El comando entonces es:

chown juliana:ensayistas novela

Por supuesto, cada uno de esos comandos tiene muchas pequeñas variaciones que estoy dejando de lado en favor de la brevedad. Con esto confió tener los recursos mínimos para poder administrar los permisos de cuentas, archivos y directorios.

Capítulo 3: cinco comandos básicos

Hay cinco comandos que me parece son básicos para empezar con la terminal de Linux: copiar, mover y borrar archivos, crear carpetas y alternar entre directorios.

Cuando utilizo la computadora hacemos centenas, miles, millones de acciones. Es cierto, tal vez exagero… pero igualmente son muchas acciones por sesión.

¿A qué me refiero por acciones? Bueno, abrir programas, dibujar, escuchar música, escribir, programar, navegar por la red y muchas cosas más. Cada una de esas actividades se puede dividir en muchas acciones más pequeñas

De todo eso tan complejo, hay un par de acciones básicas que se repiten casi sin que me demos cuenta. Por ejemplo, crear una carpeta o borrar un documento. Ocurre decenas de veces, ya sea que estemos escribiendo o surfeando internet.

Son pequeñas actividades que de tanto repetirse, es sencillo olvidar lo importante que son en el gran orden de cosas.

Hoy voy a repasar como se hacen cinco de esas acciones básicas a través de comandos en la terminal de Linux.

¿Por qué usar la terminal? Es una forma más practica, más directa si se quiere, que el método tradicional de interactuar con la computadora usado la interfaz gráfica.

Usando estos comandos, y combinándolos, puedo tratar de simplificar aun más trabajos que pueden resultar aburridos o repetitivos.

Crear carpetas/directorios con el comando “mkdir”

El comando que se utiliza para crear carpetas es mkdir (make directory, crear directorio).

Por ejemplo para hacer una carpeta llamada “cosas”:

mkdir cosas

Si no especificoun directorio, la carpeta se va a crear en el mismo espacio donde estoy trabajando (current directory). Por ejemplo, si la terminal se encuentra abierta en mi directorio personal, mkdir va a crear la carpeta allí.

Por eso puedo indicar otra dirección absoluta distinta si quiero, por ejemplo:

mkdir /home/gustavo/documentos/cosas

Ahora la carpeta “cosas” va a crearse en mi directorio personal, dentro de la carpeta documentos.

Si lo que necesito es una carpeta con un nombre largo, lo pongo entre comillas:

mkdir “cosas para no borrar”

Tengo la opción de crear más de una carpeta a la vez. Simplemente pongo los distintos nombres uno junto al otro, separados por un espacio:

mkdir cosas textos cuentas planillas

Incluso puedo crear al mismo tiempo diferentes carpetas con variaciones del mismo nombre, por ejemplo con distinto número al final:

mkdir cosas{01,02,03,04,05}

Con ese último ejemplo consigo crear cinco carpetas distintas llamadas “cosas”, cada una con un número diferente al final. Puedo elegir cualquier acompañamiento para que vaya junto al nombre.

Este último ejemplo demuestra de forma sencilla en que forma un comando puede convertir un trabajo tedioso, crear muchas carpetas, en algo sencillo.

Ahora voy a crear un directorio de múltiples niveles. Esto es, una nueva carpeta que dentro contenga una nueva carpeta, que a su vez contenga otra carpeta.

Me interesa crear la carpeta “cartas”, que dentro va a contener una carpeta llamada “agosto”, que va a contener en su interior la carpeta llamada “enviadas”. Para eso la opción -p (por parents directory) es la que tengo que usar:

mkdir -p /home/yo/cartas/agosto/enviadas

Ahora, si agrego la opción -v la terminal me va a decir que acciones acaba de completar.

mkdir -v textos

Por lo que me da una respuesta como: created directory ‘textos confirmando que el directorio fue creado.

Puedo agregar esta opción no importa cuantos directorios estoy creando, sirve más que nada para tener un control de lo que estoy haciendo. Incluso puedo agregarla junto a otras variables, como junto a -p para no tener que revisar directamente si se hizo o no el directorio.

Por otra parte puedo crear el directorio con opciones de seguridad distintas a las que vienen por defecto. Para eso utilizo la opción -m, agregando los números que representan los permisos que necesito.

mkdir -m771 cosas

Por ultimo, voy a borrar un directorio. Ya me estoy cansandp de la carpeta “cosas”, así que…

rmdir cosas

Pero eso comando solamente va a funcionar si el directorio que removemos se encuentra vacío.

¿Y si tengo que borrar cosas más complejas?

Para eso puedo usar el comando rm.

Borrar archivos y directorios con el comando “rm”

El comando rm es el que utilizo para remover directorios o archivos. La sintaxis común, para borrar uno o más documentos, es la siguiente:

rm novela

Puedo indicar más archivos, separando cada uno con un espacio.

rm novela ensayo.txt

O también puedo agregar un camino absoluto a otro directorio donde quiero remover algo:

rm /home/yo/Desktop/ensayo.txt

Ahora si quiero remover un directorio, como la anteriormente mencionada carpeta cosas, la opción que tengo que agregar es:

rm -r cosas

De otro modo, si no agrego el -r (recursive o recursivo) me va a decir que no puede borrar el archivo, porque se trata de un directorio que puede contener archivos en su interior.

Ahora, esto otro es lo más importante. Lo mejor es siempre agregar el prefijo -i para que el comando me pregunte una vez más si acepto borrar el archivo. Esta re pregunta puede ahorrarme muchos dolores de cabeza si estaba a punto de borrar el documento equivocado.

rm -r -i cosas

Puede pasar que un documento no permita que sea borrado. Si el directorio o el archivo esta protegido, tengo que agregar la opción -f para “forzar” su remoción del sistema:

rm -f -i archivo_seguro.txt

Con eso creo cubrir lo mínimo para remover archivos. Ahora, a ver ahora cómo moverlos.

“mv”: mover y cambiar el nombre de archivos y directorios

El comando mv es bastante versátil. Dependiendo en que modalidad sea usado, me permite hacer dos cosas diferentes:

  • mover archivos entre directorios.
  • cambiar el nombre de archivos y directorios.

Voy a empezar moviendo un archivo. Digamos que quiero mover un archivo a un directorio especifico. La sintaxis queda:

mv archivo directorio

Por ejemplo, para mover el archivo ensayo a mi carpeta llamada textos en el escritorio:

mv ensayo /home/escritorio/textos

El directorio tiene que existir, o el comando no va a dar resultados

Puedo especificar también el directorio donde se encuentra del documento seguido por el directorio que es nuestro destino.

mv /home/documentos/ensayo.txt /home/escritorio/textos

Esto ultimo me ayuda si la terminal no se encuentra aparcada en el mismo directorio del archivo que necesito mover.

Modificar el nombre de un archivo:

Ahora para modificar el nombre de un archivo. La sintaxis es:

mv archivo1 nombre2

En este caso el archivo llamado archivo1 pasa a llamarse nombre2.

Pero… ¡cuidado! Si el archivo nombre2 ya existe, al usar el comando anterior no solo su nombre va a cambiar. Su contenido va a ser reemplazado por el de archivo1.

Para que esto no ocurra, agrego la opción -i en el comando, de este modo el sistema va a preguntarme si quiero realmente sobre escribir el documento o no:

mv -i archivo1 nombre2

Lo mismo aplica para cambiar el nombre de directorios. Primero va el nombre original, incluyendo su camino, y luego el nombre modificado

mv /home/documentos/nombre_1   /home/documentos/nombre_2

Si el nombre del directorio no existe, el cambio se registra. Por supuesto si el nombre ya existe, el comando interpreta que estoy moviendo una carpeta dentro de la otra.

En nuestro caso, siguiendo el ejemplo, lo que ocurriría es que se mueve la carpeta nombre_1 al directorio nombre_2.

Cambiar directorio con el comando “cd”

El comando cd es el que se utilizas para movernos por el árbol de directorios de nuestro sistema de archivos.

Tal vez entre estos comandos básicos para la terminal de Linux este sea el más central, teniendo en cuenta que sin usarlo voy a quedarme siempre en la misma carpeta.

Dicho de otro modo, con el comando cd navegamos entre las distintas carpetas.

El uso más básico es el de escribirlo directamente en la consola:

cd

Usar cd de este modo me va a llevar siempre a mi directorio personal.

Pero digamos que quiero ir al escritorio en nuestro directorio personal, y nuestro nombre es… insecto. En ese caso hacemos:

cd /home/insecto/Desktop

También puedo hacerlo más sencillo. Si el directorio Desktop se encuentra en mi carpeta personal (y puedo averiguar que sea así con el comando ls) simplemente puedo escribir:

cd Desktop

Y listo, ya estoy en el directorio del escritorio.

Básicamente para moverte entre directorios, es necesario escribir el comando cd seguido por la dirección a la que voy a ir:

cd nombre del directorio

¿Por qué es importante saber como moverte por los directorios en la terminal?

Muchos comandos funcionan directamente sobre el directorio en el que me encuentro trabajando.

Por ejemplo, resulta mucho más intuitivo borrar un archivo específico si primero me muevo al directorio que contiene dicho archivo. Eso porque por lo general imita el mismo camino que al borrarlo con el ratón: ir hasta el archivo y eliminarlo.

Para moverme entonces utilizo el comando cd.

No siempre es necesario escribir todo el nombre del directorio al que voy a ir.

Digamos que necesito “ir hacia atrás”, retroceder solamente una carpeta. Escribo:

cd ..

Con esto “vuelvo” una carpeta hacia atrás. Digamos que si estabas en la dirección /home/yo/documentos/cosas volvés una carpeta hacia atrás hasta /home/yo/documentos.

¿Cómo saber en que directorio específico me encuentro?

Para eso tené la opción de usar el comando pwd:

pwd
/home/insecto

Tengo que recordar el atajo de auto completar. Si escribo las primeras letras de un directorio, pero hay varios similares, puedo la tecla Tab en el teclado. Ahora la terminal me va a mostrar las distintas variantes del nombre de la carpeta a la que puedo entrar.

El atajo de auto completar puede usarse para otras cosas, por ejemplo para escribir comandos más rápido.

Sin embargo no es la única opción. Desde la terminal puedo indicar la posición de un directorio. Aunque no siempre tengo que escribir la dirección completa.

Por ultimo, creo que es bueno repasar la diferencia entre caminos de directorio relativos y absolutas.

Dirección absoluta: cuando el camino comienza con la barra / (slash) indica que el mismo comienza desde el directorio. Se trata entonces de un “absolute path”, ejemplo:

/home/Gustavo/Desktop/cartas/marzo 

Dirección relativa: es cuando comienza sin la barra / (slash). Siendo más especifico, el relative path indica que el camino comienza en el directorio actual, aquel donde la terminal se encuentra abierta.

Viendo el ejemplo anterior, si me encuentro en el directorio “Desktop” el camino relativo para entrar en el directorio “marzo” es:

cartas/marzo  

Dicho de otra manera, puedo entrar la carpeta “marzo” desde el directorio “Desktop” usando el comando cd directamente:

cd cartas/marzo 

Copiar archivos y carpetas con el comando “cp”

En apariencia el comando cp (copy o copiar) es muy sencillo, con pocas opciones. Pero esas opciones se suman para conseguir una herramienta muy versátil.

En primera mediada utilizo este comando para copiar el contenido de un documento (por ejemplo un documento de texto) dentro de otro documento.

cp ensayo1 ensayo2

En el caso anterior, el texto del documento ensayo1 pasó a copiarse dentro de ensayo2.

Por otra parte, también puedo usar el comando para copiar documentos y pegarlos dentro de un directorio distinto.

cp archivo directorio de destino

Para hacer un ejemplo, en mi computadora voy a copiar el archivo ensayo1 y voy a pegarlo en mi escritorio:

cp ensayo1 /home/gustavo/Desktop

Si quiero copiar el contenido completo de un directorio hacia otro directorio que aun no existe, puedo crearlo agregando la opción -r (recursivo).

cp -r /home/gustavo/Desktop/cosas /home/gustavo/documentos/backup

En resumen la sintaxis general es:

cp “directorio de partida” archivo “directorio de llegada”

Otra vez, esto es muy importante. Al copiar cosas usando la terminal, me arriesgo a sobre escribir cosas sin darme cuenta. Por eso siempre es muy útil agregar la opción -i (de interactive o interactivo) para que la terminal me pida una confirmación extra antes de proceder.

Para repetir un ejemplo anterior, donde copiábamos el contenido de un archivo en otro, ahora me quedaría:

cp -i texto1 texto2

Sin dudarlo estoy dejando afuera otras opciones que pueden leerse en el manual de cp, pero solo con el objetivo de ajustarme a lo que considero mínimo.

Capítulo 4: apagar y reiniciar la computadora usando comandos

Apagar y reiniciar Linux desde la terminal es una de las primeras tareas que me puso en el camino de aprender a usar la linea de comandos.

¿Que puedo decir? Es sencillo de aprender y se puede empezar a usar inmediatamente.

Entonces…

¿Cómo apagar Linux por la linea de comandos?

Para usar estos comandos hay que contar con privilegios sudo de administración.

La sintaxis básica es:

shutdown (opción) (tiempo) (mensaje)

Si quiero apagar el equipo inmediatamente, puedo usar la opción -P y también la -h (es indistinto, aunque -P de “power” es más intuitiva, por decirlo de algún modo). Escribo:

sudo shutdown -P now

En este caso el tiempo que indico es now (ahora). Sin vueltas, la máquina se apaga.

Pero digamos que me gustaría tener algo más de tiempo, y apagar la computadora en 30 minutos. Entonces hacemos:

sudo shutdown -P 30

Si no agrego ninguna opción de tiempo, Linux interpreta que la acción va a llevarse adelante dentro de un minuto.

Por otra parte también es posible agregar una hora específica, en el formato de 24 horas (hh/mm). Digamos que mi intención es apagar la máquina a las 21:47 horas.

sudo shutdown -P 21:47

Cancelar la opción de apagar el sistema

Ya utilizo el comando para apagar la computadora dentro de treinta minutos. Pero me arrepentí y quiero cancelarlo. Puedo hacerlo agregando la opción -c en un nuevo comando:

sudo shutdown -c

Listo, con eso cancelo la orden de apagar que hice la primera vez.

Reiniciar Linux desde la terminal

El prefijo –r indica la opción de reiniciar el sistema.

sudo shutdown -r now

El sistema va a reiniciarse inmediatamente. Pero como antes, también puedo ponerle un tiempo determinado, según necesite.

Poner el sistema en modo halt

El modo halt… no puedo decir que lo utilicé personalmente, y es que no se trata de suspender el equipo.

Halt termina todos los procesos activos y detiene el cpu. Pero luego es necesario reiniciar o apagar manualmente la computadora para que vuelva a levantar. En todo caso, para saberlo:

sudo shutdown -H

Se puede ver que aunque con la opción -h conseguía apagar el sistema, se encuentra muy cerca de la opción -H. De hecho puedo tener el mismo efecto de entrar en modo halt si escribo:

sudo shutdown -halt

Por eso aunque puedo apagar la máquina tanto con el agregado de -P o el de -h, encuentro que el -P de “power” es más fácil de recordar.

Agregar un mensaje al comando shutdown

La opción de agregar un mensaje no es obligatoria. Aunque si hay otras personas usando el mismo sistema, puedo avisarles lo que estoy por hacer para que puedan prepararse. Ejemplo:

sudo shutdown -P 30 “El sistema va a apagarse en media hora”

Ahora se va a mostrar el aviso automático de los “treinta minutos restantes”, junto al mensaje extra.

Si quiero enviar un mensaje general, sin apagar la máquina, puedo agregar la opción -k

sudo shutdown -k 30 “Estoy pensando en apagar el sistema dentro de media hora

Ahora el mensaje se enviá, pero no se genera una orden efectiva para apagar.

Es bueno recordar que de manera automática, 5 minutos antes de que se apague el sistema, el mismo sistema genera una regla para evitar que otras cuentas ingresen su contraseña para usar el equipo.

Reiniciar Linux desde la terminal con el comando reboot

Hay otro comando para darle reinicios a la computadora. Su sintaxis es:

reboot (opción)

La principal diferencia que hay con el comando shutdown -r es que en el caso de halt no puedo especificar tiempo un tiempo para que lleve adelante la acción. Tiene un efecto siempre inmediato.

Entonces si quiero reiniciar la máquina al instante, hago:

sudo reboot 

Pero puedo agregar opciones. El prefijo -f fuerza el reinicio, en caso de que algún programa lo ralentice porque intenta tomarse unos segundos para guardar antes de cerrarse

reboot -f

Algo importante que tengo que recordar es que existen otros dos comandos parecidos a reboot, y que funcionan con argumentos similares.

Estos otros dos comandos son halt y poweroff. El primero detiene la máquina dejándola encendida, el segundo la apaga directamente.

¿Cómo funcionan? Para usar halt:

halt 

y para poweroff:

poweroff

Antes decía que usan argumentos similares. Por ejemplo, en todos los casos puedo usar la opción -f para que el sistema siga el comando independientemente de otros procesos en curso.

Y se pone más complejo. Por ejemplo, puedo reiniciar la máquina con el comando halt si lo acompaño de la opción – -reboot.

halt --reboot 

Puedo conocer cuales son las opciones que comparten los comandos halt, reboot y poweroff en la página de man del comando halt.

Capítulo 5: manipular texto desde la terminal

Voy a incluir algunos comandos para trabajar con texto en la terminal de Linux.

Un poco de todo: encontrar diferencias, eliminar palabras duplicadas, ese tipo de asuntos. Todo esto sirve más que nada para ganar tiempo de práctica, incluso sin son comandos que no utilizo casi nunca.

Comparar textos con el comando cmp

Este comando se encarga de contrastar dos archivos, comparando cada uno de ellos carácter por carácter. Dicho de otro modo, no va palabra por palabra o renglón por renglón. Lo hace byte por byte, incluyendo los espacios vacíos.

Esto de revisar “palabra por palabra” es bastante… minucioso. En un caso donde necesito que dos textos sean exactamente idénticos, esta herramienta es muy útil.

En su modo más básico, el comando va así:

cmp texto1 texto2

El resultado va a ser si los textos difieren o no, y en que carácter especifico son distintos.

Voy a probar con un ejemplo rápido, comparado los dos archivos de texto cuentoA y cuentoB. Primero veamos el contenido de cada archivo:

cat cuentoA

Este cuentoA
realmente es
Muy corto
 
cat cuentoB

Este cuentoB
realmente es
nuy corto

Y luego los comparamos

cmp cuentoA cuentoB

El resultado va a ser:

cuentoA cuentoB son distintos: byte 12, linea 1

Al tomarme el trabajo de contar, voy a ver que en el “espacio 12” de la “linea 1” hay una diferencia entre los dos textos. Pero… ¿cuál es esa diferencia?

Encontrar la diferencia exacta:

Para conocer exactamente que carácter es distinto, tengo que agregarle al comando la opción -c

cmp -c cuentoA cuentoB

cuentoA cuentoB son distintos: el byte 12, en la línea 1 es 101 A 102 B

Perfecto, esa es la diferencia. En el espacio 12 del primero documento hay una letra A y en el segundo una letra B.

Pero me esta faltando algo. Todo esto me dice que los dos archivos son distintos, pero no me dice más que la primera diferencia. Esta vez yo conozco que hay otra más.

Para ver una lista de diferencias completa, agrego la opción -l

cmp -c -l cuentoA cuentoB
12 101 A 102 B
27 115 M 155 m

Y esto me muestra la otra diferencia que me faltaba. En el byte 27, el primer documento tiene una M mayúscula y el segundo documento tiene una m minúscula.

Ya casi termino con este comando, que no tiene demasiadas opciones pero hace bastantes cosas. Me interesa detenerme en dos alternativas, que pueden servir para hacer su uso más fácil.

Si agrego el prefijo -s el comando no va a entregar ningún detalle. Si a esto le conecto:

;echo $?

El comando va a imprimir tres posibles resultados: 0 si los archivos son iguales, 1 si son diferentes y 2 si encuentra algún problema.

Voy a probarlo:

cmp -s CuentoA CuentoB; echo $?
1

La respuesta es 1 porque hay diferencias en la comparación. ¿Cuando puede darme un 2 por respuesta? Esto puede ocurrir por ejemplo cuando tengo un error al escribir el comando, si equivocando por ejemplo el nombre de alguno de los archivos.

En resumen, cmp (compare) es muy versátil y me estoy dejando algunas cosas afuera. Pero en estos primeros experimentos se puede ver su potencial.

Los muchos usos del comando cat

El comando cat quiere decir “catenate” o en castellano concatenar, que a su vez significa “unir, enlazar, relacionar una cosa con otra”.

Bastante apropiado, porque entre los usos de este comando es el de unir varios archivos juntos. Pero también sirve para otras cosas, como ver y crear documentos.

Cuando el tema es trabajar con texto en la terminal de Linux, este comando siempre aparece mencionado como uno de los fundamentales.

En su forma más básica, cat recibe texto y lo devuelve a la terminal.

Para hacer el experimento, usa el comando:

cat

Y escribo algo, cualquier cosa. Luego presiono enter, y la consola lo repite:

Escribí algo, cualquier cosa.
Escribí algo, cualquier cosa.

Para salir de este encierro, tengo que presionar Ctrl + d

Puedo usar esta habilidad para que cat “almacene” datos, cosa que puede ser muy valiosa al momento de programar en bash.

Digamos que quiero crear un nuevo documento llamada ejemplo1. Hago:

cat > ejemplo1
Esto se trata del ejemplo1.

Para cerrar presiono Ctrl + d. Ahora veo que si llamo:

cat ejemplo1

El comando me devuelve:

Esto se trata del ejemplo1.

Y a la vez, en el directorio de trabajo voy a encontrar el documento “ejemplo1”. Efectivamente hice el nuevo documento, con texto en su interior.

Pero también puede ver al mismo tiempo otra función de cat. Lo puedo usar para conocer el contenido escrito dentro de un archivo viéndolo directamente en la terminal. Puede ser más práctico para hacer una revisión rápida que abrir el documento en un editor de texto como nano.

Ahora voy a crear otro texto, siguiendo el mismo principio del anterior:

cat > ejemplo2
Y no puedo olvidarme nunca de agregar el ejemplo número dos.

puedo entonces empezar a concatenar con cat:

cat ejemplo1 ejemplo2
Esto se trata del ejemplo1.
Y no puedo olvidarme nunca de agregar el ejemplo número dos.

El comando me muestra el contenido de los dos archivos, como si fuera un texto único.

La cosa se pone aun más útil, ya entiendo que puedo redirigir el texto de un documento hacia un nuevo archivo, por medio del simbolo >

cat ejemplo1 ejemplo2 >ejemplo3.txt
cat ejemplo3.txt
Esto se trata del ejemplo1.
Y no puedo olvidarnos nunca de agregar el ejemplo dos.

Para cerrar, voy a modificar un archivo de texto con cat. Digamos que necesito agregarle una linea extra mi archivo “ejemplo3”.

cat >> ejemplo3
Casi me olvido de decir que este es el ejemplo 3.

Por medio de >> agrego la nueva linea dentro de nuestro texto. Voy a ver si todo fue bien:

cat ejemplo3
Esto se trata del ejemplo1.
Y no puedo olvidarnos nunca de agregar el ejemplo dos.
Casi me olvido de decir que este es el ejemplo 3.

De una forma rápida, cat también me permite agregar información en un archivo ya creado con anterioridad.

Otras opciones en cat:

El comando trae varias pequeñas opciones, por ejemplo -n numera todas las lineas del texto:

cat -n ejemplo3
1 Esto se trata del ejemplo1.
2 Y no puedo olvidarnos nunca de agregar el ejemplo dos.
3 Casi me olvido de decir te encontrás leyendo el ejemplo 3.

Estas son solo algunas de las funciones de cat. Como la mayoría de los comandos, cuanto más los combinamos con otros, más poderosos y complejos se vuelven.

Ordenar archivos con el comando sort:

En su uso más básico, el comando sort muestra el contenido de un archivo. Similar a lo que pasaba con cat, puedo usarlo para leer texto directamente en la terminal.

Volvamos al caso anterior:

sort ejemplo1
Esto se trata del ejemplo1.

Por otra parte, puedo utilizar sort para crear un documento. La diferencia es que este comando ordena el contenido del archivo, en orden alfabético o numérico.

sort >lista1
5
1
4
hola
ejemplo

Con esto hice el archivo “lista1” y le puse contenido. Ahora voy a ver el archivo en la terminal:

sort lista1
1
4
5
ejemplo
hola

El texto apareció ordenado: pero de menor a mayor y en orden alfabético.

Por seguro, también puedo usar sort para ver el contenido ordenado de archivos ya existentes.

Como siempre, este comando tiene varias opciones. Por ejemplo, agregar -r me presenta la lista en orden reverso:

sort -r lista1
hola
ejemplo
5
4
1

En resumen, sort me presenta varias formas de ordenar archivos. Su uso se hace evidente entonces cuando tengo que organizar información, por ejemplo una lista de precios del menor a mayor.

Eliminar duplicados con uniq:

El comando uniq es… único en su tipo. Por este tipo de cosas escribo pocos chistes.

Este comando es bastante directo. Le doy un archivo de texto, y cuando me lo devuelve elimina el contenido duplicado.

Por ejemplo, voy a revisar un archivo que acabo de crear llamado “dobles”:

cat dobles
hola
computadora
naranja
hola
computadora
pomelo
hola

Pero esto es muy importante: El comando uniq solo funciona cuando el texto que voy a revisar esta ordenado. Por eso primero utilizo sort antes de empezar a trabajar.

voy a crear un nuevo archivo a partir de la lista anterior, y voy a llamarlo dobles_ordenados:

sort dobles > dobles_ordenados

Al revisar el contenido del nuevo archivo, voy a encontrarlo ordenado:

cat dobles_ordenados
computadora
computadora
hola
hola
hola
naranja
pomelo

Y ahora si, digamos que quiero saber que palabras están más de una vez en la lista, y cuantas veces aparecen. Utilizo entonces el comando uniq acompañado de la opción -c

uniq -c dobles_ordenados
2 computadora
3 hola
1 naranja
1 pomelo

Para terminar, voy a crear una nueva lista ahora sin duplicados. voy a llamarla lista_simple

uniq dobles_ordenados > lista_simple

Y para ver el resultado:

cat lista_simple
computadora
hola
naranja
pomelo

Y ahí tengo una nueva lista, ordenada y sin entradas repetidas.

El comando sort puede ser muy útil para automatizar tareas mientras trabajo o estoy estudiando. Solamente tengo que tener creatividad para encontrar la forma de combinar los comandos para crear cosas más complejas.

Capítulo 6: cron, cronjob, crontab

¿Qué es cron?

Cron es una utilidad que sirve para crear rutinas dentro de la computadora. Me sirve para organizar y automatizar tareas.

Para esto tengo que definir tareas dentro del archivo cron (a veces aparece mencionado como cron table o también puedo encontrarlo como crontab). Con esto puedo predefinir la ejecución de diferentes acciones y actividades.

En resumen, lo que busco hacer es “agendar” la ejecución de comandos que van a realizarse cada cierto intervalo de tiempo.

Por ejemplo, reiniciar la máquina cada cuatro horas o hacer el respaldo de una carpeta determinada cada nueve días.

Empezar a usar Cron: abrir el archivo

Cada cuenta individual dentro del sistema tiene su propio crontab.

Lo que cada cuenta puede poner en este calendario/tabla depende de sus niveles de permiso. Como siempre, lo que puedo hacer o no depende de mis permiso de administración.

La mayoría de las distribuciones de GNU/Linux tiene cron dentro de su instalación. Si por algún motivo no lo encuentro, puedo revisar si falta algún paquete específico para su uso.

Para editar la tabla cron, el comando que necesito usar en la terminal es:

crontab -e

Lo más seguro es que, por defecto, el archivo crontab se va a abrir en el editor vim.

Pero si es la primera vez que utilizo el comando, Ubuntu va a preguntarme con que editor de texto quiero abrir el archivo:

Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.tiny
3. /bin/ed
Choose 1-3 [1]:

La opción 1, el editor nano, es la opción más sencilla.

Pero puedo elegir cualquier opción, siempre es posible cambiarla luego.

Comenzar con crontab

Entonces, utilizo:

crontab -e

Y se me abre un nuevo archivo en el procesador de texto.

Cuando me recibe, el documento tiene una buena muralla de texto explicando como funciona todo. Para resumirlo, lo importante es:

-cada tarea que predefino va a ocupar una nueva linea de texto.

-cada tarea programada tiene que estar escrita con una sintaxis específica.

¿Cómo escribir una entrada en crontab?

Cada tarea cron que ingreso en el archivo tiene básicamente 6 posibles partes:

MIN HOUR MDAY MON DOW COMMAND

¿Qué significa todo eso? Bueno, se ve así:

|min.| |hora| |día del mes| |mes| |día de la semana||comando|

Para planificar una actividad en el crontab, tengo que especificar el tiempo y el comando. Nada más.

Las posibles opciones de tiempo quedan así:

TiempoValor
MinutoEntre 0 y 60
hora [en formato de 24 horas]Entre 0 y 23
Día del mesEntre 1 y 31
MesVa entre 1 y 12
Día de la semana0-6 (0 representa domingo y así en adelante hasta el 6 que representa el sábado)

¿Qué comando puedo usar con estos intervalos? Puedo usar cualquier comando que funcione en la terminal. Pero no solo eso, también puedo indicar el directorio hacia un script de programación para que se ejecute automáticamente.

Voy a ver un ejemplo, tengo que recordar una vez más que el formato es:

|min.| |hora| |día del mes| |mes| |día de la semana||comando|

Entonces, si quiero que una acción ocurra de lunes a viernes, todas las noches a las 22:30 horas, la escribo como:

30 22 * * 1-5

¿Cómo leer esto?

30 indica treinta minutos. Sigue la hora, las 22.

Luego siguen dos asteriscos, porque no estoy marcando un periodo especifico de meses o días del mes.

El asterisco (*) es una wildcard que se usa para decir algo como “incluir todas las opciones”.

En este caso incluyo todos los meses del año, y todos los días del mes (o dicho de otro modo, ningún día específico), necesito el asterisco para denotarlo.

Luego sigue un intervalo, de 1-5. Como pude ver antes, el 0 representa al domingo y el 6 el sabado. Como quiero que la actividad ocurra del del lunes al viernes, utilizo números del 1 al 5.

El guion (–) se usa para marcar intervalos. En este caso el intervalo de uno a cinco.

¿Y cual es mi comando? Bueno, como no quiero ir a dormir tarde, voy a hacer que se apague la computadora con el comando shutdown.

30 22 * * 1-5 shutdown -h

Y listo, con eso tengo mi primera tarea programada dentro del archivo crontab.

Puedo pensar que en lugar de un comando, quiero ejecutar un script para bash escrito con anterioridad. El ejemplo anterior me quedaría algo así:

30 22 * * 1-5 /camino/directorio/script

Aunque bien pensado, también es cierto que puedo convertir ese script de bash en un comando agregándolo al commanth path. Al hacerlo, simplemente lo agrego al crontab igual que un comando regular.

¿Qué tareas tengo programas?

Para ver que tareas hay puestas en mi archivo crontab, agrego la opción -l en el comando:

crontab -l

Y voy a ver una lista detallada de las cosas que puse en agenda.

Otras cosas que puedo hacer con tab

Puedo usar la coma (,) para agregar varias opciones en cualquier categoría. Por ejemplo, si quiero ejecutar el programa (inventado) “recordatorio” los martes, viernes y domingo a las 9:00 de la mañana:

00 9 * * 2,5,0 recordatorio

Ahora digamos que necesito ejecutar ese script cada 25 minutos, siempre.

Para eso necesito usar la barra diagonal (/) que se usa para indicar un rango de repetición:

*/25 * * * * recordatorio.sh

El */25 indica “repetir en intervalos de 25 minutos”.

¿Cómo cambiar el programa con el que abro el crontab?

Digamos que el archivo se abre siempre con Vim (porque lo elegí la primera vez), y quiero pasarme a usar nano. Tengo que usar este comando al abrir crontab:

export VISUAL=nano; crontab -e

Y con eso le indico a la terminal que voy a abrir crontab con nano. Lo importante es que si no le especifico “crontab -e”, el cambio va a ser global.

Lo que ocurre es que VISUAL es una variable que interviene en varios programas a la vez.

Por otra parte, si quiero interesa que el cambio quede realmente guardado para nuevas instancias de cron, puedo escribiendo en la terminal:

export VISUAL=’nano -w’

Hay varias formas de elegir si vim o nano (u otro procesador de texto) abren un archivo, pero no quiero hacer más largo este apartado.

Si me interesa ver la variable que estoy modificando, puedo revisar el archivo bash_profile directamente buscando el archivo oculto:

~/.bash_profile

Ahí es donde encuentro la variable visual, puedo revisarlo más en profundidad.

Atajos en cron:

Para terminar, hay varios atajos que pueden usarse para hacer más fácil el organizar tareas en cron.

Son pequeñas sintaxis que ya representan un lapso de tiempo preestablecido, lo que me evita tener que ponerme a pensar “cómo escribo un año exacto”.

Por ejemplo si escribo @reboot en el lugar donde van los valores de tiempo, eso le indica a cron que la tarea tiene que ejecutarse cada vez que se reinicia el sistema.

Digamos que quiero ejecutar un script al reiniciar la computadora, hago:

@reboot ejemplo.sh

El resto de estos atajos es:

AtajoAcciónEquivalente en tiempo
@rebootEjecutar al reiniciar.Ninguno
@yearlyEjecutar una vez al año.0 0 1 1 *
@annuallyEjecutar una vez al año.0 0 1 1 *
@monthlyEjecutar una vez al mes.0 0 1 * *
@weeklyEjecutar una vez por semana.0 0 * * 0
@dailyEjecutar una vez al día.0 0 * * *
@midnightEjecutar una vez al día.0 0 * * *
@hourlyEjecutar una vez por hora.0 * * * *


Capitulo 7: instalar programas en GNU/Linux

Este capítulo es algo general. Las técnicas que reviso tal vez no funcionan en todas las distribuciones GNU/Linux (por ejemplo, las que no usen el comando apt para instalar paquetes).

Sin embargo, teniendo eso en cuenta, creo que cubren de formá mínima lo que se necesita saber para instalar un programa… o al menos para tener una idea de lo que hay que hacer en otras versiones del sistema operativo

Instalar usando el Centro de Software (Software Manager)

Posiblemente el método más rápido de todos.

En el menú principal de Ubuntu y Linux Mint (y seguramente también en otras distribuciones) voy a poder buscar el Centro de Software.

Se trata de una herramienta similar al Play Store de Android, donde voy a encontrar muchas aplicaciones listas para descargar e instalar en mi sistema operativo.

Extremadamente fácil, solamente busco lo que necesito y le doy click en “instalar”.

Todas estas aplicaciones están divididas por categorías, pero también puedo buscarlas por palabras clave. Es una gran forma de conocer nuevos programas.

El único problema de este método es que algunas aplicaciones a veces no cuentan con su última versión.

Pero eso se compensa porque las aplicaciones vienen acompañadas en la mayoría de los casos con comentarios del público. Y una calificación que le dan algunas de las personas que las descargan.

Así que voy a darme cuenta fácilmente cuando alguno de esos paquetes no es la última versión o no funciona del todo como promete.

En ese caso negativo, si la versión en el centro de software esta desactualizada, voy a tener que buscar el programa directamente en su web oficial.

Desde ahí voy a bajarte un archivo de instalación, y eso me lleva al siguiente punto…

Archivos «.exe», no esta vez

Tal vez este sea el detalle más relevante del tema: en GNU/Linux el software ejecutable no viene con una extensión .exe.

En Windows cuando necesitaba instalar un software, instintivamente buscaba el archivo con la extensión .exe y eso es porque sabia que ese es el archivo ejecutable.

Pero en Linux encuentro otra extensión diferente: La extensión “.deb”.

Esta extensión .deb representa a los archivos que pueden ser instalados. Es la extensión utilizada en los sistemas operativos basados en Debian (otra de las distribuciones de GNU/Linux).

Al utilizar Linux Mint o Ubuntu, también utilizo esta extensión. Al ir a la página web de un software y descargar la versión para Linux, voy a tener un archivo con esta extensión.

Darle doble click y listo, voy a empezar a instalar el programa.

Utilizar el Gestor de Paquetes Synaptic

Una opción similar a la que revisé antes del Centro de Software, pero ahora con el Synaptic Package Manager.

Para su uso puede encontrar dentro de las aplicaciones del sistema.

La ventaja es que los programas que voy a encontrar o buscar en el gestor de paquetes se encuentra bien actualizada, e incluso tal vez voy a encontrar algunos que no veía del otro modo.

La desventaja, si es que se puede llamar desventaja, es que es ligeramente más engorroso de usar.

Las aplicaciones vienen ordenadas en “paquetes”. Una vez que encuentro lo que estas buscando, marcá la tilde junto al nombre.

Luego le doy “aplicar” y todo tendría que estar funcionando bien para comenzar a instalarse.

Advance Packaging Tool

El comando apt representa la opción de usar la terminal de comandos para conseguir los programas y las aplicaciones que busco instalar.

El método de la terminal puede parecer complicado al principio, pero con un poco de práctica resulta fácil de llevar adelante.

El comando que voy a estar usando es apt, iniciales que están en lugar de Advance Packaging Tool. O en castellano algo así como la “herramienta avanzada para manejar paquetes”.

Cualquier error en la traducción es propio, claro.

No todas las versiones de GNU/Linux usan este administrador de paquetes. Pero si funciona en Ubuntu y en Linux Mint. En todo caso, siempre puedo revisar si funciona en otros sistemas en particular.

Mejor ahora voy a analizar cómo se utiliza el comando. Vale recordar, su utilización requiere tener privilegios SUDO.

Encontrar paquetes

Cuando quiero instalar un paquete a través de la linea de comando, en mi opinión lo más difícil es conocer el nombre exacto del paquete que estoy buscando.

Los siguientes dos comandos se encargan de solucionar ese aparente problema.

apt-cache search (nombre del paquete)

Con este comando puedo buscar paquetes. Los nombres admiten el uso tanto de mayúsculas como minúsculas.

Ejemplo. Digamos que quiero instalar GIMP, pero no conozco el nombre exacto del paquete.

Utilizo el comando:

apt-cache search GIMP

La consola me va a dar varios resultados relacionados con la búsqueda. Junto a cada resultado hay una breve explicación de lo que hace el software al que se refiere.

Reviso esos resultados y encuentro que uno es:

gimp - GNU Image Manipulation Program

Perfecto, justo lo que estaba necesitando. El paquete que busco se llama “gimp” sin mayúsculas. Es lo que quiero instalar.

Pero digamos que aun tengo algunas dudas. Después de todo no conozco exactamente lo que tiene ese paquete. En ese caso puedo usar el comando:

apt-cache show (nombre del paquete)

Eso me entrega información sobre un determinado paquete, como por ejemplo el tamaño de la instalación y una descripción de lo que hace.

Por ejemplo:

apt-cache show gimp

Eso me devuelve que gimp es un editor de imágenes para manipular fotos, crear dibujos y mucha más información para que me haga una idea precisa de lo que voy a instalar.

Cómo usar el comando apt para instalar paquetes

Para instalar programas utilizo el comando:

sudo apt install (nombre del paquete)

Siendo “(nombre del paquete)” el nombre exacto del software que quiero instalar.

Ejemplo:

sudo apt install gimp

Perfecto, con eso termino de instalar el programa de edición de imágenes GIMP

Un truco extra

Supongamos que quiero instalar varios paquetes que comienzan con el mismo nombre. En este punto también puedo agregar una “wildcard” utilizando un asterisco.

Digamos que escribí:

sudo apt install (nombre del paquete)*

En este caso el “*” indica que quiero instalar todos los paquetes que comienzan con ese nombre.

Ahora bien, con esos pocos comandos puedoo lo básico para encontrar e instalar un programa por medio de la terminal.

Pero hay bastante más. Estos otros ejemplos expanden las tareas que puedo llevar a cabo mediante variaciones del comando «apt«.

Remover paquetes

Ya conozco en que forma instalar, voy ahora a remover o desinstalar paquetes usando comandos.

sudo apt remove (nombre del paquete)

Menciono el paquete que necesito remover de nuestro sistema… y lo remueve.

sudo apt purge (nombre del paquete)

Vemos que agrego la opción purge . Esto hace que también se borren los archivos de configuración que el paquete generó en nuestro sistema.

Ejemplo, digamos que quiero quitar completamente el programa GIMP de mi equipo. Archivos de configuración incluidos. Utilizo entonces:

sudo apt purge gimp

Cómo usar el comando apt para actualizar los paquetes

Estos dos comando son importantes, tanto que se vuelven de uso cotidiano.

Ayudan a mantener el sistema al día respecto a las mejores de software (pequeñas o no) que constantemente van ocurriendo.

sudo apt update

Este comando hace una lectura del directorio /etc/apt/sources.list y luego actualiza los paquetes necesarios.

sudo apt upgrade

Por otra parte, el agregado de la opción upgrade al comando revisa los paquetes instalados, y se encarga de descargar lass actualizaciones que se necesiten. Hay que tener en cuenta que este comando no remueve paquetes y no agrega ninguno nuevo a los programas, solo actualiza los existentes.

Cómo usar el comando apt para aligerar el sistema

Estos otros comandos si son de uso más común. No es mala idea usarlos de vez en nuestra computadora de escritorio para que todo funcione de una manera fluida y sin sobresaltos.

sudo apt clean

Remueve paquetes que no están completos, y también información de paquetes que ya no están instalados.

sudo apt autoclean

Utilizar autoclean libera espacio en el disco vaciando el cache guardado de paquetes en el directorio “/var/cache/apt/archives”.

sudo apt autoremove

Esa última variación remueve paquetes secundarios que se agregaron como parte de la instalación de otros paquetes y que ahora ya no se necesitan.

Algunos otros usos interesantes para el comando apt

Puede ser que estos otros comandos no se utilicen muy seguidos, pero nunca esta de más conocerlos.

apt-cache pkgnames

me entrega una lista de los paquetes instalados en nuestro sistema operativo.

apt-config -v

Muestra información del Advance Packaging Tool que estoy usando en el sistema.

sudo apt-key list

Da una lista de las llaves gpg (gpg keys) de las que el sistema tiene información. Se trata de las “llaves” que traen algunos paquetes para confirmar su autenticidad y origen.

apt-cache stats

Muestra información cuantitativa de los paquetes instalados (cantidad de paquetes, por ejemplo).

apt-cache depends (nombre del paquete)

Este comando me muestra las dependencias de un paquete.

Las dependencias son los paquetes asociados al paquete que estoy buscando. Sin esas dependencias o “paquetes dependientes” ese software no podría funcionar correctamente.

La información depende directamente del paquete buscado, no importa si lo tengo o no instalado actualmente.

Por lo general mi espíritu es “poner el comando primero, lidiar con los problemas generados gratuitamente después”. Pero entiendo que lo mejor es leer pausadamente cada cosa, para ahorrarnos problemas inesperados luego.

Es el momento de revisar el tema de trabajar/administrar cuentas y grupos en Linux, en la forma de un breve apunte lo más conciso posible.

Si recién estas empezando a usar Linux, este tema puede ser algo aburrido. Puedo decirlo por experiencia.

No es que el tema sea aburrido en si mismo, eso depende de cada persona. Pero es aburrido de practicar, en especial si usas tu propia computadora y contás con la suerte de no tener que compartirla con nadie.

Ahora, si compartís tu máquina con alguien más… todo esto puede ser extremadamente útil.

Recordemos que las primeras computadoras eran equipos grandes y únicos, compartidos por muchas personas. Darle a cada quien una identificación especifica era una necesidad.

Como un bonus, administrar cuentas individuales y grupos es útil desde una perspectiva laboral. Si trabajás con Linux en un ámbito académico o profesional, son conocimientos que vas a usar para organizar el sistema.

Capítulo 8: creación y modificación de cuentas en GNU/Linux

Cuando establezco una nueva cuenta de usuario en Linux, hay una variedad de opciones que son definidas de manera automática. Son detalles preestablecidos. Por ejemplo: la duración típica para la validez de una contraseña, a menos que se especifique lo contrario, viene predefinida.

Esas condiciones están guardas en un archivo de configuración llamado login.defs, que se puede encontrar en el directorio /etc/.

Si no encuentro el archivo, puede ser que este oculto. Hago clic derecho en la carpeta y marco mostrar archivos ocultos.

Ese archivo contiene las configuraciones para los permisos que van a ser entregados al momento de crear un cuenta, y ese tipo de cosas.

Por ejemplo, ¿Va a crearse automáticamente el directorio personal de la cuenta? ¿Cuál es la mínima longitud de la contraseña?

Esa clase de detalles se puede encontrar y modificar en el archivo de configuración “login.defs”.

Lo importante es recordar eso, con privilegios de administración puedo intervenir este archivo para establecer las condiciones iniciales de cada cuenta.

¿Qué son los privilegios de administración?

Al instalar GNU/Linux, el sistema nos hace crear al menos una cuenta individual acompañada de una contraseña. Esta cuenta obtiene privilegio de “super user”.

Traducción: permisos para hacer cualquier modificación que se me ocurra en el equipo.

Ahora bien, no todas las cuentas tienen los permisos para llevar adelante cualquier acción. Se pueden compartir estos “súper permisos”. Como eso es mucho poder, pudiendo llevar a errores o destrucción, los súper permisos por lo general se limitan al nivel de la administración.

Ahorra bien, voy a tratar de explicar esto mejor con un ejemplo.

Pensemos en un caso. La computadora es utilizada solamente por una persona: yo mismo.

¿Quiero saber cuantas cuentas existe en el equipo en un momento determinado? Para eso utilizo el comando who (¿Quién?) y me dice que cuentas existen con sesión iniciada. También puedo usar el comando w (si, solamente w) para tener una lista más detallada de la misma información.

En todo caso, al correr who la terminal me dice que la cuenta “Gustavo” esta usando el equipo. Si mostrase alguna otra cuenta… empezaría a preocuparme.

En el directorio /etc puedo encontrar el archivo passwd. Si reviso es archivo, voy a encontrar que esta lleno de información… qué no tengo interés de interpretar en este momento. Esa información representan a muchas cuentas individuales.

¿No era que solamente tenia una única cuenta en el equipo? ¿Ya estoy preocupado? Según entiendo, la mayoría de esta cuentas son “pseudo cuentas” que el sistema crea para utilizad diferentes procesos. No se puede iniciar sesión con ellas, ni pueden realizar cambios en el equipo (al menos no cambios por fuera de su función original).

Lo que me interesa es que la primera de estas cuentas se llama root o “raiz”. Es la cuenta con mayor nivel de privilegios.

Entonces llega un punto donde quiero usar un comando que requiere privilegios de raíz o de “super cuenta”. Mi usuario “Gustavo” por lo regular no tiene esos privilegios, si los tuviera activados todo el tiempo me metería en problemas constantemente por mi falta de experiencia.

Lo que necesito es entregarme ocasionalmente permisos de raíz, solamente por algunos minutos hasta terminar la tarea que necesita de ese poder. Ahí es donde entra el comando sudo.

El comando sudo me permite delegar los súper permisos por un breve periodo de tiempo. Lo que hace es “ejecutar un comando como otra cuenta”. En este caso, estoy usando la cuenta “Gustavo” y voy a ejecutar un comando con el nivel de raiz.

Su uso en la terminal es básicamente:

sudo comando

Esto es sudo acompañado del nombre del comando que quiero ejecutar. Ejemplo:

sudo apt update 

La terminal luego me pide una contraseña. En este caso, es la contraseña original que establecí al instalar el sistema operativo: la contraseña de mi cuenta es la contraseña root.

Listo, conociendo es detalle de utilizar el comando sudo, ya conozco lo mínimo para habilitar la mayoría de los ejemplos que siguen.

Si tu sistema GNU/Linux no tiene el paquete sudo lo más seguro es que tenga un comando similar alternativo, o que te permita instalarlo por medio de la terminal.

Trabajar con cuentas individuales Linux

Para crear una cuenta (user) en un sistema operativo GNU/Linux, necesito utilizar en la terminal el comando useradd. Tengo que hacerlo con privilegios de raíz para que funcione, para lo que puedo agregar sudo al comando.

Digamos que quiero hacer una nueva cuenta llamada insecto. Si, el nombre va a ser insecto. Voy a la terminal y escribo:

sudo useradd -m insecto

El comando useradd crea la cuenta llamada insecto. Por otra parte, el parámetro -m crea un directorio personal para la cuenta.

En GNU/Linux cada persona tiene su propio directorio home (directorio personal). Por ejemplo, para la cuenta llamada insecto el directorio personal por defecto lo encuentro en /home/insecto.

Pero puedo crear una cuenta estableciendo su directorio personal en otro lugar si lo necesito. Para eso utilizo la variable -d al momento de crearlo.

Por ejemplo:

sudo useradd -d“/home/cuenta/insecto”insecto

En este caso tengo que incluir el camino de un directorio nuevo. El comando va a crear ese nuevo directorio asignándole el nombre y el nuevo lugar.

Agregar una “fecha de vencimiento” al crear una cuenta:

Tal vez quiero que la cuenta que estoy creando expire en una fecha determinada. Para eso agrego el parámetro -e cuando escribp el comando:

sudo useradd -m insecto -e “2060-02-17”

Dentro del comando agrego la fecha en la cual va a expirar la cuenta. El formato de esa fecha va en “año-mes-día”.

Por otra parte, si no asigno directamente este parámetro, la fecha de vencimiento va a ser la que esta definida en el archivo login.defs del que hablaba antes, ubicado en el directorio /etc/.

Asignar y modificar contraseñas

Cuando se crea una nueva cuenta, por defecto esta no tiene ninguna contraseña y la persona a la que se la asignamos no va a poder entrar.

Cuando establezco una cuenta, puedo asignarle un password si agrego al comando el parámetro -p.

En un ejemplo queda:

sudo useradd -m insecto -p “pass123456

¿Y si no asigno una contraseña desde el primer momento? Puede ser que olvidé ponerle un password.

No pasa nada, se le puede asignar una más tarde. Pero hay que asignar una primera contraseña siempre antes de compartir la cuenta, o la persona no va a poder entrar al sistema la primera vez que lo intente.

Modificar una contraseña para cuentas existentes

Solamente hay dos personas que pueden agregar o modificar una contraseña:

– la persona que es dueña de la cuenta

– alguien que tenga privilegios root dentro del sistema.

El comando para modificar un password o contraseña es

passwd

Por ejemplo, para modificar el password de la cuenta insecto hago:

sudo passwd insecto

Y el sistema me va a pedir que indique la nueva contraseña, y que la confirme.

Un detalle, es que cuando escriba la contraseña la terminal no va a mostrar nada. Me refiero a que aparece como si no estuviera ingresando ninguna contraseña, ni siquiera algo en su lugar como seria “*********”. Esto es para que nadie pueda ver cuan larga es la contraseña estoy ingresando.

Esta medida de seguridad aparece otras veces, por lo que no tengo que asustarme: aunque no tenga confirmación, realmente estoy ingresando la contraseña.

Eliminar cuentas individuales

Para borrar la cuenta de un usuario existe el comando userdel. El comando básico viene acompañado del parámetro -m.

Digamos por ejemplo que ahora quiero borrar el usuario que había creado para insecto. Completp ese trabajo de este modo:

sudo userdel -r insecto

Este comando va a borrar también el directorio que le había asignado a la cuenta con anterioridad, y también la casilla de correos que albergaba dentro del sistema.

Modificar las propiedades de una cuenta

Para esto se utiliza el comando

usermod

Puedo conocer los múltiples parámetros de este comando si escribo en la terminal:

usermod -help

Conociendo los parámetros puedo cubrir muchas tareas con este comando. Entre ellas puedo modificar el directorio personal de la cuenta, suspendela temporalmente, cambiar su fecha de vencimiento, ponerla dentro de grupos y varias cosas más que aun no tuve oportunidad de probar.

Como un ejemplo básico, puedo cambiar el nombre de una cuenta.

Digamos que quiero cambiar el nombre de insecto a uno más común, por ejemplo robot.

sudo usermod -l robot insecto

Agregar la opción -l al comando habilita la opción de hacer una modificación en el nombre.

Trabajar con grupos en Linux

En Linux un grupo es un conjunto de users o cuentas individuales. Los grupos se utilizan por ejemplo para establecer permisos de manera compartida.

Ya que tengo todo lo anterior dominado, voy a ver como crear grupos. Los comandos son bastante similares a los de las cuentas individuales. Mismos resultados, comandos ligeramente diferentes.

Crear un grupo

Pensemos por ejemplo que me interesa crear el grupo ensayos. Para esto utilizo el comando

sudo groupadd ensayos

Agregar cuentas al grupo

Ahora voy a agregar al usuario insecto al grupo ensayos. Escribo el comando:

sudo usermod -a -G ensayos insecto

En la sintaxis del comando anterior, la opción -a dice que estoy agregando a un usuario nuevo sin retirarlo de otro grupo. Y el acompañamiento de -G dice a que grupo lo estoy agregando, en este caso a ensayos.

Modificar un grupo

Los grupos puedo modificarlos con el comando groupmod. Puedo modificar la contraseña o el nombre del grupo por ejemplo, entre otras cosas.

Digamos que quiero cambiar el nombre de ensayos a practica. utilizo la opción -b.

sudo groupmod practica ensayos

Y con eso consigo modificar el nombre.

¿Cómo conocer los grupos existentes?

Encuentro la información de los grupos existentes en el directorio /etc/group

Alternativamente puedo ver la misma lista con el comando:

less /etc/group

¿Y si quiero saber a que grupo pertenece una cuenta específica?

Para eso utilizo el comando id. Por ejemplo, para conocer los grupos al que pertenece el usuario insecto:

id insecto

Eliminar grupos

Una vez más, el comando es muy similar al que se usa para eliminar cuentas individuales. Digamos que quiero borrar al grupo practica. En ese caso hacemos:

sudo groupdel practica

groupdel es el comando que utilizo para eliminar grupos.

Modificar la información de cuentas y grupos sin usar la terminal

En GNU/Linux hay varias maneras de hacer las cosas. Tal vez esta otra forma no sea la más fácil, o es que no tengo mucha práctica siguiéndola, en todo caso me pareció buena idea mencionarla.

Toda la información de las cuentas individuales puede encontrarse en el directorio /etc/passwd y la información de los grupos se almacena en el archivo ubicado en /etc/group.

Tengo la posibilidad de agregar o modificar información trabajando directamente sobre alguno de estos dos archivos según sea el caso.

Por ejemplo en /etc/passwd voy a encontrar la información de cada cuenta individual así:

insecto:x:1001:1001:insecto,,,:/home/insecto:/bin/bash

Lo anterior se puede leer de este modo (cada elemento esta separado por “:” dos puntos)

nombre:contraseña:UID:GID :directorio personal:directorio de la terminal

¿Por qué motivo la contraseña aparece marcada con una x?

Eso es porque la información de las contraseñas de las cuentas individuales se encuentra encriptada en la carpeta /etc/shadow y solo se puede ver mediante privilegios de root.

Alternativamente, la información encriptada de las contraseñas para los grupos la puedo encontrar en /etc/gshadow.

¿Qué significa el número UID?

Este número ID de identificación de cuenta o user ID (UID User Identifier) es usado internamente por Linux para anotar cada cuenta individual.

Algo así como el “documento de identidad”, tiene un nombre y un número especifico.

Lo mismo para GID (Group Identifier), es un número que identifica a cada grupo particular.

Cuando escribo comandos me refiero a cada cuenta individual por su nombre, por ejemplo ya conozco la cuenta “insecto”. Pero internamente el sistema también la reconoce por un UID. En este caso ese es el número 1001.

El número asignado para nuevas cuentas puede ser cualquier cifra a partir de 1000. Si hago una nueva cuenta, va a ser la 1001 y así en adelante. Cada cuenta nueva es un +1.

Por otra parte, el número para la cuenta root es el cero.

La misma explicación corre para el número ID del grupo o group ID. Es la forma interna que tiene el sistema de llevar la cuenta de un grupo.

¿Y la información de los grupos?

En /etc/group voy a encontrar la información de cada grupo de una forma parecida. Si la interpreto de forma separada puedo leer:

nombre del grupo:contraseña del grupo: Grupo ID: cuentas que lo integran

Entonces, ya conozco como modificar las cuentas en la terminal. Pero puedo hacer también las modificaciones en estos archivos de configuración y con algo de práctica llegar a los mismos resultados.

Aunque hay una multitud de pequeños parámetros para modificar, lo mínimo que creo necesario recordar son estros tres comandos principales al momento de trabajar con cuentas individuales:

useradd | Crea una nueva cuenta dentro del sistema.

userdel | Borra una cuenta existente en el sistema.

usermod | Modifica las opciones de una cuenta.

Y para trabajar grupos:

groupadd | Crea un nuevo grupo dentro del sistema.

groupdel | Borra un grupo existente en el sistema.

groupmod | Modifica los detalles de un grupo.

Como siempre, cualquier error que encuentren corre por mi cuenta. ¡No te olvides de mencionarlos en los comentarios!

Voy a seguir actualizando la información cuando aprenda cosas nuevas.

Capítulo 9: encontrar archivos en GNU/Linux

¿Cómo encontrar archivos desde la terminal?

Específicamente voy a concentrarme en aprender a usar dos comandos: locate y find.

El primero tal vez es el más fácil de aprender, aunque no es tan poderoso en sus posibilidades como lo es el segundo.

Comando locate (localizar) en linux

En este caso la búsqueda del archivo se hace dentro de un índice que el sistema crea. Se trata del index, una base de datos que marca el lugar donde cada archivo esta guardado.

Siendo que la búsqueda es en el índice, es muy rápida. Pero también es poco precisa, porque este comando no admite que especifiquemos en que carpeta o lugar del disco hacer la búsqueda.

La hace directamente leyendo todo el índice, buscando la dirección.

Por ejemplo:

locate -i -p nombredearchivo

Agregar la opción -i indica que mi búsqueda no esta limitada por el uso de mayúsculas o minúsculas. Es ideal para los casos donde no recuerdo específicamente como estaba escrito el nombre original.

La opción -p ignora la puntuación y los espacios en el nombre del archivo buscado.

El comando locate funciona bien como una opción de búsqueda rápida. Hay algunas otras pocas variaciones que puedo hacer en este tipo de búsqueda, pero no es mucho.

La terminal me devuelve el resultado de la busqueda, y nada más.

Siempre puedo ver rápidamente la pagina de ayuda del comando escribiendo:

locate -help

Si no tengo resultados usando el comando locate, tal vez es una buena idea actualizar el index/registro. En especial si el archivo que estoy buscando fue creado o movido de lugar muy recientemente.

Puedo actualizar la base de datos del índice con el comando:

sudo updatedb

El comando locate es útil. Pero no admite tantas variables de búsqueda como el otro comando que voy a revisar: find.

Comando find (buscar) en Linux (con ejemplos)

Find es otro comando que permite realizar búsquedas dentro de un sistema operativo GNU/Linux.

Es una herramienta muy versátil, y con un poco de práctica puede reemplazar la interfaz gráfica de búsqueda.

A través de find puedo buscar archivosen base a su nombre. Pero no solamente eso.

Con este comando también puedo especificar en que carpeta o camino hacer la búsqueda. Si no hago específico el lugar de la búsqueda, por defecto la misma se lleva a cabo en el directorio donde tengo “estacionada” la terminal en ese momento.

Más importante aun, ademas puedo especificar que acciones tomar con el resultado obtenido. Si no agrego otras opciones, por defecto solo me muestra el directorio de la búsqueda en la pantalla.

Pero no solo eso, es ultra versátil porque también me permite buscar centrándose en cosas como: el tipo de archivo, su tamaño, su última fecha de modificación, etc.

La búsqueda no se realiza en aquellas carpetas en las que no tengo permiso de acceso.

Cómo buscar archivos por nombre:

La sintaxis de este comando se ve, por ejemplo, de este modo:

find directorio -type f -iname título

Primero necesito especificar el camino al directorio donde quiero hacer la búsqueda.

Con la opción –type f indico el tipo de archivo que busco. La letra f quiere decir “archivos regulares”.

Para mi ejemplo voy a referirme solamente a los archivos regulares, como imágenes o textos. Siempre puedo ampliar el rango para que en el resultado se incluyan directorios, archivos especiales, etc. Por ejemplo la letra d representa “directorio”. Y puedo separar tipos de archivo con una coma, por ejemplo:

-type f,d 

El agregado del la opcion -iname indica que quiero realizar una búsqueda por nombre, y que no voy a hacer distinción entre mayúsculas y minúsculas.

En contraste usar la opción -name distingue entre las dos, y me demanda usar el nombre exacto para tener éxito.

Y por título… ese es el nombre del archivo que voy a buscar.

Entonces el comando funcionando en este ejemplo se puede leer:

find /home/carpeta -type f -iname “textoescrito.odt”

Cómo agregar acciones al comando find

Digamos que quiero encontrar un archivo, luego copiarlo y pegarlo en otra carpeta. Tendría que escribir lo siguiente:

find /home/gustavo/carpeta -type f -iname "textoescrito” -exec mv -v  {} /desktop/cosas/ \;

En la primera parte la terminal busca en la dirección /home/gustavo/carpeta un documento llamado «textoescrito”. Pero ahora con las acciones se pone interesante.

La opción -exec indica que quiero llevar a cabo una acción (ejecutar una acción) con el resultado de la búsqueda.

La opción mv se trata de la acción que voy a realizar. En este caso mover el archivo hacia otra carpeta.

El añadir -v (vervose) me muestra el resultado de la operación mover, una vez realizada.

Los corchetes {} (curly brackets) se refieren al resultado de la búsqueda, en nuestro caso el archivo llamado textoescrito.

El directorio /desktop/cosas/ es el nuevo destino que le voy a dar al documento que quiero mover.

Cierro el comando usando \; y es necesario para que la consola entienda que cierro el comando.

Listo, ahora no solo encuentro un archivo, sino que estoy haciendo nuevas acciones con el resultado. El tiempo de trabajo que puedo ahorrar bien merecen la pena.

Otro ejemplo, digamos que quiero encontrar y borrar un archivo rápidamente. Hago:

find /home/carpeta -type f -iname "textoescrito” -exec rm {} \;

Lo que agrego es:

-exec: ejecutar

Con rm: pido remover el archivo

{} es el resultado de la búsqueda.

Y \; cierra el comando.

O más rápido aun, puedo agregar la opción delete.

find /home/carpeta -type f -iname "textoescrito” -delete

Y listo. Hay que tener en cuenta que todo esto no se refiere solamente a carpetas o archivos individuales. Puedo usar el comando find para encontrar muchos archivos a la vez, y luego realizar diferentes acciones con ellos.

Capítulo 10: final del apunte

Con esto termina la guía mínima para empezar con la terminal de GNU/Linux.

Por su carácter de mínima, la guía deja mucho material afuera. Sin embargo considero que es suficiente… al menos porque tengo que poner el punto de cierre en alguna parte.

De todas maneras poco a poco voy modificando el texto, arreglando o expandiendo distintas cosas según encuentro que puedo mejorarlas

No esta de más volver a recordar que soy un principiante en el tema, escribo estos “apuntes impensados” para ayudarme a comprender mejor un tema que me resulta nuevo.

En lo que a mi respecta, aprendí mucho haciéndolo. Espero que la forma de presentar el material pueda también servirte de ayuda.

¿Te resultó de utilidad el texto? ¿Encontraste muchos errores? ¿Entendés que hay cosas que puedo mejorar? Quisiera escuchar tu opinión.

Te pido por favor que me envíes un correo electrónico o comentario para que pueda mejorar el texto.

La seguimos en el próximo apunte.

Recursos:

Los sitios web de estos recursos se encuentran en inglés. Siempre que es posible, intento leer las páginas en inglés para practicar ese idioma. De ese modo, aprendo dos cosas al mismo tiempo.

En todo caso, si tu sistema GNU/Linux es en Castellano, podes encontrar la mayoría de estos manuales en tu computadora.

Solamente es necesario abrir la terminal y escribir el man seguido del nombre del comando del que queremos conocer el manual. Por ejemplo:

man find

Página del «Proyecto de documentación de Linux» con información sobre el filesystem (en inglés)

Página man para el comando find (en inglés).

Sitio para el manual del comando locate (en inglés).

Sitio del manual para usar el comando apt-get (en ingles, para Ubuntu)

Una man page en inglés para el comando apt.

Una página del manual del comando apt en castellano.

Manual del comando useradd (en inglés)

Página man del comando passwd (en inglés).

Manual de comando userdel (en inglés).

Manual para el comando usermod (en inglés).

Sitio del manual para el comando groupadd (en inglés).

Manual del comando grupmod (en inglés).

Página del comando less (en inglés).

Sitio del manual para el comando id (en inglés).

Manual del comando groupdel (en inglés).

Sitio del editor de texto Nano

Página man del comando cmp (en inglés)

Sitio web del manual para el comando cat (en inglés)

Manual para el comando sort (en inglés)

Página man para el comando uniq (en inglés)

Página man del comando mkdir (en inglés).

Manual para el comando rm (en inglés).

Sitio web con el manual para el comando mv (en inglés).

Página de ayuda sobre el comando cd (en inglés).

Página man del comando cp (en inglés).

Página man para el comando shutdown (en inglés)

Sitio man para el comando halt (en inglés)

Dejar una respuesta