Diferencia entre revisiones de «Administración básica»

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
(Directorio de trabajo actual y la orden cd)
(Paso 9: Administración remota con ssh)
 
(No se muestran 42 ediciones intermedias de 4 usuarios)
Línea 1: Línea 1:
Para realizar esta práctica utilizaremos una de las máquinas virtuales que
+
Para realizar esta práctica utilizaremos una de las máquinas virtuales que generamos en la práctica anterior.
generamos en la práctica anterior. En esta práctica aprenderemos a utilizar la
 
línea de comandos y a realizar todas las tareas para poder manejar un servidor
 
con linux:
 
  
 +
En esta práctica aprenderemos a utilizar el interprete de ordenes (también conocido como ''[https://www.traficantes.net/sites/default/files/pdfs/En%20el%20principio%20fue...-TdS.pdf línea de comandos]'') y a aprender nociones básicas de administración de sistemas Linux.
  
 
= Paso 0: Breve introducción al sistema Linux =
 
= Paso 0: Breve introducción al sistema Linux =
  
== Estructura del sistema de archivos ==
+
== Estructura básica del sistema de archivos ==
  
En un sistema Linux, todas las carpetas y ficheros en el sistema de fichero pende del directorio raíz que se representa con la /.
+
En un sistema Linux, todas las carpetas y ficheros en el sistema de fichero pende de la carpeta raíz que se representa con la /.
  
 
  /
 
  /
Línea 35: Línea 33:
  
 
Como puedes observar, el sistema de fichero emplea una estructura de árbol.
 
Como puedes observar, el sistema de fichero emplea una estructura de árbol.
 +
 +
== Nociones básicas ==
 +
 +
·Aplicaciones con nombres compuestos: usar guion entre palabras
 +
 +
·Nombres con espacios en blanco: Escribir entre comillas dobles
 +
 +
·Espacios en blanco para separar ordenes (ej: instalar varios paquetes )
 +
 +
·Formato general de una orden: comando [-opciones] [argumentos]
 +
 +
·'''IMPORTANTE''': Diferencia entre mayúsculas y minúsculas
  
 
== Carpetas . y .. ==
 
== Carpetas . y .. ==
Línea 56: Línea 66:
  
 
Nos situaría en la carpeta padre, empleando una ruta relativa.
 
Nos situaría en la carpeta padre, empleando una ruta relativa.
 +
 +
Si volvemos a escribir desde /home " cd .. " nos lleva a '''/$'''
  
 
Para situarnos en el raíz, podemos emplear una ruta absoluta:
 
Para situarnos en el raíz, podemos emplear una ruta absoluta:
Línea 63: Línea 75:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
En caso de que queramos volver a la carpeta de usuario, bastaría con invocar a '''cd''' sin más
+
En caso de que queramos volver a la carpeta de usuario, bastaría con invocar a '''cd''' sin más o ''' cd ~ '''
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
$ cd
 
$ cd
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
'''MUY IMPORTANTE''': No es lo mismo cd.. que ''' cd .. ''', es necesario el espacio después del cd.
  
 
== Rutas absolutas, rutas relativas ==
 
== Rutas absolutas, rutas relativas ==
  
Para hacer referencia a un fichero o carpeta desde el intérprete de ordenes se usan ruta absolutas o rutas relativas.
+
Para hacer referencia a un fichero o una carpeta se usan ruta absolutas o rutas relativas.
  
Las rutas absolutas siempre empieza por /, de manera que toman como punto de referencia el directorio raíz (/). Por ejemplo, una ruta absoluta a la carpeta '''prueba''' que está almacenada en la carpeta del usuario '''ubuntu''' es '/home/ubuntu/prueba/'.
+
Las rutas absolutas siempre empieza por /, de manera que toman como punto de referencia la carpeta raíz (/). Por ejemplo, una ruta absoluta a la carpeta '''prueba''' que está almacenada en la carpeta del usuario '''ubuntu''' es '/home/ubuntu/prueba/'.
  
Las ruta relativa toma como referencia el directorio de trabajo actual. Para averiguar el directorio de trabajo actual disponemos de la orden '''pwd'''.
+
Las ruta relativa toma como referencia la carpeta de trabajo actual. Para averiguar la carpeta de trabajo actual disponemos de la orden '''pwd'''.
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Línea 82: Línea 96:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
En base al directorio de trabajo actual, empleando la pseudocarpeta '''..''', se puede construir rutas relativas. Por ejemplo, para referenciar un fichero '''fichero.txt''' en la carpeta temporal, podemos emplear la ruta relativa '''../../tmp/fichero.txt'''.
+
En base a la carpeta de trabajo actual, empleando la pseudocarpeta '''..''', se puede construir rutas relativas. Por ejemplo, para referenciar un fichero '''fichero.txt''' en la carpeta temporal, podemos emplear la ruta relativa '''../../tmp/fichero.txt'''.
  
 
Aunque probablemente sea más cómodo emplear una ruta absoluta en este caso, que sería '''/tmp/fichero.txt'''.
 
Aunque probablemente sea más cómodo emplear una ruta absoluta en este caso, que sería '''/tmp/fichero.txt'''.
Línea 90: Línea 104:
 
El intérprete de órdenes es un lanzador de aplicaciones textual que emplea el teclado como dispositivo de entrada de datos. Mediante el teclado, se escribe el nombre del programa que se quiere lanzar y al pulsa la tecla ''intro'' el intérprete de ordenes ejecutara dicho programa. Por defecto, el intérprete de ordenes que emplea Ubuntu por defecto es '''bash'''.
 
El intérprete de órdenes es un lanzador de aplicaciones textual que emplea el teclado como dispositivo de entrada de datos. Mediante el teclado, se escribe el nombre del programa que se quiere lanzar y al pulsa la tecla ''intro'' el intérprete de ordenes ejecutara dicho programa. Por defecto, el intérprete de ordenes que emplea Ubuntu por defecto es '''bash'''.
  
== man: ver la paǵina de manual de una orden ==
+
== man: ver la página de manual de una orden ==
  
 
La orden '''man''' te será útil para ver las páginas de manual.
 
La orden '''man''' te será útil para ver las páginas de manual.
 +
 +
Su estructura básica es:
 +
 +
<syntaxhighlight lang="bash">
 +
man <comando>
 +
</syntaxhighlight>
 +
 +
Aunque también se utiliza con la opción ''' -a ''' de All, que también muestra las entradas comenzadas por '''.''':
 +
 +
<syntaxhighlight lang="bash">
 +
man -a <comando>
 +
</syntaxhighlight>
  
 
Este programa toma como entrada el nombre de la orden de la que quieres consultar su página de manual, por ejemplo:
 
Este programa toma como entrada el nombre de la orden de la que quieres consultar su página de manual, por ejemplo:
Línea 103: Línea 129:
  
 
Para salir de la página de manual, pulsa la tecla '''q''' (la primera letra de la palabra '''quit''', en inglés).
 
Para salir de la página de manual, pulsa la tecla '''q''' (la primera letra de la palabra '''quit''', en inglés).
 +
 +
quit = salir
  
 
Normalmente, los programas ofrecen opciones de ayuda, como '''--help'''.
 
Normalmente, los programas ofrecen opciones de ayuda, como '''--help'''.
Línea 118: Línea 146:
 
En general, todas las ordenes suelen ofrecer una opción de ayuda.
 
En general, todas las ordenes suelen ofrecer una opción de ayuda.
  
= Paso 1: Operando con el sistema de ficheros =
+
= Paso 1: Operaciones básicas con el sistema de ficheros =
  
 
== ls ==
 
== ls ==
  
Lista los ficheros y directorios. Si no le pasamos como argumento un directorio,
+
Lista los ficheros y carpetas. Si no se especifica nada, muestra los ficheros y carpetas que contiene la carpeta de trabajo actual.
listará el actual.
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Línea 129: Línea 156:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Por defecto no habrá nada, vamos a pasar darle el directorio raiz para ver la
+
Si se especifica una ruta, muestra las carpetas y ficheros contenidos en dicha ruta, por ejemplo:
estructura mencionada al inicio de la práctica:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
ls /
+
$ ls /
 +
bin  boot  data  dev  etc  home  initrd.img  initrd.img.old  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  sys  tmp  usr  var  vmlinuz  vmlinuz.old
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Salida:
+
Al emplear '''/''' como ruta absoluta, muestra el contenido de la carpeta raíz.
  
<syntaxhighlight lang="bash">
+
Las opciones más usadas de este programa suelen ser:
bin  boot  data  dev  etc  home  initrd.img  initrd.img.old  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  sys  tmp  usr  var  vmlinuz  vmlinuz.old
 
</syntaxhighlight>
 
  
Veamos algunas de las opciones que tiene este argumento:
+
* -a: muestra los ficheros y carpetas ''ocultos''. En Linux, cualquier fichero o carpeta cuyo nombre empiece por . se considera ''oculto''. Esto incluye también en el listado las pseudocarpetas . y ..
  
* -a: muestra todo, incluso ficheros 'ocultos' (cualquier fichero que empieze
+
* -l: se muestra en lista y aporta datos como la fecha de última modificación, propietario, grupo, tamaño en bytes y nombre:
  por . es considerado 'oculto')
 
* -l: formato largo, donde mostramos permisos y en forma de lista
 
 
 
Probemos las opciones:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
ls -a
+
$ ls -a
</syntaxhighlight>
 
  
Ahora si encontramos ficheros:
 
 
<syntaxhighlight lang="bash">
 
 
.  ..  .bash_history  .bash_logout  .bashrc  .profile  .ssh
 
.  ..  .bash_history  .bash_logout  .bashrc  .profile  .ssh
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Vemos al inicio . y ..:
+
Ambas opciones se puede combinar:
 
 
.: hace referencia al directorio actual
 
..: hace referencia al directorio padre
 
 
 
Ahora unamos varias opciones:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
ls -la /
+
$ ls -la /
</syntaxhighlight>
 
 
 
Salida similar a la siguiente:
 
  
<syntaxhighlight lang="bash">
 
 
total 92
 
total 92
 
drwxr-xr-x  24 root root  4096 Aug 28 09:50 .
 
drwxr-xr-x  24 root root  4096 Aug 28 09:50 .
Línea 181: Línea 189:
 
drwx------  3 root root  4096 Aug 28 09:50 data
 
drwx------  3 root root  4096 Aug 28 09:50 data
 
drwxr-xr-x  18 root root  3780 Aug 28 09:46 dev
 
drwxr-xr-x  18 root root  3780 Aug 28 09:46 dev
drwxr-xr-x  93 root root  4096 Aug 28 13:51 etc
+
[...]
drwxr-xr-x  3 root root  4096 Aug 28 09:46 home
 
lrwxrwxrwx  1 root root    33 Aug 22 12:35 initrd.img -> boot/initrd.img-4.15.0-58-generic
 
lrwxrwxrwx  1 root root    33 Aug 22 12:35 initrd.img.old -> boot/initrd.img-4.15.0-58-generic
 
drwxr-xr-x  20 root root  4096 Aug 22 12:35 lib
 
drwxr-xr-x  2 root root  4096 Aug 22 12:34 lib64
 
drwx------  2 root root 16384 Aug 22 12:36 lost+found
 
drwxr-xr-x  2 root root  4096 Aug 22 12:34 media
 
drwxr-xr-x  2 root root  4096 Aug 22 12:34 mnt
 
drwxr-xr-x  3 root root  4096 Aug 28 09:49 opt
 
dr-xr-xr-x 111 root root    0 Aug 28 09:46 proc
 
drwx------  3 root root  4096 Aug 28 09:46 root
 
drwxr-xr-x  26 root root  940 Aug 28 13:51 run
 
drwxr-xr-x  2 root root  4096 Aug 28 09:49 sbin
 
drwxr-xr-x  2 root root  4096 Aug 28 09:46 snap
 
drwxr-xr-x  2 root root  4096 Aug 22 12:34 srv
 
dr-xr-xr-x  13 root root    0 Aug 28 09:46 sys
 
drwxrwxrwt  10 root root  4096 Aug 28 16:00 tmp
 
drwxr-xr-x  11 root root  4096 Aug 28 09:49 usr
 
drwxr-xr-x  13 root root  4096 Aug 22 12:36 var
 
lrwxrwxrwx  1 root root    30 Aug 22 12:35 vmlinuz -> boot/vmlinuz-4.15.0-58-generic
 
lrwxrwxrwx  1 root root    30 Aug 22 12:35 vmlinuz.old -> boot/vmlinuz-4.15.0-58-generic
 
</syntaxhighlight>
 
 
 
 
 
== cd ==
 
 
 
Cambiar el directorio de trabajo o directorio actual.
 
 
 
<syntaxhighlight lang="bash">
 
cd /
 
</syntaxhighlight>
 
  
Esto nos mueve al directorio raiz, hagamos ahora un pwd para ver donde estamos:
 
 
<syntaxhighlight lang="bash">
 
pwd
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Salida:
+
Otras opciones útiles son:
  
<syntaxhighlight lang="bash">
+
* -s : muestra el tamaño en bloques de cada archivo
/
 
</syntaxhighlight>
 
  
 +
* -t : aporta el día y la hora de modificación
  
Ejercicio:
+
* -R : lista también las subcarpetas
  
# Cambiar el directorio actual a /home
+
* --color : muestra el contenido coloreado
# Movernos al directorio de nuestro usuario usando rutas relativas
 
  
Solución:
 
  
<syntaxhighlight lang="bash">
+
Los '''permisos''' se emplean en base a tres capacidades:
cd /home
 
ls
 
cd ubuntu
 
</syntaxhighlight>
 
  
=== Atajos ===
+
* Lectura, que se codifica con '''r''' (read, en inglés).
 +
* Escritura, que se codifica con '''w''' (write, en inglés).
 +
* Ejecutación, que se codifica con '''x''' (execute, en inglés).
  
El comando cd, si no le pasamos parámetro ninguno, por defecto nos moverá a la
+
La primera columna muestra los permisos que codifican:
carpeta del usuario.
 
  
<syntaxhighlight lang="bash">
+
* Tipo de entrada: '''d''' indica ''directorio'' (''carpeta'').
cd /
+
* Permisos del propietario, primera terna de rwx
cd
+
* Permisos del grupo, segunda terna de rwx
</syntaxhighlight>
+
* Permisos para el resto del mundo, tercera terna de rwx.
  
Si nuestro usuario es ubuntu, acabaremos en /home/ubuntu
+
A continuación, aparecen el propietario y el grupo, seguidos de la fecha de última modificación y el nombre del fichero o carpeta.
  
= Paso 2: Creación y modificación de ficheros y directorios =
+
La ayuda ( help ) en ls solo funciona con ''' ls --help ''' no con ls -h
  
 
== mkdir ==
 
== mkdir ==
Línea 259: Línea 226:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
mkdir test
+
$ mkdir test
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Línea 267: Línea 234:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
ls
+
$ ls
 +
test
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Ahora vamos a ver un parámetro muy utilizado en mkdir, que es el -p, utilizado
+
Con la opción '''-p''', permite crear sucesivas carpetas anidadas de una sola vez, por ejemplo:
para crear directorios padres si no existen:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
mkdir -p grandparent/parent/children
+
$ mkdir -p a/b/c
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Sin el -p, este comando fallaría, pero con el -p, nos crea los directorios
+
Que crea la siguiente estructura de carpetas.
padres si no existen.
 
  
 +
a
 +
└── b
 +
    └── c
  
 
== touch ==
 
== touch ==
  
Crea un nuevo fichero vacío.
+
Crea un nuevo fichero vacío (sin contenido) con el nombre que especifiquemos.
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
touch file.txt
+
$ touch file.txt
touch test/file.txt
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Comprobamos que hemos creado ambos ficheros:
+
Comprobamos que el fichero se ha creado correctamente.
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
ls
+
$ ls
ls test
+
file.txt
 
</syntaxhighlight>
 
</syntaxhighlight>
 
  
 
== cp ==
 
== cp ==
  
Copia un fichero o directorio. Si intentamos copiar un directorio con
+
Copia un fichero o directorio.
contenido, tendremos que usar la opción -r (recursivo)
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
cp file.txt file_copy.txt
+
$ cp file.txt file_copy.txt
cp -r test test_copy
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Comprobamos:
+
Para copiar una carpeta y su contenido tenemos que usar la opción -r (recursivo).
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
ls
+
$ cp -r test test_copy
ls test_copy/
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
* Comprobamos el resultado con la orden '''ls'''.
 +
 +
* Si nos encontramos en la carpeta destino, la estructura sería la siguiente:
 +
 +
<syntaxhighlight lang="bash">
 +
$ cp <nombre ruta origen> <nombre archivo>
 +
</syntaxhighlight>
  
 
== mv ==
 
== mv ==
  
Mueve un fichero o directorio. Muy similar al comando cp.
+
Mueve fichero o carpeta.
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
mv file_copy.txt file2.txt
 
mv file_copy.txt file2.txt
mv test_copy test2
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Comprobamos:
+
También se emplea para renombrar.
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
ls
+
mv test_copy test_copy2
 
</syntaxhighlight>
 
</syntaxhighlight>
 
  
 
== rm ==
 
== rm ==
  
Borra un fichero o directorio
+
* Borra un fichero o carpeta vacía:
 
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
rm file2.txt
+
rm <nombre>
rm -r test2
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Comprobamos:
+
* Para borrar una carpeta no vacía y su contenido:
 
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
ls
+
rm -r <nombre>
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Ejercicios:
+
'''IMPORTANTE''': No hacer jamás ''' rm -r * '''
 +
 
 +
* EJERCICIOS:
  
 
# Crear la siguiente estructura dentro del directorio /tmp (usar los comandos mkdir, touch y cp):
 
# Crear la siguiente estructura dentro del directorio /tmp (usar los comandos mkdir, touch y cp):
  
/tmp
+
/tmp
├── carpeta1
+
├── carpeta1
├── carpeta2
+
├── carpeta2
│   ├── fichero1.txt
+
│   ├── fichero1.txt
│   └── fichero2.md
+
│   └── fichero2.md
└── carpeta3
+
└── carpeta3
   ├── fichero1.txt
+
     ├── fichero1.txt
   └── fichero2.md
+
     └── fichero2.md
  
 
# Basándonos en el ejercicio anterior, cambiar la estructura a la siguiente (usar comandos mv y rm):
 
# Basándonos en el ejercicio anterior, cambiar la estructura a la siguiente (usar comandos mv y rm):
  
/tmp
+
/tmp
└── carpeta
+
└── carpeta
   ├── fichero1.txt
+
     ├── fichero1.txt
     └── fichero2.md
+
      └── fichero2.md
 
 
  
= Paso 3: Manejo de ficheros y directorios más avanzado =
+
= Paso 2: Impresión por pantalla y redirección de salida =
  
 
== echo ==
 
== echo ==
  
Sirve para imprimir una línea de texto por pantalla o imprimir variables de
+
Sirve para imprimir una línea de texto por pantalla o variables de entorno. Además, nos permite escribir en ficheros.
entorno.
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
echo "Hola"
+
echo <opción> <texto>
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Una variable de entorno es una variable editada con algún valor, por defecto
+
* Opciones curiosas:
existen algunas creadas, como por ejemplo la variable HOME, que contiene el
+
 
directorio del usuario:
+
-e <PALABRA \bPALABRA>  Se eliminan los espacios entre las palabras
 +
 
 +
-e <PALABRA \nPALABRA> Se añaden saltos de línea
 +
 
 +
 
 +
Una variable de entorno es una variable editada con algún valor, por defecto existen algunas creadas, como por ejemplo la variable HOME, que contiene el directorio del usuario:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Línea 399: Línea 370:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
+
== Redirección de salida ==
=== > vs >> ===
 
  
 
> y >> sirve para redirigir una salida. Por ejemplo, utilizando el comando echo,
 
> y >> sirve para redirigir una salida. Por ejemplo, utilizando el comando echo,
Línea 421: Línea 391:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
No preocuparos si el fichero no existe, se creará en caso de no existir.
+
En cualquier caso, si el fichero no existe, se crea.
  
 +
= Paso 3: Manejo de ficheros y carpetas avanzado =
  
 
== cat ==
 
== cat ==
  
Sirve para mostrar el contenido de un fichero, nos vendrá bien para comprobar
+
* Muestra el contenido de un fichero:
como ha funcionado el comando anterior.
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
cat file.txt
 
cat file.txt
cat file2.txt
+
cat <fichero1> <fichero2>
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
* Crea un fichero:
  
== grep ==
+
<syntaxhighlight lang="bash">
 +
cat ><nombre archivo>
 +
</syntaxhighlight>
  
Sirve para buscar patrones en ficheros y mostrarlos por la salida estándar. Muy
+
GUARDAR FICHERO: Pulsamos ENTER y luego CTRL + D
útil a la hora de programar para buscar ciertas variables o funciones en
 
ficheros.
 
  
Por ejemplo, vamos a buscar todas las líneas en todos los ficheros que tengamos
+
* Añadir más lineas al fichero:  
en el directorio actual que contengan la palabra prueba:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
grep -nr prueba *
+
cat >><nombre fichero>
 
</syntaxhighlight>
 
</syntaxhighlight>
  
El -n nor sirve para que nos muestre el número de línea, y el -r para hacer el
+
* Concatenar ficheros:
comando recursivo y buscar dentro de las carpetas existentes. Por último, el
+
 
. es donde le damos el directorio, en este caso, el directorio actual.
+
<syntaxhighlight lang="bash">
 +
cat <fichero1> <fichero2> > <fichero3>
 +
</syntaxhighlight>
 +
 
 +
cat > <fichero4>
 +
</syntaxhighlight>
 +
 
 +
== grep ==
 +
 
 +
Sirve para localizar coincidencias de un cierto patrón en ficheros y muestra la coincidencia, en caso de encontrarla, por pantalla.
  
La salida será similar a:
+
<syntaxhighlight lang="bash">
 +
grep <opción> <patrón> <archivos donde buscar>
 +
</syntaxhighlight>
 +
Por ejemplo, para buscar el patrón ''prueba'' en el fichero ''fichero.txt''.
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
file.txt:1:Esto es una prueba
+
$ grep -n prueba fichero.txt
file2.txt:1:Esto es una prueba
+
1:Esto es una prueba
file2.txt:2:Esto es una prueba
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
* Principales opciones del comando:
 +
 +
-c : Escribe el número de líneas encontradas.
 +
 +
-i : No distingue entre mayúsculas y minúsculas.
 +
 +
-l : Muestra los nombres de los ficheros que contienen los caracteres buscados.
 +
 +
-n : Cada línea es precedida por su número en el fichero.
 +
 +
-s : No se muestran los mensajes que indican que no se puede abrir un fichero.
 +
 +
-v : Muestra sólo las líneas que no cumplen la condición.
  
 
== wc ==
 
== wc ==
  
Sirve para realizar diferentes tipos de conteos, como palabras, caracteres,
+
Sirve para contar el número de palabras, caracteres, líneas o bytes que contiene un fichero.
líneas o bytes. Algunos de los parámetros más utilizados:
 
  
* -l: cuenta el número de líneas
+
Las opciones más utilizadas son:
* -w: cuenta el número de palabras
+
 
* -m: cuenta el número de caracteres
+
* -l: muestra el número de líneas que contiene el fichero.
* -c: cuenta el número de bytes
+
* -w: muestra el número de palabras.
 +
* -m: muestra el número de caracteres
 +
* -c: muestra el número de bytes
  
 
Probemos y contemos todo en el fichero file2.txt:
 
Probemos y contemos todo en el fichero file2.txt:
Línea 488: Línea 483:
 
Nos mostrará el conteo de cada fichero y el total.
 
Nos mostrará el conteo de cada fichero y el total.
  
 +
== find ==
 +
 +
Para buscar ficheros podemos usar la orden ''find''.
 +
 +
Por ejemplo, para buscar el fichero ''python3'' en todo el árbol de directorio (desde el raíz) podemos usar la orden:
 +
 +
<syntaxhighlight lang="bash">
 +
find / -name python3
 +
</syntaxhighlight>
 +
 +
Podemos restringir la búsqueda a ficheros con ''-type f''
 +
 +
<syntaxhighlight lang="bash">
 +
find / -type f -name python3
 +
</syntaxhighlight>
 +
 +
o para directorios con ''-type d''
  
 
== Tubería (|) ==
 
== Tubería (|) ==
Línea 511: Línea 523:
 
Vamos a ver unos conceptos antes de seguir:
 
Vamos a ver unos conceptos antes de seguir:
  
* Entrada estándar: representa los datos que necesita una aplicación para
+
* Entrada estándar: representa los datos que necesita una aplicación para funcionar, como por ejemplo un archivo de datos o información ingresada desde la terminal y es representado en la terminal como el tipo 0.
  funcionar, como por ejemplo un archivo de datos o información ingresada desde
+
* Salida estándar: es la vía que utilizan las aplicaciones para mostrarte información, allí podemos ver el progreso o simplemente los mensajes que la aplicación quiera darte en determinado momento y es representado en la terminal como el tipo 1.
  la terminal y es representado en la terminal como el tipo 0.
+
* Error estándar: es la forma en que los programas te informan sobre los problemas que pueden encontrarse al momento de la ejecución y es representado en la terminal como el tipo 2.
* Salida estándar: es la vía que utilizan las aplicaciones para mostrarte
 
  información, allí podemos ver el progreso o simplemente los mensajes que la
 
  aplicación quiera darte en determinado momento y es representado en la
 
  terminal como el tipo 1.
 
* Error estándar: es la forma en que los programas te informan sobre los
 
  problemas que pueden encontrarse al momento de la ejecución y es representado
 
  en la terminal como el tipo 2.
 
  
 
Las redirecciones nos sirven para mover la información de un tipo a otro.
 
Las redirecciones nos sirven para mover la información de un tipo a otro.
Línea 529: Línea 534:
 
* comando 2> fichero: Envía la salida de error de comando a fichero
 
* comando 2> fichero: Envía la salida de error de comando a fichero
 
* comando 2>&1: Envía la salida de error a la salida estándar
 
* comando 2>&1: Envía la salida de error a la salida estándar
* comando &> fichero: Envía la salida estándar y de error a fichero; equivale a
+
* comando &> fichero: Envía la salida estándar y de error a fichero; equivale a comando > fichero 2>&1
  comando > fichero 2>&1
 
 
 
  
 
= Paso 4: Usuarios y grupos =
 
= Paso 4: Usuarios y grupos =
Línea 587: Línea 590:
 
sudo -u practica ls
 
sudo -u practica ls
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
Como root puedo añadir usuarios para que puedan hacer sudo así:
 +
 +
<syntaxhighlight lang="bash">
 +
adduser usuario sudo
 +
</syntaxhighlight>
 +
 +
Esto hace que el usuario ''usuario'' pueda hacer sudo
  
  
Línea 737: Línea 748:
 
La suma de los permisos, nos da el valor numérico. Veamos un ejemplo:
 
La suma de los permisos, nos da el valor numérico. Veamos un ejemplo:
 
rwx rw- r--
 
rwx rw- r--
111 110 100
+
110 110 100
  7   6  4
+
  6   6  4
  
 +
'''Ojo''': ¡No emplee nunca los permisos 777 (rwxrwxrwx) cuando tenga problemas con los permisos!
  
 
== chmod ==
 
== chmod ==
Línea 780: Línea 792:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
chmod 744 file  # Al usuario le damos todos los permisos, y al grupo y otros solo le damos permisos de lectura
+
chmod 644 file  # Al usuario le damos permiso de lectura y escritura al usuario, y al grupo y otros solo le damos permisos de lectura
chmod 777 file  # Todos tienen permisos para todo
 
 
chmod 600 file  # solo el propietario tiene permisos de lectura y escritura
 
chmod 600 file  # solo el propietario tiene permisos de lectura y escritura
 
</syntaxhighlight>
 
</syntaxhighlight>
 
  
 
=== Ejemplos ===
 
=== Ejemplos ===
Línea 1005: Línea 1015:
  
  
= Paso 8: Paquetería y repositorios =
+
= Paso 8: Gestión de paquetes de software y repositorios =
  
Un repositorio es un espacio centralizado donde se almacena, organiza, mantiene
+
Los sistemas Linux incluyen, además de las herramientas básicas del sistema operativo, repositorios de software que puede ser opcionalmente instalados por el administrador del sistema. Los fabricantes de las distribuciones de Linux incluyen paquetes de software listos para ser instalados que se integran con el sistema.
y difunde información digital, habitualmente archivos informáticos, que pueden
 
contener trabajos científicos, conjuntos de datos o software.
 
  
Un paquete es un conjunto de archivos e instrucciones que indican que hacer con
+
Un paquete incluye el software necesario para que una cierta aplicación funcione correctamente, así como sus paquetes de dependencia.
estos archivos.
 
  
En cualquier distribución linux, tendremos unos repositorios donde están
+
En Ubuntu, la herramienta de gestión de paquetes de software y repositorios se llama '''apt'''.
alojados los paquetes con los diferentes programas y utilidades del sistema.
 
  
 +
=== Listado de repositorios de paquetes de software ===
  
=== Sources ===
+
En Ubuntu el listado de repositorios se encuentra en el fichero /etc/apt/sources.list. Podemos comprobar que repositorios tenemos añadido:
 
 
Cada distribución tiene su fichero de sources, que será donde estarán los
 
enlaces a los repositorios que utilizará el gestor de paquetes. En el caso de
 
ubuntu, estos repositorios se encuentran en /etc/apt/sources.list
 
 
 
Podemos comprobar que repositorios tenemos añadido:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Línea 1030: Línea 1031:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
+
=== Actualización del listado de paquetes de software ===
== apt/rpm/pacman ==
 
 
 
Todos estos son gestores de paquetes, cada distribución Linux utiliza uno por
 
defecto. Por ejemplo, en debian y ubuntu se utiliza apt, en arch se usa pacman y
 
en suse rmp. Nosotros veremos apt que es el que tra ubuntu, aunque todos son
 
similares.
 
 
 
 
 
=== Actualizar listado de paquetes ===
 
  
 
Para actualizar el listado de paquetes utilizaremos el comando:
 
Para actualizar el listado de paquetes utilizaremos el comando:
Línea 1047: Línea 1039:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
=== Instalación un nuevo paquete ===
  
=== Instalar un nuevo paquete ===
+
Para instalar un nuevo paquete, utilizaremos la orden install, por ejemplo, vamos a instalar tree, similar al ls pero muestra el arbol de directorios:
 
 
Para instalar un nuevo paquete, utilizaremos la orden install, por ejemplo,
 
vamos a instalar tree, similar al ls pero muestra el arbol de directorios:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Línea 1057: Línea 1047:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
=== Desinstalación de un paquete ===
  
=== Eliminar un paquete ===
+
Usaremos la orden purge o la orden remove, purge nos lo eliminad todo, y remove mantiene la configuración en el caso de que el paquete la tuviese. Vamos a eliminar el paquete instalado previamente:
 
 
Usaremos la orden purge o la orden remove, purge nos lo eliminad todo, y remove
 
mantiene la configuración en el caso de que el paquete la tuviese. Vamos a
 
eliminar el paquete instalado previamente:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Línea 1068: Línea 1055:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
= Paso 9: Administración remota con ssh =
 +
 +
''ssh'' (Secure SHell) permite administrar de manera remota un sistema desde el intérprete de órdenes. Para poder acceder a la máquina virtual por medio de ''[[ssh]]'', hay que instalar el paquete ''openssh-server''.
 +
 +
sudo apt-get install openssh-server
 +
 +
Una vez instalado, tenemos que consultar la dirección IP de la máquina virtual
 +
 +
ip address
 +
 +
Desde el hipervisor podemos acceder por ''ssh'' a la máquina virtual con la orden:
 +
 +
ssh usuario@ip
 +
 +
Siendo ''usuario'' el nombre de usuario con el que accedes a la máquina virtual y la dirección ''ip'' que nos muestra la orden ''ip address''.
 +
 +
Por ejemplo, si el usuario seleccionado es ''ubuntu'' y la IP es 192.168.122.123, entonces la invocación a ''ssh'' es la siguiente:
 +
 +
ssh ubuntu@192.168.122.123
  
 +
En caso de que en la maquina virtual no esté instalado openssh-server, puede que la conexión sea rechazada:
 +
ssh: connect to host 192.168.122.123 port 22: Connection refused
  
= Paso 9: Módulos =
+
Para resolver el problema es necesario instalar OpenSSH client en la maquina virtual
  
Los módulos del kernel de Linux son partes que podemos añadir o quitar de forma
+
sudo apt install openssh-client
sencilla con el fin de añadir o quitar funcionalidad. Por ejemplo, algunas de
 
estas funcionalidades son:
 
  
* Registrar temperaturas de nuestros componentes
+
Y a continuación se instala OpenSSH server
* Hacer funcionr la tarjeta de red wifi
 
* Cargar los drivers de una tarjeta gráfica
 
  
 +
sudo apt install openssh-server
  
== lsmod ==
+
En la imagen de Ubuntu Cloud el servicio de ssh viene instalado por defecto, sin embargo no está activo. Para activarlo hay que crear las claves SSH del servidor:
  
Comando para ver los módulos que estamos usando:
+
# ssh-keygen -A
  
<syntaxhighlight lang="bash">
+
además, hay que editar el fichero /etc/sshd/sshd_config para establecer:
lsmod
+
 
</syntaxhighlight>
+
  PasswordAuthentication yes
 +
 
 +
pues está por defecto a ''no''.
  
 +
y luego lanzar el servicio:
  
== lspci y usb-devices ==
+
# systemctl enable ssh
 +
# systemctl start ssh
  
Estos comandos nos servirán para ver el hardware que está conectado a nuestro
+
La orden ''enable'' hace que el servicio se lance la próxima vez que arranque el sistema. La orden lanza el servicio inmediatamente.
ordenador. Con lspci veremos el listado del hardware integrado y con usb-devices
 
el que está conectado por hardware.
 
  
Normalmente, como los módulos se utilizan para dar funcionalidad un hardware,
+
Puedes comprobar que el servicio está lanzado con:
aquí en los listado de hardware podremos ver que módulo está utilizando cada
 
hardware:
 
  
<syntaxhighlight lang="bash">
+
# ss -lt
lspci -v
 
</syntaxhighlight>
 
  
Veremos una línea en algunos dispositivos que nos diga que módulo estamos
+
donde -l muestra los procesos escuchando (listen) en un puerto y -t se refiere a TCP.
usando, pongo un pequeño trozo de la salida del comando:
 
  
<syntaxhighlight lang="bash">
+
La autenticación por ssh mediante usuario y contraseña es un mecanismo susceptible a ataques de diccionario de fuerza bruta. Es más conveniente utilizar ''2-factor authentication'' tales como claves SSH pública y privada.
00:1f.2 SATA controller: Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode] (rev 02) (prog-if 01 [AHCI 1.0])
 
    Subsystem: Red Hat, Inc. QEMU Virtual Machine
 
    Flags: bus master, fast devsel, latency 0, IRQ 35
 
    I/O ports at c0c0 [size=32]
 
    Memory at fcc1d000 (32-bit, non-prefetchable) [size=4K]
 
    Capabilities: <access denied>
 
    Kernel driver in use: ahci
 
    Kernel modules: ahci
 
</syntaxhighlight>
 
  
Vemos que el hardware INTEl Corporation está utilizando el módulo ahci.
+
Para activar autenticación mediante ''2-factor authentication'' tengo que generar el par de claves público y privado:
  
Probemos ahora con usb-devices:
+
ssh-key
  
<syntaxhighlight lang="bash">
+
tienes que establecer una contraseña para proteger la clave privada.
usb-devices
 
</syntaxhighlight>
 
  
Veamos un trozo de código:
+
Una vez creadas, tengo que instalar la clave pública en el servidor:
  
<syntaxhighlight lang="bash">
+
  ssh-copy-id usuario@192.168.122.133
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=480 MxCh= 0
 
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
 
P:  Vendor=0627 ProdID=0001 Rev=00.00
 
S:  Manufacturer=QEMU
 
S:  Product=QEMU USB Tablet
 
S:  SerialNumber=42
 
C:  #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA
 
I:  If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid
 
</syntaxhighlight>
 
  
Vemos que el teclado está utilizando el módulo usbhid
+
A partir de este momento puedes acceder por SSH mediante 2-factor authentication basado en clave pública SSH.
  
 +
ssh usuario@192.168.122.133
  
== insmod ==
+
que te solicita la contraseña que protege tu clave pública.
  
Sirve para cargar un módulo en el kernel, imaginemos que tenemos un módulo que
+
= Ejercicios =
se llama modulo1:
 
  
<syntaxhighlight lang="bash">
+
# Cree un fichero vacio llamado 123.txt
sudo insmod modulo1
+
# Añada al fichero las siguientes tres lineas:
</syntaxhighlight>
 
  
 +
        Hola mundo
 +
        Probando 1 2 3
 +
        Adios
  
== rmmod ==
+
# Añada una linea más al fichero con el siguiente contenido:
  
Sirve para eliminar un módulo de kernel. Imaginemos que queremos borrar un
+
        Prueba
módulo cargado anteriormente con el nombre modulo1:
 
  
<syntaxhighlight lang="bash">
+
# Renombre el fichero 123.txt a 456.txt
sudo rmmod modulo1
+
# Haga una copia del fichero 456.txt al fichero 789.txt
</syntaxhighlight>
+
# Cree la carpeta xyz
 +
# Mueva el fichero 789.txt a la carpeta xyz
 +
# Mueva el fichero 456.txt al temporal
 +
# Borre el fichero 456.txt
 +
# Compruebe si el fichero 789.txt contiene la palabra “mundo”
 +
# Borre la carpeta xyz y su contenido
 +
# Liste el contenido de la carpeta temporal mostrando los permisos asociados a los ficheros y carpetas, almacene el resultado en el fichero temporal.txt
 +
# Cree la carpeta ‘x’ y dentro de ella, la carpeta ‘y’
 +
# Mueva el fichero temporal.txt dentro de la carpeta ‘y’
 +
# Cuente el número de ficheros y directorios en la carpeta tmp
 +
# Muestre el espacio disponible en el raíz del sistema
 +
# Para el fichero temporal.txt, establezca permisos de sólo lectura para el propietario
 +
# Lance 'gedit' desde un terminal, obtenga el PID de dicho proceso y acabe con su ejecución

Revisión actual del 17:29 31 mar 2022

Para realizar esta práctica utilizaremos una de las máquinas virtuales que generamos en la práctica anterior.

En esta práctica aprenderemos a utilizar el interprete de ordenes (también conocido como línea de comandos) y a aprender nociones básicas de administración de sistemas Linux.

Paso 0: Breve introducción al sistema Linux

Estructura básica del sistema de archivos

En un sistema Linux, todas las carpetas y ficheros en el sistema de fichero pende de la carpeta raíz que se representa con la /.

/
├── bin
├── usr
│   ├── local
│   ├── bin
│   └── ...
├── dev
│   ├── sda
│   ├── sda1
│   └── ...
├── home
│   ├── practica
│   │   ├── tema1.pdf
│   │   ├── boletin1.pdf
│   │   └── ...
│   ├── profesor
│   └── ...
└── etc
    ├── firefox
    ├── libvirt
    ├── ...
    └── ...

Como puedes observar, el sistema de fichero emplea una estructura de árbol.

Nociones básicas

·Aplicaciones con nombres compuestos: usar guion entre palabras

·Nombres con espacios en blanco: Escribir entre comillas dobles

·Espacios en blanco para separar ordenes (ej: instalar varios paquetes )

·Formato general de una orden: comando [-opciones] [argumentos]

·IMPORTANTE: Diferencia entre mayúsculas y minúsculas

Carpetas . y ..

Toda carpeta en un sistema Linux dispone de dos pseudocarpetas, la .' y la ..:

  • La pseudocarpeta .. hace referencia a la carpeta padre que contiene a esta carpeta.
  • La pseudocarpeta . hace referencia a la carpeta actual, es por tanto una autoreferencia.

En el caso de la carpeta raíz, la pseudocarpeta . y .. hacen referencia a la propia carpeta raíz, se trata, por tanto de una excepción.

Directorio de trabajo actual y la orden cd

Cada interprete de ordenes dispone de una carpeta de trabajo actual (current working directory, en inglés). La carpeta de trabajo actual se puede modificar con la orden cd (change directory, en inglés).

Por ejemplo:

$ cd ..

Nos situaría en la carpeta padre, empleando una ruta relativa.

Si volvemos a escribir desde /home " cd .. " nos lleva a /$

Para situarnos en el raíz, podemos emplear una ruta absoluta:

$ cd /

En caso de que queramos volver a la carpeta de usuario, bastaría con invocar a cd sin más o cd ~

$ cd

MUY IMPORTANTE: No es lo mismo cd.. que cd .. , es necesario el espacio después del cd.

Rutas absolutas, rutas relativas

Para hacer referencia a un fichero o una carpeta se usan ruta absolutas o rutas relativas.

Las rutas absolutas siempre empieza por /, de manera que toman como punto de referencia la carpeta raíz (/). Por ejemplo, una ruta absoluta a la carpeta prueba que está almacenada en la carpeta del usuario ubuntu es '/home/ubuntu/prueba/'.

Las ruta relativa toma como referencia la carpeta de trabajo actual. Para averiguar la carpeta de trabajo actual disponemos de la orden pwd.

$ pwd
/home/ubuntu

En base a la carpeta de trabajo actual, empleando la pseudocarpeta .., se puede construir rutas relativas. Por ejemplo, para referenciar un fichero fichero.txt en la carpeta temporal, podemos emplear la ruta relativa ../../tmp/fichero.txt.

Aunque probablemente sea más cómodo emplear una ruta absoluta en este caso, que sería /tmp/fichero.txt.

Intérprete de órdenes

El intérprete de órdenes es un lanzador de aplicaciones textual que emplea el teclado como dispositivo de entrada de datos. Mediante el teclado, se escribe el nombre del programa que se quiere lanzar y al pulsa la tecla intro el intérprete de ordenes ejecutara dicho programa. Por defecto, el intérprete de ordenes que emplea Ubuntu por defecto es bash.

man: ver la página de manual de una orden

La orden man te será útil para ver las páginas de manual.

Su estructura básica es:

man <comando>

Aunque también se utiliza con la opción -a de All, que también muestra las entradas comenzadas por .:

man -a <comando>

Este programa toma como entrada el nombre de la orden de la que quieres consultar su página de manual, por ejemplo:

man ls

Nos da información del manual de la orden ls.

Para salir de la página de manual, pulsa la tecla q (la primera letra de la palabra quit, en inglés).

quit = salir

Normalmente, los programas ofrecen opciones de ayuda, como --help.

man --help

También se puede emplear la versión compacta a la hora de especificar opciones.

man -h

En general, todas las ordenes suelen ofrecer una opción de ayuda.

Paso 1: Operaciones básicas con el sistema de ficheros

ls

Lista los ficheros y carpetas. Si no se especifica nada, muestra los ficheros y carpetas que contiene la carpeta de trabajo actual.

ls

Si se especifica una ruta, muestra las carpetas y ficheros contenidos en dicha ruta, por ejemplo:

$ ls /
bin  boot  data  dev  etc  home  initrd.img  initrd.img.old  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  sys  tmp  usr  var  vmlinuz  vmlinuz.old

Al emplear / como ruta absoluta, muestra el contenido de la carpeta raíz.

Las opciones más usadas de este programa suelen ser:

  • -a: muestra los ficheros y carpetas ocultos. En Linux, cualquier fichero o carpeta cuyo nombre empiece por . se considera oculto. Esto incluye también en el listado las pseudocarpetas . y ..
  • -l: se muestra en lista y aporta datos como la fecha de última modificación, propietario, grupo, tamaño en bytes y nombre:
$ ls -a

.  ..  .bash_history  .bash_logout  .bashrc  .profile  .ssh

Ambas opciones se puede combinar:

$ ls -la /

total 92
drwxr-xr-x  24 root root  4096 Aug 28 09:50 .
drwxr-xr-x  24 root root  4096 Aug 28 09:50 ..
drwxr-xr-x   2 root root  4096 Aug 22 12:37 bin
drwxr-xr-x   4 root root  4096 Aug 22 12:37 boot
drwx------   3 root root  4096 Aug 28 09:50 data
drwxr-xr-x  18 root root  3780 Aug 28 09:46 dev
[...]

Otras opciones útiles son:

  • -s : muestra el tamaño en bloques de cada archivo
  • -t : aporta el día y la hora de modificación
  • -R : lista también las subcarpetas
  • --color : muestra el contenido coloreado


Los permisos se emplean en base a tres capacidades:

  • Lectura, que se codifica con r (read, en inglés).
  • Escritura, que se codifica con w (write, en inglés).
  • Ejecutación, que se codifica con x (execute, en inglés).

La primera columna muestra los permisos que codifican:

  • Tipo de entrada: d indica directorio (carpeta).
  • Permisos del propietario, primera terna de rwx
  • Permisos del grupo, segunda terna de rwx
  • Permisos para el resto del mundo, tercera terna de rwx.

A continuación, aparecen el propietario y el grupo, seguidos de la fecha de última modificación y el nombre del fichero o carpeta.

La ayuda ( help ) en ls solo funciona con ls --help no con ls -h

mkdir

Crea un nuevo directorio.

$ mkdir test

Crea una carpeta test en el directorio actual.

Comprobemos que se ha creado bien:

$ ls
test

Con la opción -p, permite crear sucesivas carpetas anidadas de una sola vez, por ejemplo:

$ mkdir -p a/b/c

Que crea la siguiente estructura de carpetas.

a
└── b
    └── c

touch

Crea un nuevo fichero vacío (sin contenido) con el nombre que especifiquemos.

$ touch file.txt

Comprobamos que el fichero se ha creado correctamente.

$ ls
file.txt

cp

Copia un fichero o directorio.

$ cp file.txt file_copy.txt

Para copiar una carpeta y su contenido tenemos que usar la opción -r (recursivo).

$ cp -r test test_copy
  • Comprobamos el resultado con la orden ls.
  • Si nos encontramos en la carpeta destino, la estructura sería la siguiente:
$ cp <nombre ruta origen> <nombre archivo>

mv

Mueve fichero o carpeta.

mv file_copy.txt file2.txt

También se emplea para renombrar.

mv test_copy test_copy2

rm

  • Borra un fichero o carpeta vacía:
rm <nombre>
  • Para borrar una carpeta no vacía y su contenido:
rm -r <nombre>

IMPORTANTE: No hacer jamás rm -r *

  • EJERCICIOS:
  1. Crear la siguiente estructura dentro del directorio /tmp (usar los comandos mkdir, touch y cp):
/tmp
├── carpeta1
├── carpeta2
│   ├── fichero1.txt
│   └── fichero2.md
└── carpeta3
    ├── fichero1.txt
    └── fichero2.md
  1. Basándonos en el ejercicio anterior, cambiar la estructura a la siguiente (usar comandos mv y rm):
/tmp
└── carpeta
    ├── fichero1.txt
    └── fichero2.md

Paso 2: Impresión por pantalla y redirección de salida

echo

Sirve para imprimir una línea de texto por pantalla o variables de entorno. Además, nos permite escribir en ficheros.

echo <opción> <texto>
  • Opciones curiosas:

-e <PALABRA \bPALABRA> Se eliminan los espacios entre las palabras

-e <PALABRA \nPALABRA> Se añaden saltos de línea


Una variable de entorno es una variable editada con algún valor, por defecto existen algunas creadas, como por ejemplo la variable HOME, que contiene el directorio del usuario:

echo $HOME

Aprovecharemos y crearemos una variable nosotros:

ME="my name"

Comprobamos:

echo $ME

Redirección de salida

> y >> sirve para redirigir una salida. Por ejemplo, utilizando el comando echo, podemos enviar un texto dentro de un fichero:

echo "Esto es una prueba" > file.txt

La diferencia entre > y >> es que > sobrescribe lo que haya en el fichero y añade el contenido, y >> no sobrescribe, solo añade el nuevo contenido.

Hagamos la prueba:

echo "Esto es una prueba" > file.txt
echo "Esto es una prueba2" > file.txt
echo "Esto es una prueba" >> file2.txt
echo "Esto es una prueba2" >> file2.txt

En cualquier caso, si el fichero no existe, se crea.

Paso 3: Manejo de ficheros y carpetas avanzado

cat

  • Muestra el contenido de un fichero:
cat file.txt
cat <fichero1> <fichero2>
  • Crea un fichero:
cat ><nombre archivo>

GUARDAR FICHERO: Pulsamos ENTER y luego CTRL + D

  • Añadir más lineas al fichero:
cat >><nombre fichero>
  • Concatenar ficheros:
cat <fichero1> <fichero2> > <fichero3>

cat > <fichero4> </syntaxhighlight>

grep

Sirve para localizar coincidencias de un cierto patrón en ficheros y muestra la coincidencia, en caso de encontrarla, por pantalla.

grep <opción> <patrón> <archivos donde buscar>

Por ejemplo, para buscar el patrón prueba en el fichero fichero.txt.

$ grep -n prueba fichero.txt
1:Esto es una prueba
  • Principales opciones del comando:

-c : Escribe el número de líneas encontradas.

-i : No distingue entre mayúsculas y minúsculas.

-l : Muestra los nombres de los ficheros que contienen los caracteres buscados.

-n : Cada línea es precedida por su número en el fichero.

-s : No se muestran los mensajes que indican que no se puede abrir un fichero.

-v : Muestra sólo las líneas que no cumplen la condición.

wc

Sirve para contar el número de palabras, caracteres, líneas o bytes que contiene un fichero.

Las opciones más utilizadas son:

  • -l: muestra el número de líneas que contiene el fichero.
  • -w: muestra el número de palabras.
  • -m: muestra el número de caracteres
  • -c: muestra el número de bytes

Probemos y contemos todo en el fichero file2.txt:

wc -l file2.txt
wc -w file2.txt
wc -m file2.txt
wc -c file2.txt

Podemos contar más de un fichero a la vez:

wc -l file.txt file2.txt

Nos mostrará el conteo de cada fichero y el total.

find

Para buscar ficheros podemos usar la orden find.

Por ejemplo, para buscar el fichero python3 en todo el árbol de directorio (desde el raíz) podemos usar la orden:

find / -name python3

Podemos restringir la búsqueda a ficheros con -type f

find / -type f -name python3

o para directorios con -type d

Tubería (|)

La tubería nos servirá para conectar varios comandos al mismo tiempo, veamos unos ejemplos, que siempre se entiende mejor:

cat file2.txt | grep prueba
grep -nr prueba file2.txt | wc -l

En el primer ejemplo, mostramos el contenido de file2.txt, y esta salida se la pasamos al comando grep, el cual busca las líneas que contengan prueba.

En el segundo, buscamos todas las líneas que contengan la palabra prueba, y esta salida se la pasamos al comando wc, el cual cuenta las líneas de la salida del comando grep.


Redirecciones

Vamos a ver unos conceptos antes de seguir:

  • Entrada estándar: representa los datos que necesita una aplicación para funcionar, como por ejemplo un archivo de datos o información ingresada desde la terminal y es representado en la terminal como el tipo 0.
  • Salida estándar: es la vía que utilizan las aplicaciones para mostrarte información, allí podemos ver el progreso o simplemente los mensajes que la aplicación quiera darte en determinado momento y es representado en la terminal como el tipo 1.
  • Error estándar: es la forma en que los programas te informan sobre los problemas que pueden encontrarse al momento de la ejecución y es representado en la terminal como el tipo 2.

Las redirecciones nos sirven para mover la información de un tipo a otro.

Ya vimos previamente el uso de > y >>, y también el |, veamos algunas más:

  • comando < fichero: Toma la entrada de fichero
  • comando 2> fichero: Envía la salida de error de comando a fichero
  • comando 2>&1: Envía la salida de error a la salida estándar
  • comando &> fichero: Envía la salida estándar y de error a fichero; equivale a comando > fichero 2>&1

Paso 4: Usuarios y grupos

whoami

Sirve para obtener el usuario actual.

whoami

Lo más seguro es que nos aparezca ubuntu.


who

Es para saber quien está ahora mismo en la máquina conectado.

who

Seguramente solo estemos nosotros:

ubuntu   pts/0        2019-08-28 13:51 (192.168.122.1)


su y sudo

su (substitute user): sirve para cambiar de usuario. Por ejemplo:

su root

Aquí nos pedirá la contraseña del usuario al que queramos cambiar.

sudo (super user do): no todas las distribuciones lo integran, porque es menos seguro que su, este comando nos permite ejecutar un comando siendo otro usuario, por defecto, si no le damos usuario, lo hará con el usuario root. Si sudo nos pide contraseña, nos pide la contraseña del usuario, ya que el usuario es que el tiene permisos para usar sudo o no.

sudo ls -a /root

Si tuviéramos por ejemplo un usuario 'practica' y quisíeramos ejecutar un comando en su nombre:

sudo -u practica ls

Como root puedo añadir usuarios para que puedan hacer sudo así:

adduser usuario sudo

Esto hace que el usuario usuario pueda hacer sudo


adduser y useradd

Ambos comandos sirven para crear un nuevo usuario, pero tienen sus diferencias.

useradd es un comando del sistema, y adduser es un script escrito en perl que utiliza el comando useradd. La diferencia así de primeras es que adduser nos crear el directorio /home/usuario y useradd necesita la opción -m para hacer lo mismo. Se puede utilizar el que se quiera, aunque es más recomendable useradd, ya que funcionará igual en todas las distribuciones.

Vamos a añadir un usuario practica con su directorio en /home (notemos que necesitamos permisos de super usuario para realizar esta tarea):

sudo useradd -m practica

Vamos a comprobar que el directorio home está creado y que el usuario practica funciona:

ls /home  # veremos el directorio practica
sudo -u practica whoami  # nos dirá que somo el usuario practica


passwd

Sirve para modificar la contraseña de un usuario, por ejemplo, vamos a modificar la contraseña del usuario que hemos creado previamente:

sudo passwd practica

Nos preguntará dos veces la contraseña, y ya la tendremos actualizadas. Vamos ahora a probar ahora el comando su para cambiar de usuario:

su practica
whoami

Veremos que hemos cambiado de usuario, para cerrar este usuario, escribimos 'exit' o pulsamos 'CTLR + D'


deluser y userdel

Ambos sirven para borrar un usuario, similar a adduser y useradd, userdel es el comando y deluser el script.

Vamos a borrar el usuario que hemos creado, incluyendo el borrado de su /home (opción -r):

userdel -r practica

Comprobemos que ya no tenemos usuario ni /home:

ls /home
sudo -u practica whoami


addgroup y groupadd

Ambos sirven para crear un grupo. Los grupos sirven para agrupar a los usuarios y que estos tengan unos mismos permisos. Por ejemplo, cuando instalamos algunas herramientas como por ejemplo docker, este crea el grupo docker automáticamente para que fácilmente podamos añadir a un usuario al grupo, y este tenga los permisos para trabajar con dicha herramienta.

Vamos a crear un nuevo grupo, vamos a llamarle invitado:

sudo groupadd invitado


usermod y groups

usermod es utilizado para asignar un grupo a un usuario.

groups es utilizado para ver los grupos a los que pertenece un usuario.

Vamos a añadir a un usuario practica, lo vamos a añadir al grupo invitado y veremos los grupos a los que pertenece:

sudo useradd -m practica
sudo usermod -G invitado practica
groups practica

Veremos que el usuario práctica pertenece al grupo invitado.


delgroup y groupdel

Ambos sirven para eliminar un grupo. Vamos a eliminar el grupo que hemos creado anteriormente:

sudo groupdel invitado

Podemos observar ahora que el usuario practica no pertenece al grupo invitado:

groups practica


Paso 5: Permisos

Nomenclatura rwx y numérica

Si hacemos un ls -l, la primera cadena que nos aparece son los permisos del fichero (-rwxrw-r--), podemos dividirlo en 4 elementos:

- (rwx) (rw-) (r--) | | | | type owner group others

  • type: el tipo de fichero, pudiendo ser d (directorio), l (enlace simbólico), - (fichero normal)
  • owner: permisos de propietario
  • group: permisos de grupo
  • others: permisos para los demás usuarios

Significado de los permisos:

  • r: permisos de lectura
  • w: permisos de escritura
  • x: permisos de ejecución

Por último, existe un modo abreviado para estos permisos que se utiliza con números.

rwx 001 en binario es 1 en decimal. Permisos de ejecución 010 en binario es 2 en decimal. Permisos de escritura 100 en binario es 4 en decimal. Permisos de lectura

La suma de los permisos, nos da el valor numérico. Veamos un ejemplo: rwx rw- r-- 110 110 100

6   6   4

Ojo: ¡No emplee nunca los permisos 777 (rwxrwxrwx) cuando tenga problemas con los permisos!

chmod

Permite cambiar los permisos de acceso a un fichero o directorio. Podemos dar permisos de dos formas diferentes.


modo carácter

Veamos primero unos detalles:

Clases de usuario:

  • owner (u)
  • group (g)
  • others (o)
  • all (a)

Modificador:

  • añadir (+)
  • eliminar (-)
  • sobrescribir (=)

Para dar permisos tendríamos que seleccionar la clase de usuario el modificador y los permisos, veamos un ejemplo:

chmod u+x file  # añadimos permisos de ejecución al usuario
chmod go-w file  # quitamos permisos de escritura al grupo y a otros usuarios
chmod u=rwx,go=r file  # Al usuario le damos todos los permisos, y al grupo y otros solo le damos permisos de lectura


Modo octal

Con el modo octacl, es como si siempre utilizáramos el modificar sobrescribir, pongamos algunos ejemplos:

chmod 644 file  # Al usuario le damos permiso de lectura y escritura al usuario, y al grupo y otros solo le damos permisos de lectura
chmod 600 file  # solo el propietario tiene permisos de lectura y escritura

Ejemplos

Vamos a ver como funciona el tema de permisos con unos ejemplos. Vamos a crear un fichero pruebas y le vamos a quitar los permisos de escritura a nuestro usuario, y le vamos a dar permisos de escritura a otros:

touch pruebas
ls -l pruebas  # de esta forma veremos que por defecto los permisos son rw-rw-r--
chmod u-w,o+w pruebas
ls -l pruebas  # ahora los permisos deberían ser -w-rw-rw-

Una vez dado los permisos, veamos que con nuestro usuario podemos leer pero no escribir:

cat pruebas
echo "probando" > pruebas
exit

Y ahora vamos a ver que el usuario pruebas, puede leer y escribir:

su practica
cat pruebas
echo "probando" > pruebas


chown

Permite cambiar el propietario de un fichero o directorio.

Vamos por ejemplo a pasarle ahora el fichero pruebas al usuario practica:

sudo chown practica pruebas
ls -l pruebas

Veremos que el usuario actual ahora es pruebas, aunque vemos que el ls muestra lo siguiente:

-r--rw-rw- 1 practica ubuntu 9 Aug 29 09:34 pruebas

Hay que comentar un detalle, y es que los ficheros y directorios tienen asignado un usuario y un grupo, por defecto se utiliza el mismo usuario como grupo cuando creamos un nuevo fichero o directorio. Si queremos que cuando cambiemos el propietario, cambiar tambien el grupo del fichero, podemos hacerlo de la siguiente forma:

sudo chown practica:practica pruebas

Una vez hecho esto, vamos ahora a probar que los permisos siguen funcionando como antes, ahora con el usuario ubuntu, deberíamos de poder leer y escribir en el fichero pruebas, y con el usuario practica, solo leer, esto es así por que ahora el propitario es practica:

# Pruebas usuario ubuntu
cat pruebas
echo test >> pruebas
# Pruebas usuario practica
su practica
cat pruebas
echo "probando" > pruebas
exit


Paso 6: Procesos

ps

Sirve para ver que procesos están ejecutándose en el sistema, veamos un ejemplo:

ps aux  # con la opción aux mostraremos todos los procesos del sistema

Cada línea es un proceso, y cada proceso muestra su PID, usuario, cantidad de memoria y cpu utilizada, comando y otros detalles.

man kill &  # añadir el & al final de un comando hace que este se ejecute en segundo plano, por lo que se quedará abierto

La salida de este comando nos mostrará el PID que tiene ese proceso que acabamos de ejecutar, vamos a comprobarlo:

ps aux | grep "man kill"

Veremos que el PID coincide.


kill

Este comando nos servirá para matar un proceso. kill se utiliza seguido de una señal para enviar al proceso seguido de uno o varios PID. para ver las señales disponibles, podemos listarlas:

kill -l

Las más utilizadas suele ser SIGTERM y SIGKILL, la primera intenta terminar el proceso de forma poco abrupta, y la segunda suele utilizarse cuando el proceso no atiende a esta primera señal. Vamos ahora a terminar el proceso que creamos antes, si no recordamos el PID, busquémoslo de nuevo:

ps aux | grep "man kill"

Enviamos señal para terminar el proceso y comprobamos que ha terminado:

kill -SIGTERM 8470
ps aux | grep "man kill"

También podemos notar que en el listado de señales, hay unos números, podemos utilizar esos números en vez de las palabras, por ejemplo:

man kill &
kill -15 PID_COMANDO_PREVIO

Comprobamos que el proceso ha terminado correctamente:

ps aux | grep "man kill"


Paso 7: Estado CPU, RAM y Disco

top

Este comando nos servirá para ver el listado de procesos y el estado de la CPU y memoria.

Probemos el comando y observemos detalladamente la salida:

top

Para salir, pulsamos q.


df y du

df (disk free) y du (disk usage). Ambas son utilidades para mostrar el uso de los discos.

Con df mostraremos la información del espacio en cada dispositivo montado:

df

Estos comandos que nos muestran el tamaño de los ficheros, casi siempre tienen una opción para mostrarlo en un formato más legible (-h)

df -h

Mucho mejor.

Ahora veamos el comando du, el cual nos mostrará el tamaño de un fichero o directorio y sus subdirectorios, no olvidemos el -h:

du -h /home/ubuntu
du -h /home/ubuntu/pruebas

Si solo quisíeramos saber el total de una carpeta y nos nos interesan sus subcarpetas, podemos utilizar la opción -s:

du -sh /home/ubuntu


free

Sirve para ver el estado de la memoria, como siempre, opción -h:

free -h


lsblk

Nos muestra la información de todos los dispositivos de bloques (discos duros, pendrivers, CD_ROM, SSD, ...).

lsblk

En la siguiente práctica se utilizará más a fondo este comando, ya que trabajaremos con dispositivos.


Paso 8: Gestión de paquetes de software y repositorios

Los sistemas Linux incluyen, además de las herramientas básicas del sistema operativo, repositorios de software que puede ser opcionalmente instalados por el administrador del sistema. Los fabricantes de las distribuciones de Linux incluyen paquetes de software listos para ser instalados que se integran con el sistema.

Un paquete incluye el software necesario para que una cierta aplicación funcione correctamente, así como sus paquetes de dependencia.

En Ubuntu, la herramienta de gestión de paquetes de software y repositorios se llama apt.

Listado de repositorios de paquetes de software

En Ubuntu el listado de repositorios se encuentra en el fichero /etc/apt/sources.list. Podemos comprobar que repositorios tenemos añadido:

cat /etc/apt/sources.list

Actualización del listado de paquetes de software

Para actualizar el listado de paquetes utilizaremos el comando:

sudo apt update

Instalación un nuevo paquete

Para instalar un nuevo paquete, utilizaremos la orden install, por ejemplo, vamos a instalar tree, similar al ls pero muestra el arbol de directorios:

sudo apt install tree

Desinstalación de un paquete

Usaremos la orden purge o la orden remove, purge nos lo eliminad todo, y remove mantiene la configuración en el caso de que el paquete la tuviese. Vamos a eliminar el paquete instalado previamente:

sudo apt purge tree

Paso 9: Administración remota con ssh

ssh (Secure SHell) permite administrar de manera remota un sistema desde el intérprete de órdenes. Para poder acceder a la máquina virtual por medio de ssh, hay que instalar el paquete openssh-server.

sudo apt-get install openssh-server

Una vez instalado, tenemos que consultar la dirección IP de la máquina virtual

ip address

Desde el hipervisor podemos acceder por ssh a la máquina virtual con la orden:

ssh usuario@ip

Siendo usuario el nombre de usuario con el que accedes a la máquina virtual y la dirección ip que nos muestra la orden ip address.

Por ejemplo, si el usuario seleccionado es ubuntu y la IP es 192.168.122.123, entonces la invocación a ssh es la siguiente:

ssh ubuntu@192.168.122.123

En caso de que en la maquina virtual no esté instalado openssh-server, puede que la conexión sea rechazada:

ssh: connect to host 192.168.122.123 port 22: Connection refused

Para resolver el problema es necesario instalar OpenSSH client en la maquina virtual

sudo apt install openssh-client

Y a continuación se instala OpenSSH server

sudo apt install openssh-server

En la imagen de Ubuntu Cloud el servicio de ssh viene instalado por defecto, sin embargo no está activo. Para activarlo hay que crear las claves SSH del servidor:

# ssh-keygen -A

además, hay que editar el fichero /etc/sshd/sshd_config para establecer:

 PasswordAuthentication yes

pues está por defecto a no.

y luego lanzar el servicio:

# systemctl enable ssh
# systemctl start ssh

La orden enable hace que el servicio se lance la próxima vez que arranque el sistema. La orden lanza el servicio inmediatamente.

Puedes comprobar que el servicio está lanzado con:

# ss -lt

donde -l muestra los procesos escuchando (listen) en un puerto y -t se refiere a TCP.

La autenticación por ssh mediante usuario y contraseña es un mecanismo susceptible a ataques de diccionario de fuerza bruta. Es más conveniente utilizar 2-factor authentication tales como claves SSH pública y privada.

Para activar autenticación mediante 2-factor authentication tengo que generar el par de claves público y privado:

ssh-key

tienes que establecer una contraseña para proteger la clave privada.

Una vez creadas, tengo que instalar la clave pública en el servidor:

ssh-copy-id usuario@192.168.122.133

A partir de este momento puedes acceder por SSH mediante 2-factor authentication basado en clave pública SSH.

ssh usuario@192.168.122.133

que te solicita la contraseña que protege tu clave pública.

Ejercicios

  1. Cree un fichero vacio llamado 123.txt
  2. Añada al fichero las siguientes tres lineas:
       Hola mundo
       Probando 1 2 3
       Adios
  1. Añada una linea más al fichero con el siguiente contenido:
       Prueba
  1. Renombre el fichero 123.txt a 456.txt
  2. Haga una copia del fichero 456.txt al fichero 789.txt
  3. Cree la carpeta xyz
  4. Mueva el fichero 789.txt a la carpeta xyz
  5. Mueva el fichero 456.txt al temporal
  6. Borre el fichero 456.txt
  7. Compruebe si el fichero 789.txt contiene la palabra “mundo”
  8. Borre la carpeta xyz y su contenido
  9. Liste el contenido de la carpeta temporal mostrando los permisos asociados a los ficheros y carpetas, almacene el resultado en el fichero temporal.txt
  10. Cree la carpeta ‘x’ y dentro de ella, la carpeta ‘y’
  11. Mueva el fichero temporal.txt dentro de la carpeta ‘y’
  12. Cuente el número de ficheros y directorios en la carpeta tmp
  13. Muestre el espacio disponible en el raíz del sistema
  14. Para el fichero temporal.txt, establezca permisos de sólo lectura para el propietario
  15. Lance 'gedit' desde un terminal, obtenga el PID de dicho proceso y acabe con su ejecución