105.1 Lección 1
Certificación: |
LPIC-1 |
---|---|
Versión: |
5.0 |
Tema: |
105 Shells y scripts |
Objetivo: |
105.1 Personalizar y usar 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
|
|
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
obash --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 sistemaetc/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
osu --login user2
iniciará un shell de inicio de sesión interactivo comouser2
. -
su user2
iniciará un shell interactivo y sin inicio de sesión comouser2
. -
su - root
osu -
iniciará un shell de inicio de sesión interactivo comoroot
. -
su root
osu
iniciará un shell interactivo y sin inicio de sesión comoroot
.
-
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 asudoers
necesitamos convertirnos enroot
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
osudo su --login user2
iniciará un shell de inicio de sesión interactivo comouser2
. -
sudo su user2
iniciará un shell interactivo sin inicio de sesión comouser2
. -
sudo -u user2 -s
iniciará un shell interactivo sin inicio de sesión comouser2
. -
sudo su - root
orsudo su -
iniciará un shell de inicio de sesión interactivo comoroot
. -
sudo -i
iniciará un shell de inicio de sesión interactivo comoroot
. -
sudo -i <some_command>
iniciará un shell de inicio de sesión interactivo comoroot
, ejecuta el comando y volverá al usuario original. -
sudo su root
orsudo su
iniciará un shell interactivo sin inicio de sesión comoroot
. -
sudo -s
orsudo -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 |
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 (Incluidobash
). A través de una serie de declaracionesif
este archivo establece un número de variables comoPATH
yPS1
, 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 variablePATH
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 |
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" deuser2
. -
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 interactivosbash
. 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 deLÍNEAS
yCOLUMNAS
, 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 sibash
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.
-
Creamos el script
test.sh
que contiene la líneaecho '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
-
Hacemos que nuestro script sea ejecutable:
user2@debian:~$ chmod +x ./test.sh
-
Finalmente, invocamos a
bash
con la opciónl
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:
-
Hello from /etc/bash.bashrc
significa/etc/profile
se ha obtenido/etc/bash.bashrc
. -
Hello from /etc/profile
significa/etc/profile
ha sido completamente leído y ejecutado. -
Hello from /home/user2/.bashrc
significa~/.profile
se ha obtenido~/.bashrc
. -
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, |
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 ( |
-
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 |
Vamos a crear un directorio en /etc/skel
para que todos los nuevos usuarios almacenen sus scripts personales:
-
Como
root
nos movemos a/etc/skel
:root@debian:~# cd /etc/skel/ root@debian:/etc/skel#
-
Listamos su contenido:
root@debian:/etc/skel# ls -a . .. .bash_logout .bashrc .profile
-
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
-
Ahora borramos
user2
junto con su directoriohome
: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.
-
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
-
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
-
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 comandoecho $0
. -
Escriba los comandos
su
ysudo
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
:
- Shell de inicio de sesión interactivo como
-
¿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
-
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?
-
-
Observemos el siguiente script,
¡Hola mundo!
deBash
:#!/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?
-
-
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? -
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?
-
-
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 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
-
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
-bash
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 comandoecho $0
No
No
./test.sh
-
Escriba los comandos
su
ysudo
para lanzar el shell especificado:- Shell de inicio de sesión interactivo como
user2
su
-
su - user2
,su -l user2
osu --login user2
sudo
-
sudo su - user2
,sudo su -l user2
osudo su --login user2
- Shell de inicio de sesión interactivo como
root
su
-
su - root
osu -
sudo
-
sudo su - root
,sudo su -
osudo -i
- Shell interactivo de no inicio de sesion como
root
su
-
su root
osu
sudo
-
sudo su root
,sudo su
,sudo -s
osudo -u root -s
- Shell interactivo de no inicio de sesion como
user2
su
-
su user2
sudo
-
sudo su user2
osudo -u user2 -s
- Shell de inicio de sesión interactivo como
-
¿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
-
In Bash we can write a simple
Hello world!
function by including the following code in an empty file:function hello() { echo "Hello world!" }
-
What should we do next to make the function available to the shell?
To make the function availabe to the current shell, we must source the file which includes it.
-
Once it is available to the current shell, how would you invoke it?
We will invoke it by typing its name into the terminal.
-
To automate things, in what file would you put the function and its invocation so that it gets executed when
user2
opens a terminal from an X Window session? What type of shell is it?The best file to put it is
/home/user2/.bashrc
. The invoked shell would be an interactive non-login one. -
In what file would you put the function and its invocation so that it is run when
root
launches a new interactive shell irrespective of whether it is login or not?In
/etc/bash.bashrc
since this file gets executed for all interactive shells — whether login or not.
-
-
Observemos el siguiente script,
¡Hola mundo!
deBash
:#!/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.
-
-
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
-
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
-
-
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 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
.