Material‎ > ‎Software‎ > ‎

Introducción a Linux & Bash scripting

Introducción a Linux

Por qué un programador debería utilizar linux ?
  • Cuestiones técnicas:
    • Porque es probable que en un trabajo tenga que eventualmente usar un linux. Ej: entrar a un server remotamente por consola (SSH). Copiar cosas remotamente, deployar una solucion, etc.
    • para agilizar su trabajo y cumplir el D.R.Y. evitando tareas repetitivas. Ejemplo, aquellas tareas que debo hacer para manipular archivos, fuera del IDE. Podría hacer scripts.
    • Por puro interes y crecimiento técnico: aprender nuevos lenguajes de programación, especialmente los de scripting como bash, python, perl, etc. nos da una visión más amplia de la programación.
  • Cuestiones sociales/filosóficas:
    • Porque en definitiva GNU linux es la iniciativa y el trabajo de programadores como nosotros, con fines altruistas de construir un sistema operativo compartido, gratuito y abierto. El cual puede ser extendido.

Temas básicos


Archivos, carpetas, y filesystem en linux.

Explicar el sistema de archivos de linux excede el objetivo de este mini apunte, así que los expertos en linux deberán disculparnos acá pero vamos a aplicar algunas pequeñas metáforas para simplificar y transmitir el concepto aunque diste de la realidad un poco.

Linux parte como un proyecto para crear un sistema operativo similares a Unix pero de libre distribución y open source. Con lo cual, parte de la idea de un kernel independiente de una interfaz gráfica.
Es decir, la interfaz gráfica que usamos, por ejemplo en Ubuntu, es como una "capa" por sobre el sistema operativo, que permite una interacción más user friendly. Pero en definitiva, todo lo que hacemos a través de la UI se puede hacer interactuando con el kernel a través de formas más "rústicas".
La forma clásica, y anterior a la interfaz gráfica es la consola o terminal.

Para los que venimos del mundo windows, la terminal sería similar a la consola de ms-dos.
Aunque una terminal linux es infinito más poderosa.

Desde d.o.s. estábamos acostumbrados a movernos entre directorios físicos, es decir entre archivos y directorios que estaban alojados en un dispositivo físicamente (disco rígido).

Desde una terminal o consola linux no es tan así. La estructura arborea no solo representa los archivos y carpetas físicos de los dispositivos, sino muchas otras cosas del sistema operativo.
En estas terminales los conceptos de carpetas y archivos se usan como metáforas para modelar otras cosas además.

Veamos un ejemplo concreto y fácil.
La carpeta /proc por ejemplo no es un archivo físico en un disco rígido, sino un nodo virtual que representa información de la parte hardware del sistema.  Por ejemplo, si consultamos el "archivo" /proc/cpuinfo con el comando cat (ver explicación del comando más adelante) nos mostrará información del microprocesador

jfernandes@vitalogy:$ cat /proc/cpuinfo
processor    : 0
vendor_id    : GenuineIntel
cpu family    : 6
model        : 23
model name    : Intel(R) Core(TM)2 Duo CPU     P8600  @ 2.40GHz
stepping    : 10
cpu MHz        : 800.000
cache size    : 3072 KB
physical id    : 0
siblings    : 2
core id        : 0
cpu cores    : 2
apicid        : 0
initial apicid    : 0
fdiv_bug    : no
hlt_bug        : no
f00f_bug    : no
coma_bug    : no
fpu        : yes
fpu_exception    : yes
cpuid level    : 13
wp        : yes
flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm ida tpr_shadow vnmi flexpriority
bogomips    : 4787.23
clflush size    : 64
cache_alignment    : 64
address sizes    : 36 bits physical, 48 bits virtual
power management:

Otras ejemplos:
  • cat /proc/meminfo: provee información de la memoria del sistema (ej, memoria utilizada, libre, física, virtual, etc)
  • cat /proc/sys/kernel/hostname: nos devuelve el nombre asignado a nuestra máquina.
  • cat /proc/sys/kernel/osrelease: retorna el número de versión del kernel.
  • etc:
Pueden navegar el directorio /proc para ver qué información está disponible ahí para consultar.
Y acá está lo poderoso de esta metáfora.
Como la información del sistema y en realidad todos los conceptos del kernel estan representados como directorios y archivos, podemos utilizar las mismas herramientas que usamos para manipular archivos físicos, para manipular estos otros conceptos.

Más adelante, luego de ver los comandos básicos, vamos a volver a este punto para ver cómo podemos aplicar esos comandos para hacer tareas administrativas o de configuración del sistema operativo con ellas, sin necesidad de ir con el mouse a "Sistema->Panel de Control" etc...

