Linux Professional Institute Learning Logo.
Pasar al contenido principal
  • Inicio
    • Todos los recursos
    • LPI Learning Materials
    • Conviértete en colaborador
    • Publishing Partners
    • Conviértase en un Publishing Partner
    • Acerca de nosotros
    • FAQ
    • Colaboradores
    • Contáctenos
  • LPI.org
105.1 Lección 1
Tema 105: Shells y scripts
105.1 Customize and use the shell environment
  • 105.1 Lección 1
  • 105.1 Lección 2
  • 105.1 Lección 3
105.2 Personalización y escritura de scripts sencillos
  • 105.2 Lección 1
  • 105.2 Lección 2
Tema 106: Interfaces de usuario y escritorios
106.1 Instalar y configurar X11
  • 106.1 Lección 1
106.2 Escritorios gráficos
  • 106.2 Lección 1
106.3 Accesibilidad
  • 106.3 Lección 1
Tema 107: Tareas administrativas
107.1 Administrar cuentas de usuario y de grupo y los archivos de sistema relacionados con ellas
  • 107.1 Lección 1
  • 107.1 Lección 2
107.2 Automatizar tareas administrativas del sistema mediante la programación de trabajos
  • 107.2 Lección 1
  • 107.2 Lección 2
107.3 Localización e internacionalización
  • 107.3 Lección 1
Tema 108: Servicios esenciales del sistema
108.1 Mantener la hora del sistema
  • 108.1 Lección 1
  • 108.1 Lección 2
108.2 Registros del sistema
  • 108.2 Lección 1
  • 108.2 Lección 2
108.3 Conceptos básicos del Agente de Transferencia de Correo
  • 108.3 Lección 1
108.4 Gestión de la impresión y de las impresoras
  • 108.4 Lección 1
Tema 109: Fundamentos de redes
109.1 Fundamentos de los protocolos de Internet
  • Muy pronto...
109.2 Configuración de red persistente
  • Muy pronto...
109.3 Resolución de problemas básicos de red
  • Muy pronto...
109.4 Configuración DNS en el lado del cliente
  • Muy pronto...
Tema 110: Seguridad
110.1 Tareas de administración de seguridad
  • Muy pronto...
110.2 Configuración de la seguridad del sistema
  • Muy pronto...
110.3 Protección de datos mediante cifrado
  • Muy pronto...
  1. Tema 105: Shells y scripts
  2. 105.1 Customize and use the shell environment
  3. 105.1 Lección 1

105.1 Lección 1

Certificación:

LPIC-1

Versión:

5.0

Tema:

105 Shells y shell scripting

Objetivo:

105.1 Personalizando y utilizando el entorno de shell

Lección:

3 de 3

Introducción

El shell es posiblemente la herramienta más poderosa en un sistema operativo Linux y puede definirse como una interfaz entre el usuario y el kernel. Tiene la función de Interpretar los comandos introducidos por el usuario, por lo tanto, los administradores de sistemas deben ser hábiles en su uso. Como probablemente sabemos, el Bourne Again Shell (Bash) es el shell de facto de la gran mayoría de las distribuciones de Linux.

El momento que el sistema operativo inicia, lo primero que el Bash (o cualquier otro shell) realiza, es ejecutar una serie de scripts de inicio. Estos scripts personalizan el entorno de sesión. Existen varios scripts para todo el sistema operativo, asi también para usuarios específicos. En estos scripts podemos elegir las preferencias o configuraciones que mejor se adapten a las necesidades de nuestros usuarios en forma de variables, alias y funciones.

La serie exacta de archivos de inicio depende de un parámetro muy importante: El tipo de shell. Echemos un vistazo a la variedad de shell que existen.

Tipos de shell: Interactivo vs. No Interactivo y Inicio de sesión vs Sin inicio de sesión

Comencemos aclarando los conceptos de interactivo e inicio de sesión en el contexto de shells:

Shells interactivos / no interactivos

Este tipo de shell se refiere a la intercomunicación entre el usuario y el shell: Mediante el teclado el usuario proporciona la entrada digitando comandos en la terminal y su vez el shell proporciona la salida imprimiendo mensajes en la pantalla.

Shells de inicio de sesión / Sin inicio de sesión

Este tipo de shell se refiere al evento de un usuario cuando accede a un sistema informático por medio sus credenciales, como el nombre de usuario y la contraseña.

Tanto los shells interactivos como los no interactivos pueden ser de inicio de sesión o sin inicio de sesión y cualquier combinación posible de estos tipos tiene sus usos específicos.

shells Interactivo de inicio de sesión se ejecutan cuando los usuarios se conectan al sistema y se utilizan para personalizar las configuraciones de los usuarios según sus necesidades. Un buen ejemplo de este tipo de shell, sería el de un grupo de usuarios que pertenecen al mismo departamento y necesitan un conjunto de variables determinadas en sus sesiones.