Por ahora resumimos un poco lo que representa cada carpeta desde la raiz:
  • / : llamado root es la raiz a todo el filesystem
  • /home: donde se alojan los directorios propios para cada usuario. Ej: /home/miusuario
  • /bin: comando escenciales disponibles para todos los usuarios.
  • /etc: contiene configuraciones.
  • /lib: librerías reutilizables entre los comandos escenciales.
  • /proc: info del kernel y los procesos
  • ...


A continuación vamos a mostrar algunos ejemplos de comandos básicos relacionados con archivos y carpetas

Listar el contenido de una carpeta ("ls"):


jfernandes@vitalogy:~$ ls
apachetomcat-stdout.2012-02-27.log  Desktop           fbgateway.log  Pictures     scripts              tomcat-lib.xml  workspace
DE6626-tracing-dd-flow.log          Documents         features       plugins      soapui-settings.xml  traceall.sh
DE6626-tracing-dd.log               Downloads         index.html     Public       temp                 traceddpost.sh
default-soapui-workspace.xml        examples.desktop  Music          reportdd.sh  Templates            Videos

Por default listo solamente los nombres y en columnas. Esto se puede cambiar a través de parámetros.
Por ejemplo, para listar en filas y con más información por archivo:

jfernandes@vitalogy:~$ ls -l
total 109224
-rw-rw-rw-  1 jfernandes jfernandes 111722496 2012-02-27 16:16 apachetomcat-stdout.2012-02-27.log
-rw-r--r--  1 jfernandes jfernandes      1477 2012-03-21 12:34 DE6626-tracing-dd-flow.log
-rw-r--r--  1 jfernandes jfernandes      4200 2012-03-21 12:37 DE6626-tracing-dd.log
-rw-r--r--  1 jfernandes jfernandes       287 2012-03-08 15:55 default-soapui-workspace.xml
drwxr-xr-x  3 jfernandes jfernandes      4096 2012-03-19 09:39 Desktop
drwxr-xr-x  9 jfernandes jfernandes      4096 2012-02-24 12:03 Documents
drwxr-xr-x  2 jfernandes jfernandes      4096 2012-03-21 11:21 Downloads
-rw-r--r--  1 jfernandes jfernandes       179 2011-11-29 13:32 examples.desktop
-rw-r--r--  1 jfernandes jfernandes         0 2012-01-23 11:01 fbgateway.log
drwxr-xr-x  2 jfernandes jfernandes      4096 2009-11-06 15:45 features
-rw-r--r--  1 jfernandes jfernandes     15965 2012-01-05 10:54 index.html
drwxr-xr-x 14 jfernandes jfernandes      4096 2012-03-21 11:23 Music
drwxr-xr-x  3 jfernandes jfernandes      4096 2012-03-20 15:40 Pictures
drwxr-xr-x  2 jfernandes jfernandes      4096 2009-11-06 15:45 plugins
drwxr-xr-x  2 jfernandes jfernandes      4096 2011-11-29 13:44 Public
-rwxr-xr-x  1 jfernandes jfernandes       260 2012-02-24 12:15 reportdd.sh
drwxr-xr-x  2 jfernandes jfernandes      4096 2012-03-16 16:52 scripts
-rw-r--r--  1 jfernandes jfernandes      9593 2012-03-08 15:55 soapui-settings.xml
drwxr-xr-x  8 jfernandes jfernandes      4096 2012-03-21 13:06 temp
drwxr-xr-x  2 jfernandes jfernandes      4096 2011-11-29 13:44 Templates
-rw-r--r--  1 jfernandes jfernandes      3296 2012-02-02 14:35 tomcat-lib.xml
-rw-r--r--  1 jfernandes jfernandes       146 2012-02-28 15:00 traceall.sh
-rwxr-xr-x  1 jfernandes jfernandes       670 2012-02-28 14:29 traceddpost.sh
drwxr-xr-x  3 jfernandes jfernandes      4096 2011-11-30 12:54 Videos
drwxr-xr-x  3 jfernandes jfernandes      4096 2011-12-15 19:01 workspace

Como la gran mayoría de los comandos de linux, vienen con archivos de ayuda y documentación llamados man pages. Y esta ayuda se puede consultar a su vez con un comando muy básico y útil, llamado man.

Ejemplo:

jfernandes@vitalogy:~$ man ls

Imprimir un texto en consola (echo)

Este comando echo recibe un único parámetro, un texto, y lo muestra en consola. De ahí su nombre "eco".
Si bien así en el aire parece un comando tonto, y uno se preguntaría para qué podría servir, dentro de un script (programa: una serie de invocaciones a comandos y funciones) va a tener bastante sentido.

Veamos un ejemplo:

jfernandes@vitalogy:~$ echo "Hola Linux"
Hola Linux

Redireccionando las salidas de los comandos (>)