Para shells Interactivos sin inicio de sesión nos referimos a cualquier otro shell abierto por el usuario después de entrar en el sistema. Los usuarios utilizan estos shells durante las sesiones para llevar a cabo tareas administrativas y de mantenimiento como la configuración de variables, el tiempo, la copia de archivos, crear scripts, etc.

Por otro lado, los shells no interactivos no requieren ningún tipo de interacción humana. Por lo tanto, estos shells no solicitan al usuario una entrada y su salida — si la hubiera — será escrita en un registro (en la mayoría de los casos).

Los shells de inicio de sesión no interactivos son bastante raros y poco prácticos. Sus usos son virtualmente inexistentes y sólo los comentaremos para comprender su comportamiento. Algunos ejemplos extraños incluyen forzar un script a ser ejecutado desde un shell de inicio de sesión con /bin/bash --login <some_script> o canalizar la salida estándar (stdout) de un comando a la entrada estándar (stdin) de una conexión ssh:

<some_command> | ssh <some_user>@<some_server>

En cuanto el shell interactivo sin inicio de sesión no hay interacción ni login en nombre del usuario, por lo que aquí nos referimos al uso de scripts automatizados. Estos scripts se utilizan principalmente para llevar a cabo tareas administrativas y de mantenimiento repetitivas como las incluidas en los cronjobs. En algunos casos, bash no lee ningún archivo de inicio.

Iniciando una terminal

Cuando estamos en un entorno de escritorio, podemos abrir una terminal o cambiar a una de las consolas del sistema. Por lo tanto, un nuevo shell es un pts cuando se abre desde un emulador de terminal en el GUI o una tty cuando se ejecuta desde una consola de sistema. En el primer caso no se trata de una terminal sino de un emulador de terminales. Como parte de las sesiones gráficas, los emuladores de terminales como gnome-terminal o konsole son muy amplios en características y fáciles de usar en comparación con las terminales de interfaz de usuario basadas en texto. Los emuladores de terminal menos extenso en características incluyen — entre otros — XTerm y sakura.

Usando las teclas Ctrl+Alt+F1-F6 podemos ir a los inicios de sesión de la consola que abren un shell de inicio de sesión interactivo basado en texto y la combinación de Ctrl+Alt+F7 llevará la sesión de vuelta al escritorio.

Note

tty significa "teletypewritter"; pts significa "pseudo terminal slave". Para más información: man tty y man pts.

Ejecutando shells con bash

Después de iniciar sesión, escribe bash en una terminal para abrir un nuevo shell. Técnicamente, este shell es un proceso hijo del shell actual.

Al iniciar el proceso hijo de bash, podemos especificar varias opciones para definir qué tipo de shell queremos iniciar. Aquí hay algunas importantes a la hora invocarlo:

bash -l o bash --login

Invocará un shell de inicio de sesión.

bash -i

Invocará un shell interactivo.

bash --noprofile

Con shell de inicio de sesión ignorará tanto el archivo de inicio de todo el sistema /etc/profile como los archivos de inicio a nivel de usuario ~/.bash_profile, ~/.bash_login y ~/.profile.

bash --norc

Con shell interactivo ignorará tanto el archivo de inicio del sistema /etc/bash.bashrc como el archivo de inicio a nivel de usuario ~/.bashrc.

bash --rcfile <file>

Con shell interactivo tomará <file> como el archivo de inicio ignorando a nivel de sistema etc/bash.bashrc y a nivel de usuario ~/.bashrc.

Discutiremos los diferentes archivos de inicio a continuación.

Ejecutando shells con su y sudo

A través del uso de estos dos programas (similares) podemos obtener tipos específicos de shells:

su

Cambia el ID de usuario o lo convierte en superusuario (root). Con este comando podemos invocar ambos shells, el de inicio de sesión y sin inicio de sesión:

  • su - user2, su -l user2 o su --login user2 iniciará un shell de inicio de sesión interactivo como user2.

  • su user2 iniciará un shell interactivo y sin inicio de sesión como user2.

  • su - root o su - iniciará un shell de inicio de sesión interactivo como root.

  • su root o su iniciará un shell interactivo y sin inicio de sesión como root.

sudo

Ejecuta comandos como otro usuario (incluyendo el superusuario). Debido a que este comando se usa principalmente para obtener privilegios temporales de root, el usuario que lo use debe estar en el archivo sudoers. Para añadir usuarios a sudoers necesitamos convertirnos en root y luego ejecutar:

root@debian:~# usermod -aG sudo user2