Ahora, para mostrar los próximos ejemplos de manejo de archivos, necesitamos un archivo.
Una (de muchas) formas de hacer esto es utilizando el comando echo pero redireccionando la salida del mismo hacia un archivo. En lugar de que imprima el texto en la consola, lo va a escribir a un nuevo archivo.

jfernandes@vitalogy:~$ echo "Hola Linux" > miarchivo

Estos comandos, al igual que en los programas C (si recuerdan programación en C) tienen asociados 3 streams diferentes e importanes. Un stream es como una canal por donde se pueden pasar datos.
  • standard input: es el canal por el cual se escribe información hacia el programa. Sería la "entrada"
  • standard output: es el canal que tiene disponible el programa para interactuar en sentido inverso, es decir para responder o escribir cosas hacia el usuario (o hacia quien lo haya llamado)
  • standard error: es un tipo especifico de canal de output dedicado a presentar errores.
El símbolo mayor > permite básicamente, redireccionar el stdout del comando que precede, hacia otro stream.

Otra forma de crear un archivo (touch)

Este comando se utiliza generalmente para modificar la fecha de modificación de un archivo, es decir, marcarlo como modificado, aunque no hayamos cambiado nada de su contenido.
En el caso especifico en que el archivo que le pasamos por parámetro no exista, lo va a crear. Por eso podemos usarlo para este caso.

jfernandes@vitalogy:~$ touch otroarchivo

Ver el contenido de un archivo de texto (cat)

cat es un comando que recibe como parámetro el nombre de un archivo, y lo que hace es leer su contenido y escribirlo en el standard output, es decir, por default a la misma consola.

jfernandes@vitalogy:~$ cat miarchivo
Hola Linux


Ver el contenido de un archivo de texto (vi)

vi es una aplicación bastante más completa que un simple comando. Muy tradicional de linux. Es un editor de texto. Aunque no visual como sería MS word u OpenOffice. Sino de consola.
Podemos ver el contenido de un archivo con:

jfernandes@vitalogy:~$ vi miarchivo

Al principio les va a costar mucho acostumbrarse, porque el vi trabaja también con la idea de comandos y de shortcuts. Es bastante lo contrario a la idea de user-friendly, ya que apunta a más a la eficiencia que a la estética. Es decir que apunta a poder hacer cosas complejas con el texto, con pocas interacciones del teclado. Entonces en principio es bastante dificil sin saber esos comandos o shorecuts.
Contamos algunos acá nada más como para que al menos puedan salir del editor. Los ponemos entre comillas.
  • ":q" para salir del vi dejando de editar el archivo. Viene de quit
  • ":w" para grabar los cambios que hicimos en el archivo. Viene de write
  • ":wq" grabar y luego salir.
  • ":" + número: para ir a una linea específica del archivo. Ej: ":12" va a la linea 12, ":165034" a la linea numer 165034
  • ":q!" forzar salida. Por ejemplo, si cambiamos algo en el archivo y queremos salir con ":q" no nos va a dejar adviriendo que tenemos cambios salientes. Para forzar el comando se usa el signo de admiración.
  • ":w!": forzar escritura
Para editar el contenido uno puede moverse con las flechas. Pero para poder insertar texto en la posición actual deberemos tipear la letra "i" primero (de insert). Recién ahí vamos a poder insertar texto. Para salir del modo edición simplemente apretamos escape.
Otros comandos de edición:
  • "u": undo
  • "y"
  • shift + "a": entrar en modo edición, pero al final de la linea actual.
  • "d" + "d": eliminar la linea actual. Permite borrar cualquier cantidad de lineas especificando un numero entre el tipeo de la primer "d" y la segunda. Ej: "d" + "3" + "d": elimina 3 lineas.

Copiar un archivo (cp)

Bueno, suficiente con la edición, ya con google van a poder aprender a dominar vi mejor.
Para copiar un archivo:

jfernandes@vitalogy:~$ cp miarchivo lacopia

Copia el contenido de miarchivo a un nuevo archivo llamado lacopia

Borrar un archivo (rm)

jfernandes@vitalogy:~$ rm lacopia

Crear un directorio (mkdir)

Para crear un nuevo directorio

jfernandes@vitalogy:~$ mkdir midirectorio

Cambiar de directorio (cd)

Bueno este es trivial, para poder navegar cambiar el directorio actual

jfernandes@vitalogy:~$ cd midirectorio

Borrar directorio (rm -rf)

Para esto utilizamos también el comando "rm"

jfernandes@vitalogy:~$ rm -rf midirectorio

La opción "r" se utiliza para borrar recursivamente un directorio y todo su contenido.
La opción "f" es para forzar el borrado, evitando las preguntas del tipo "el archivo blah es de solo lectura, está seguro que desea borrarlo ?".

Consultar el directorio actual (pwd)

Existe un comando bien simple que imprime en stdout el path al directorio actual

jfernandes@vitalogy:/opt/uqbar/data/repo/paiu$ pwd
/opt/uqbar/data/repo/paiu


Permisos de archivos y carpetas

En el filesystem de linux la idea de permisos y seguridad es algo bien intrínseco. Ya que linux está diseñado como un sistema operativo seguro. Capaz de ser utilizado para brindar servicios de servidores (ej: servicios web, ftp, etc).

Por esto es que cada archivo y carpeta del filesystem tiene la noción de:
  • owner: es el propietario del archivo.
  • grupo: es el grupo propietario del archivo
Esto etiqueta a los archivos/directorios con estas marcas.
Para qué sirven ? Bueno en sí para nada, el tema es que a los archivos se le pueden asignar permisos, que se basan en estos conceptos.
Por ejemplo podemos describir los permisos como:
  • "el dueño tiene total control"
  • "los miembros del grupo pueden leer el archivo"
  • "el resto no puede ni siquiera leer el archivo".
Y ahí estamos mencionando el qué y el quién.
esta información se puede ver al listar los archivos. Ej:


jfernandes@vitalogy:/opt$ ls -l
total 24
drwxr-xr-x  6 root       root       4096 2012-03-14 18:14 ./
drwxr-xr-x 22 root       root       4096 2012-03-19 09:38 ../
drwxr-xr-x  4 jfernandes jfernandes 4096 2011-11-30 09:51 dev/
drwxr-xr-x  4 root       root       4096 2011-11-30 21:00 google/
drwxr-xr-x  2 jfernandes jfernandes 4096 2012-03-14 18:14 unq/
drwxr-xr-x  4 jfernandes jfernandes 4096 2011-07-28 18:13 uqbar/

La primer columna contiene las asignaciones de permisos. Este "string" tiene el siguiente format:
  • _OOOGGGAAA
  • Donde:
    • _ el primer caracter lo vamos a obviar por ahora.
    • las siguientes tres posiciones indican los permisos para el usuario propietario u owner del archivo. Son lo "OOO"
    • "GGG": son los permisos para los usuarios que pertenecen al mismo grupo que este archivo/directorio
    • "AAA": son los permisos para el resto de usuarios.
El formato de estos permisos, es decir, estos 3 caracteres es el tipo de operación que se puede hacer:
  • RWX:
    • R: read, lectura
    • W: write, escritura
    • X: access, acceso (cuack)
Si figura la "letrita" significa que está permitido. En cambio si en la posición hay un guión, no lo está.
Expliquemos uno de los ejemplos:

drwxr-xr-x Lo separamos, y de izquierda a derecha leemos:
  • Owner tiene "rwx": es decir puede hacer todo: leer, escribir y acceder
  • Group: "r-x": el grupo puede leer y acceder, pero no escribir.
  • Others: "r-x": idem al grupo.
A continuación algunos comandos útiles relacionados con permisos:

Cambiar el owner de un archivo/carpeta (chown)

Del inglés "change owner", este comando sirve para cambiar el usuario y/o grupo de un archivo (o carpeta)

Ej:
chown miusuario:migrupo miarchivo.log

Modifica los propietarios del archivo "miarchivo.log". Asigna como "owner" a "miusuario", y "migrupo" como grupo owner.

Con el parámetro "-R" se puede hacer recursivo a un directorio y todos sus elementos

chown -R miusuario:migrupo micarpeta

Cambiar permisos a un archivo/carpeta (chmod)

Este comando sirve para modificar los permisos de un archivo o carpeta, para esto usamos los mismos conceptos que ya contamos antes: el quién (owner "u", group "g", others "o") y el qué (read, write, access).

chmod g+r miarchivo.log

Agrega (especificado por el simbolo "+") el permiso de lectura ("r") para el grupo ("g").
Podría agregar más permisos como

chmod g+rwx miarchivo.log


Podría quitar un cierto permiso con el simbolo menos:

chmod g-w miarchivo.log


Y podría hacerlo para otros usuarios:

chmod u+rwx miarchivo.log

Que agrega permisos para el usuario owner.

Para modificar los permisos de todos existe el "a" the all

chmod a-rwx miarchivo.log


Más comandos y herramientas para investigar

Otros comandos que sería interesante que investiguen, y que van a permitirles combinar todo esto y hacer scripts interesantes:

  • tar: comando para unir varios archivos y carpetas en un único archivo (como el rar). Permite también comprimir (el famoso .tar.gz)
  • find: para realizar búsquedas de archivos/carpetas
  • locate: simil a find, pero sobre una base indexadas.
  • for: el famoso for loop
  • while: no requiere mucha explicación
  • pipelining:
  • wget: para hacer pedidos http (web)

Comments