Así como su, sudo nos permite invocar tanto los shells de inicio de sesión como los de no de inicio de sesión:

  • sudo su - user2, sudo su -l user2 o sudo su --login user2 iniciará un shell de inicio de sesión interactivo como user2.

  • sudo su user2 iniciará un shell interactivo sin inicio de sesión como user2.

  • sudo -u user2 -s iniciará un shell interactivo sin inicio de sesión como user2.

  • sudo su - root or sudo su - iniciará un shell de inicio de sesión interactivo como root.

  • sudo -i iniciará un shell de inicio de sesión interactivo como root.

  • sudo -i <some_command> iniciará un shell de inicio de sesión interactivo como root, ejecuta el comando y volverá al usuario original.

  • sudo su root or sudo su iniciará un shell interactivo sin inicio de sesión como root.

  • sudo -s or sudo -u root -s iniciará un shell sin inicio de sesión como`root`.

Cuando se usa su o sudo, es importante considerar el inicio de un nuevo shell y preguntarnos: ¿Necesitamos el entorno del usuario o no? Si es así, usaríamos las opciones que invocan las shells de inicio de sesión; si no, las que invocan sin inicio de sesión.

¿Qué tipo de shell tenemos?

Para saber en qué tipo de shell estamos trabajando, podemos escribir echo $0 en la terminal y obtener la siguiente salida:

Inicio de sesión interactivo

-bash or -su

Sin inicio de sesión interactivo

bash or /bin/bash

Sin inicio de sesión no interactivo (scripts)

<name_of_script>

¿Cuántas shell tenemos?

Para observar cuántos bash shells tenemos en ejecutando en el sistema, podemos usar el comando ps aux | grep bash:

user2@debian:~$ ps aux | grep bash
user2       5270  0.1  0.1  25532  5664 pts/0    Ss   23:03   0:00 bash
user2       5411  0.3  0.1  25608  5268 tty1     S+   23:03   0:00 -bash
user2       5452  0.0  0.0  16760   940 pts/0    S+   23:04   0:00 grep --color=auto bash

El user2 en debian ha entrado en una sesión de GUI (Sistema de Ventanas X o en ingles: X Window System) y ha abierto gnome-terminal, luego ha pulsado Ctrl+Alt+F1 para entrar en una sesión terminal tty. Finalmente, ha vuelto a la sesión del GUI presionando Ctrl+Alt+F7 y ha escrito el comando ps aux | grep bash. De esta manera, la salida muestra un shell interactivo sin inicio de sesión a través del emulador de terminal (pts/0) y un shell de inicio de sesión interactivo a través de la propia terminal basada en texto (tty1). Note también como el último campo de cada línea (el comando) es bash para el primero y -bash para el segundo.

¿De donde shell obtiene la configuración: Archivos de inicio?

Ahora que conocemos los tipos de shell que podemos encontrar en un sistema Linux, ya es hora de que veamos qué archivos de inicio son ejecutados por shell. Nóte que los scripts de todo el sistema o globales se colocan en el directorio /etc/, mientras que los locales o de nivel de usuario se encuentran en el directorio "home" del usuario (~). Además, cuando hay más de un archivo que buscar, y una vez que ellos es encontrado y ejecutado, los otros serán ignorados. Explora y estudia estos archivos con tu editor de texto favorito o escribiendo less <fichero_de_inicio>.

Note

Los archivos de inicio se pueden dividir en Bash específicos (los que se limitan sólo a las configuraciones y comandos bash) y generales (relacionados con la mayoría de los shells).

Shell interactivo de inicio de sesión
Nivel Global
/etc/profile

Este es el archivo .profile de todo el sistema para el shell Bourne y los shells compatibles con Bourne (Incluido bash). A través de una serie de declaraciones if este archivo establece un número de variables como PATH y PS1, así como origen — si existe — tanto del archivo /etc/bash.bashrc como los del directorio /etc/profile.d.

/etc/profile.d/*

Este directorio puede contener scripts que son ejecutados por /etc/profile.

Nivel Local
~/.bash_profile

Este archivo específico de Bash se utiliza para configurar el entorno del usuario. También puede ser usado para crear el ~/.bash_login y ~/.profile.

~/.bash_login

Este archivo (específicamente), sólo se ejecutará si no hay un archivo ~/.bash_profile. Su nombre sugiere que debería ser usado para ejecutar los comandos necesarios para el inicio de sesión.

~/.profile

Este archivo no es específico de Bash y se obtiene sólo si no existe ~/.bash_profile ni ~/.bash_login, que es lo que normalmente ocurre. Por lo tanto, el propósito principal de ~/.profile es el de revisar si se está ejecutando un shell de Bash, y si fuese afirmativo, obtener ~/.bashrc (si existe). Normalmente establece la variable PATH para que incluya el directorio privado del usuario ~/bin (si existe).

~/.bash_logout

Si existe, este archivo específico de Bash hace algunas operaciones de limpieza al salir del shell. Esto puede ser conveniente en casos como los de las sesiones remotas.

Exploración de los archivos de configuración de bash de inicio de sesión interactivo

Mostramos algunos de estos archivos en acción modificando /etc/profile y /home/user2/.profile. Añadiremos a cada uno una línea que nos recuerde el archivo que se está ejecutando:

root@debian:~# echo 'echo Hello from /etc/profile' >> /etc/profile
root@debian:~# echo 'echo Hello from ~/.profile' >> ~/.profile
Note

Dos operadores de redirección >> añaden la salida de un comando a un archivo existente, sin sobrescribirlo. Sin embargo, si el archivo no existe, será creado.

Por lo tanto, a través de la salida de sus respectivos comandos echo sabremos cuando uno de estos archivos es leído y ejecutado. Para probarlo, veamos qué pasa cuando user2 se conecta vía ssh desde otra máquina:

user2@debian:~$ ssh user2@192.168.1.6
user2@192.168.1.6's password:
Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64

Los programas incluidos en el sistema Debian GNU/Linux son software libre; los términos exactos de distribución de cada programa se describen en archivos individuales en /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Nov 27 19:57:19 2018 from 192.168.1.10
Hello from /etc/profile
Hello from /home/user2/.profile

Como se observan en las dos últimas líneas, funcionó. Además, note tres cosas:

  • El archivo global se ejecutó primero.

  • No había archivos .bash_profile o .bash_login en el directorio "home" de user2.

  • La tilde (~) se expandió a la ruta absoluta del archivo (/home/user2/.profile).

Shell Interactivo sin inicio de sesión
Nivel Global
/etc/bash.bashrc

Este es el archivo .bashrc de todo el sistema para los shells interactivos bash. A través de su ejecución, bash se asegura de que se está ejecutando interactivamente, comprueba el tamaño de la ventana después de cada comando (actualizando los valores de LÍNEAS y COLUMNAS, si es necesario) y establece algunas variables.

Nivel Local
~/.bashrc

Además de llevar a cabo tareas similares a las descritas para /etc/bash.bashrc a nivel de usuario (como comprobar el tamaño de la ventana o si se está ejecutando de forma interactiva), este archivo específico de Bash suele establecer algunas variables de historial y origen ~/.bash_aliases (si existe). Aparte de eso, este archivo se utiliza normalmente para almacenar alias y funciones específicas de los usuarios.

Asimismo, también vale la pena señalar que ~/.bashrc se lee si bash detecta que su <stdin> es una conexión de red (como en ejemplo de la conexión Secure Shell (SSH)).

Exploración de los archivos de configuración de shell no Interactivo y de inicio de sesión

Modifiquemos ahora /etc/bash.bashrc y /home/user2/.bashrc:

root@debian:~# echo 'echo Hello from /etc/bash.bashrc' >> /etc/bash.bashrc
root@debian:~# echo 'echo Hello from ~/.bashrc' >> ~/.bashrc

Y esto es lo que sucede cuando user2 comienza un nuevo shell:

user2@debian:~$ bash
Hello from /etc/bash.bashrc
Hello from /home/user2/.bashrc

De nuevo, los dos archivos fueron leídos y ejecutados.

Warning

Recuerde, debido al orden en que se ejecutan los archivos, los archivos locales tienen prioridad sobre los globales.

Shell no Interactivo de inicio de sesión

Un shell no interactivo con las opciones -l o --login es forzado a comportarse como un shell de inicio de sesión y así los archivos de inicio a ser ejecutados serán los mismos que los de los shells de inicio de sesión interactivos.

Para probarlo, escribamos un simple script y hagámoslo ejecutable. No incluiremos ningún shebangs porque invocaremos el ejecutable bash (/bin/bash con la opción de inicio de sesión) desde la línea de comandos.

  1. Creamos el script test.sh que contiene la línea echo 'Hello from a script' para que podamos probar que el script se ejecuta con éxito:

    user2@debian:~$ echo "echo 'Hello from a script'" > test.sh
  2. Hacemos que nuestro script sea ejecutable:

    user2@debian:~$ chmod +x ./test.sh
  3. Finalmente, invocamos a bash con la opción l para ejecutar el script:

    user2@debian:~$ bash -l ./test.sh
    Hello from /etc/profile
    Hello from /home/user2/.profile
    Hello from a script

    ¡Funciona! Antes de ejecutar el script, el login tuvo lugar y tanto el /etc/profile como el ~/.profile fueron ejecutados.

Note

Aprenderemos sobre shebangs y todos los demás aspectos del shell scripting en futuras lecciones.

Tengamos ahora la salida estándar (stdout) del comando echo en la entrada estándar (stdin) de una conexión ssh por medio de un pipe (|):

user2@debian:~$ echo "Hello-from-a-noninteractive-login-shell" | ssh user2@192.168.1.6
Pseudo-terminal will not be allocated because stdin is not a terminal.
user2@192.168.1.6's password:
Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64

Los programas incluidos en el sistema Debian GNU/Linux son software libre; los términos exactos de distribución de cada programa se describen en archivos individuales en /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Hello from /etc/profile
Hello from /home/user2/.profile
-bash: line 1: Hello-from-a-noninteractive-login-shell: command not found

Una vez más, /etc/profile y ~/.profile se ejecutan. Aparte de eso, la primera y la última línea de la salida son bastante reveladoras en lo que respecta al comportamiento de shell. ===== Shell no Interactivo sin inicio de sesión Los scripts no leen ninguno de los archivos listados arriba, pero buscan la variable de entorno BASH_ENV que expanden su valor si es necesario y la usan como el nombre de un archivo de inicio para leer y ejecutar comandos. Aprenderemos más sobre las variables de entorno en la próxima lección.

Como se mencionó anteriormente, típicamente /etc/profile y ~/.profile se aseguran de que tanto /etc/bash.bashrc como ~/.bashrc se ejecuten después de un inicio de sesión exitoso. La salida del siguiente comando muestra este fenómeno:

root@debian:~# su - user2
Hello from /etc/bash.bashrc
Hello from /etc/profile
Hello from /home/user2/.bashrc
Hello from /home/user2/.profile

Teniendo en cuenta las líneas que hemos añadido previamente a los scripts de inicio e invocando un shell de inicio de sesión interactivo a nivel de usuario con su - user2 las cuatro líneas de salida pueden explicarse de la siguiente manera:

  1. Hello from /etc/bash.bashrc significa /etc/profile se ha obtenido /etc/bash.bashrc.

  2. Hello from /etc/profile significa /etc/profile ha sido completamente leído y ejecutado.

  3. Hello from /home/user2/.bashrc significa ~/.profile se ha obtenido ~/.bashrc.

  4. Hello from /home/user2/.profile significa ~/.profile ha sido completamente leído y ejecutado.

Note en como con su - <nombre de usuario> (también su -l <nombre de usuario> y su --login <nombre de usuario>) garantizamos la invocación de un shell de acceso, mientras que su <nombre de usuario> sólo habría invocado /etc/bash.bashrc y ~/.bashrc.

Archivos fuentes

En las secciones anteriores hemos discutido que algunos scripts de inicio incluyen o ejecutan otros scripts. Este mecanismo se llama "sourcing" y se explica en esta sección.

Ejecutando archivos con .

El punto (.) se encuentra normalmente en los archivos de inicio.

En el archivo .profile de nuestro servidor de Debian podemos encontrar un ejemplo en el siguiente bloque:

    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi

Hemos observado cómo la ejecución de un script puede llevar a la de otro. Así la declaración if garantiza que el archivo $HOME/.bashrc — si existe (-f) — se obtendrá (es decir, se leerá y se ejecutará) en el inicio de sesión:

. "$HOME/.bashrc"
Note

Como aprenderemos en la próxima lección, $HOME es una variable de entorno que se expande a la ruta absoluta del directorio principal del usuario.

Además, podemos usar el . siempre que hayamos modificado un archivo de inicio y queramos hacer efectivos los cambios sin necesidad de reiniciar. Por ejemplo:

  • Agregar un alias a ~/.bashrc:

    user2@debian:~$ echo "alias hi='echo We salute you.'" >> ~/.bashrc
Warning

Al enviar la salida de un comando a un archivo, recuerde no confundir el añadir (>>) con la sobreescritura (>).

  • Imprime la última línea de ~/.bashrc para comprobar que todo ha ido bien:

    user2@debian:~$ tail -n 1 !$
    tail -n 1 ~/.bashrc
    alias hi='echo We salute you.'
    Note

    !$ se expande hasta el último argumento del comando anterior, en nuestro caso: ~/.bashrc.

  • ejecutar el archivo manuamente:

    user2@debian:~$ . ~/.bashrc
  • e invocar el alias para probar que funciona:

    user2@debian:~$ hi
    We salute you.
Note

Refiérase a la siguiente lección para aprender acerca de alias y variables.

Ejecutando archivos con source

El comando "source" es un sinónimo de .. Así que para ejecutar ~/.bashrc también podemos hacerlo de esta manera:

user2@debian:~$ source ~/.bashrc

El origen de los archivos de inicio de Shell: SKEL

SKEL es una variable cuyo valor es la ruta absoluta al directorio skel. Este directorio sirve como plantilla para la estructura del sistema de archivos de los principales directorios de los usuarios. Incluye los archivos que serán heredados por cualquier nueva cuenta de usuario que se cree (incluyendo, por supuesto, los archivos de configuración de los shells). El SKEL y otras variables relacionadas se almacenan en el /etc/adduser.conf, que es el archivo de configuración para adduser:

user2@debian:~$ grep SKEL /etc/adduser.conf
# La variable SKEL especifica el directorio que contiene el usuario "skeletal"...
SKEL=/etc/skel
# Si SKEL_IGNORE_REGEX está configurado, adduser ignorará los archivos que coincidan con este.
SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)"

SKEL está configurado como /etc/skel; por lo tanto, los scripts de inicio que configuran nuestros shells están ahí:

user2@debian:~$ ls -a /etc/skel/
.  ..  .bash_logout  .bashrc  .profile
Warning

Recuerde, los archivos que empiezan por . están ocultos, por lo que debemos usar ls -a para verlos al listar el contenido del directorio.

Vamos a crear un directorio en /etc/skel para que todos los nuevos usuarios almacenen sus scripts personales:

  1. Como root nos movemos a /etc/skel:

    root@debian:~# cd /etc/skel/
    root@debian:/etc/skel#
  2. Listamos su contenido:

    root@debian:/etc/skel# ls -a
    .  ..  .bash_logout  .bashrc  .profile
  3. Creamos nuestro directorio y comprobamos que todo ha ido como se esperaba:

    root@debian:/etc/skel# mkdir my_personal_scripts
    root@debian:/etc/skel# ls -a
    .  ..  .bash_logout  .bashrc  my_personal_scripts  .profile
  4. Ahora borramos user2 junto con su directorio home:

    root@debian:~# deluser --remove-home user2
    Looking for files to backup/remove ...
    Removing files ...
    Removing user `user2' ...
    Warning: group `user2' has no more members.
    Done.
  5. Añadimos user2 de nuevo para que tenga un nuevo directorio principal:

    root@debian:~# adduser user2
    Adding user `user2' ...
    Adding new group `user2' (1001) ...
    Adding new user `user2' (1001) with group `user2' ...
    Creating home directory `/home/user2' ...
    Copying files from `/etc/skel' ...
    Enter new UNIX password:
    Retype new UNIX password:
    passwd: password updated successfully
    Changing the user information for user2
    Enter the new value, or press ENTER for the default
    	Full Name []:
    	Room Number []:
    	Work Phone []:
    	Home Phone []:
    	Other []:
    Is the information correct? [Y/n] y
  6. Finalmente, entramos como user2 y listamos todos los archivos en /home/user2 para ver si todo salió como se esperaba:

    root@debian:~# su - user2
    user2@debian:~$ pwd
    /home/user2
    user2@debian:~$ ls -a
    .  ..  .bash_history  .bash_logout  .bashrc  my_personal_scripts  .profile

    Lo hizo.

Ejercicios guiados

  1. Estudie cómo se han iniciado los shells en la columna "Iniciado con…​" y complete la información requerida:

    Iniciado con…​ Interactivo? Inicio de sesión? Resultado de echo $0

    sudo ssh user2@machine2

    Ctrl+Alt+F2

    su - user2

    gnome-terminal

    Un usuario regular usa konsole para iniciar una instancia de sakura

    Un script llamado test.sh que contiene el comando echo $0.

  2. Escriba los comandos su y sudo para lanzar el shell especificado:

    Shell de inicio de sesión interactivo como user2

    su:

    sudo:

    Shell de inicio de sesión interactivo como root

    su:

    sudo:

    Shell interactivo sin inicio de sesión como root

    su:

    sudo:

    Shell interactivo sin inicio de sesión como user2

    su:

    sudo:

  3. ¿Qué archivo de inicio se lee cuando se inicia el shell bajo “Tipo de shell”?

    Tipo de shell /etc/profile /etc/bash.bashrc ~/.profile ~/.bashrc

    Shell de inicio de sesión interactivo como user2

    Shell de inicio de sesión interactivo como root

    Shell interactivo sin inicio de sesión como root

    Shell interactivo sin inicio de sesión como user2

Ejercicios de exploración

  1. En Bash podemos escribir una simple función "¡Hola mundo!" incluyendo el siguiente código en un archivo vacío:

    function hello() {
    	 echo "Hello world!"
    }
    • ¿Qué deberíamos hacer a continuación para que la función esté disponible para shell?

    • Una vez que esté disponible para el shell actual, ¿cómo lo invocarías?

    • Para automatizar las cosas, ¿en qué archivo agregaría la función y su invocación para que se ejecute cuando user2 abra una terminal de una sesión de Ventanas X (X Windows)? ¿Qué tipo de shell es?

    • ¿En qué archivo pondrías la función y su invocación para que se ejecute cuando root lance un nuevo shell interactivo independientemente de si es de inicio de sesión o no?

  2. Observemos el siguiente script, ¡Hola mundo! de Bash:

    #!/bin/bash
    
    #hello_world: a simple bash script to discuss interaction in scripts.
    
    echo "Hello world!"
    • Supongamos que establecemos permisos de ejecución y lo ejecutamos. ¿Sería un script interactivo? ¿Por qué?

      ¿Qué hace que un script sea interactivo?

  3. Imagina que has cambiado los valores de algunas variables en ~/.bashrc y quieres que esos cambios surtan efecto sin reiniciar. Desde tu directorio principal, ¿cómo podrías lograrlo de dos maneras diferentes?

  4. John acaba de iniciar una sesión de X wIndows en un servidor Linux. Abre un emulador de terminal para realizar algunas tareas administrativas pero, sorprendentemente, la sesión se congela y necesita abrir un shell de texto.

    • ¿Cómo puede abrir esa tty?

    • ¿Qué archivos de inicio se obtendrán?

  5. Linda es una usuaria de un servidor Linux. Le pide amablemente al administrador que tenga un archivo ~/.bash_login para que pueda tener la hora y la fecha impresa en la pantalla cuando se conecte. A otros usuarios les gusta la idea y siguen el ejemplo. El administrador tiene dificultades para crear el archivo para los otros 5 usuarios del servidor, así que decide añadir una nueva política y crear un archivo ~/.bash_login para todos los nuevos usuarios. ¿Cómo puede el administrador realizar esa tarea?

Resumen

En esta lección aprendimos:

  • Los Shells establecen el entorno de los usuarios en un sistema Linux.

  • Bash es el shell número uno en todas las distribuciones de GNU/Linux.

  • El primer trabajo que realiza un shell es leer y ejecutar uno o varios archivos de inicio.

  • Los conceptos de interacción y inicio de sesión en relación con los shells.

  • Cómo lanzar diferentes tipos de shells con bash, su, sudo y Ctrl+Alt+F1-F6.

  • Cómo comprobar el tipo de shell con echo $0.

  • Los archivos de inicio locales ~/.bash_profile, ~/.profile, ~/.bash_login, ~/.bash_logout y ~/.bashrc.

  • Los archivos de inicio globales /etc/profile, /etc/profile.d/*, /etc/bash.bashrc.

  • Los archivos locales tienen prioridad sobre los globales.

  • Cómo redirigir la salida de un comando con > (sobrescribir) y >> (añadir).

  • El significado del directorio skel.

  • Comprender el funcionamiento de source.

Comandos usados en esta lección:

bash

Crear un nuevo shell.

su

Crear un nuevo shell.

sudo

Crear un nuevo shell.

usermod

Modificar una cuenta de usuario.

echo

Imprimir en pantalla una línea de texto.

ps

Captura de los procesos actuales.

less

Un visualizador para archivos largos.

ssh

Inicie una conexión SSH (remotamente).

chmod

Cambiar permisos de un archivo, por ejemplo hacerlo ejecutable.

grep

Imprime líneas que coincidan con un patrón.

ls

Lista el contenido de un directorio.

cd

Cambiar de directorio.

mkdir

Crear un directorio.

deluser

Eliminar un usuario

adduser

Crear un nuevo usuario.

.

Ejecutar un archivo

source

Realiza una ejecución de un archivo con el comando source

tail

Emitir la última parte de los archivos.

Respuestas a los ejercicios guiados

  1. Estudie cómo se han iniciado los shells en la columna "Iniciado con…​" y complete la información requerida:

    Iniciado con…​ Interactivo? Inicio de sesión? Resultado de echo $0

    sudo ssh user2@machine2

    Si

    Si

    -bash

    Ctrl+Alt+F2

    Si

    Si

    -bash

    su - user2

    Si

    Si

    -su

    gnome-terminal

    Si

    No

    bash

    Un usuario regular usa konsole para iniciar una instancia de sakura

    Si

    No

    /bin/bash

    Un script llamado test.sh contiene el comando echo $0

    No

    No

    ./test.sh

  2. Escriba los comandos su y sudo para lanzar el shell especificado:

    Shell de inicio de sesión interactivo como user2
    su

    su - user2, su -l user2 o su --login user2

    sudo

    sudo su - user2, sudo su -l user2 o sudo su --login user2

    Shell de inicio de sesión interactivo como root
    su

    su - root o su -

    sudo

    sudo su - root, sudo su - o sudo -i

    Shell interactivo de no inicio de sesion como root
    su

    su root o su

    sudo

    sudo su root, sudo su, sudo -s o sudo -u root -s

    Shell interactivo de no inicio de sesion como user2
    su

    su user2

    sudo

    sudo su user2 o sudo -u user2 -s

  3. ¿Qué archivo de inicio se lee cuando se inicia el shell bajo “Tipo de shell”?

    Tipo de shell /etc/profile /etc/bash.bashrc ~/.profile ~/.bashrc

    Shell de inicio de sesión interactivo como user2

    Si

    Si

    Si

    Si

    Shell de inicio de sesión interactivo como root

    Si

    Si

    No

    No

    Shell interactivo de no inicio de sesion como root

    No

    Si

    No

    No

    Shell interactivo de no inicio de sesion como user2

    No

    Si

    No

    Yes

Respuestas a los ejercicios de exploración

  1. En Bash podemos escribir una simple función "¡Hola mundo!" incluyendo el siguiente código en un archivo vacío:

    function hello() {
    	 echo "Hello world!"
    }
    • ¿Qué deberíamos hacer a continuación para que la función esté disponible para shell?

      Para que la función esté disponible en el shell actual, debemos obtener el archivo que la incluye.

    • Una vez que esté disponible para el shell actual, ¿cómo lo invocarías?

      Lo invocaremos escribiendo su nombre en la terminal.

    • Para automatizar las cosas, ¿en qué archivo pondrías la función y su invocación para que se ejecute cuando user2 abra una terminal de una sesión X Window? ¿Qué tipo de shell es?

      El mejor archivo para colocarlo es home/user2/.bashrc. El shell invocado sería un shell interactivo de no inicio de sesion.

    • ¿En qué archivo pondrías la función y su invocación para que se ejecute cuando root lance un nuevo shell interactivo independientemente de si es de inicio de sesión o no?

      En /etc/bash.bashrc ya que este archivo se ejecuta para todos los shells interactivos — ya sea que se inicie la sesión o no.

  2. Observemos el siguiente script, ¡Hola mundo! de Bash:

    #!/bin/bash
    
    #hello_world: a simple bash script to discuss interaction in scripts.
    
    echo "Hello world!"
    • Supongamos que establecemos permisos de ejecución y lo ejecutamos. ¿Sería un script interactivo? ¿Por qué?

      No, ya que no hay interacción humana y no hay comandos que sean tecleados por el usuario.

      ¿Qué hace que un script sea interactivo?

      El hecho de que requiere la entrada del usuario.

  3. Imagina que has cambiado los valores de algunas variables en ~/.bashrc y quieres que esos cambios surtan efecto sin reiniciar. Desde tu directorio principal, ¿cómo podrías lograrlo de dos maneras diferentes?

    $ source .bashrc

    or

    $ . .bashrc
  4. John acaba de iniciar una sesión de X window en un servidor Linux. Abre un emulador de terminal para realizar algunas tareas administrativas pero, sorprendentemente, la sesión se congela y necesita abrir un shell de texto.

    • ¿Cómo puede abrir esa tty?

      Podría hacerlo presionando Ctrl+Alt+F1-F6 para entrar en una de las seis tty.

    • ¿Qué archivos de inicio se obtendrán?

      /etc/profile
      /home/john/.profile

  5. Linda es una usuaria de un servidor Linux. Le pide amablemente al administrador que tenga un archivo ~/.bash_login para que pueda tener la hora y la fecha impresa en la pantalla cuando se conecte. A otros usuarios les gusta la idea y siguen el ejemplo. El administrador tiene dificultades para crear el archivo para los otros 5 usuarios del servidor, así que decide añadir una nueva política y crear un archivo ~/.bash_login para todos los nuevos usuarios. ¿Cómo puede el administrador realizar esa tarea?

    Podría lograrlo poniendo .bash_login en el directorio /etc/skel.

© 2020 Linux Professional Insitute Inc. Todos los derechos reservados. Visite el sitio web de Learning Materials: https://asir.sudo.es/docnux/learning.lpi.org
Este trabajo está registrado bajo la Licencia Internacional Creative Commons Attribution-NonCommercial-NoDerivatives 4.0

Siguiente lección

105.1 Customize and use the shell environment (105.1 Lección 2)

Leer la próxima lección

© 2020 Linux Professional Insitute Inc. Todos los derechos reservados. Visite el sitio web de Learning Materials: https://asir.sudo.es/docnux/learning.lpi.org
Este trabajo está registrado bajo la Licencia Internacional Creative Commons Attribution-NonCommercial-NoDerivatives 4.0

LPI es una organización sin fines de lucro.

Linux Professional Institute (LPI) es la organización global de certificación y apoyo académico para profesionales de código abierto. Con más de 200,000 titulares de certificación, es el primer y más grande organismo de certificación no comercial del mundo para Linux y Open Source. LPI cuenta con profesionales certificados en más de 180 países, realiza exámenes en varios idiomas y tiene cientos de socios de capacitación.

Nuestro propósito es hacer que las oportunidades económicas y creativas estén disponibles para todos, haciendo que el conocimiento de código abierto y la certificación sea universalmente accesible.

  • LinkedIn
  • flogo-RGB-HEX-Blk-58 Facebook
  • Twitter
  • Contáctenos
  • Política de privacidad y cookies

¿Detecta un error o desea ayudar a mejorar esta página? Por favor háznoslo saber.

© Copyright 1999-2020 The Linux Professional Institute Inc. Todos los derechos reservados.