Introducción a Linux y programación Shell

Objetivo: Entregar herramientas básicas para trabajar a nivel de usuario en sistema operativo Linux y aquellos derivados de Unix.

Para instalar linux en windows, usted puede seguir los pasos recomendados aquí. Hay dos opciones: en forma nativa en su disco duro o en máquina virtual vnwware o virtualbox.

Shell es un interpretador de comandos en línea o desde un archivo. Existen varios interpretadores de comandos, entre ellos csh, bash, zsh. Este último es similar a bash y agrega algunas ayudas adicionales. Los intérpretes de comandos disponibles en el sistema se encuentran bajo /bin/bash. El intérprete por omisión de cada usuario queda definido en el archivo /etc/passwd. 

A través de archivos de comandos (scripts) es posible programar tareas repetitivas y complejas que también pueden ser hechas vía comandos de consola.

Cambio de Password: passwd 

Este comando funciona en los sistemas derivados de UNIX para las cuentas locales de la máquina donde se trabaja. Para cuentas que son montadas desde otros sistemas de archivos, como es el caso de aragorn.elo.utfsm.cl, el cambio de clave debe ser gestionado con ayuda del administrador.

Sistema de archivos en Linux
    Los archivos en Linux están organizados en directorios. Éstos son también archivos. En la raíz se encuentra el directorio /.
     Bajo la raíz se encuentran varios directorios como bin, home, usr. Bin contiene muchos programas correspondientes a comandos comunes en Linux. Usr contiene datos requeridos por esos y otros comandos. Home contiene los archivos asociados con la cuenta del usuarios. Éstos están organizados en directorios bajo /home/nombre_usuario. 

    Abreviaciones:

    Consideraciones: Ejecución de Comandos
    Para ejecutar programas normalmente los tipeamos. shell es el programa que está corriendo detrás de cada consola o terminal, lee nuestro "tecleo" y ejecuta el comando o programa ingresado.  Hay varios shell disponibles con diferentes características. El shell por defecto en ELO se llama bash. Usted lo puede apreciar ejecutado
$ ps
   Otros son tcsh, zsh y csh.
    Algunos caracteres especiales del shell:
     ^C es usado para abortar programas
     ^D  es usado para ingresar un fin de archivo.
     ^H Backspace
      Para mover cursor:
         ^B  Mueve el curso Backwards (hacia atrás)
         ^F Mueve el cursor Forwards (hacia adelante)
         ^P regresa al comando previamente escrito.
         ^N Es lo opuesto a ^P. Avanza al próximo (next) y más reciente comando.
    ^Z Pausa el programa y permite retornar  al shell. Para volver al programa pausado ingrese el comando (foreground): fg
    Si desea dejar un programa en "trasfondo" seguir la secuencia: ^Z y luego el comando bg  (de background). En este caso el programa sigue corriendo pero sin impedir el ingreso de nuevos comandos en el mismo terminal.

Algunos Comando Básicos en Linux : Los hay externos (programas normalmente bajo /bin) e internos implementados por el shell (por internos, ver: builtin)

pwd:    Print the Working Directory
mkdir:     Crear un nuevo directorio (make a directory)
ls:    listar el contenido del directorio de trabajo.
ls -a    : por defecto los nombre que comienzan con "." son considerados ocultos. -a (por all) los muestra todos.
ls -l    : es la forma larga o completa del comando ls.
ls -F:    A cada archivo listado le agrega un caracter identificar del archivo (@ symbolic link, * executable, = socket,  | named pipe, / directory)

cd: cambio de directorio
cp: copia uno o más archivos.

cat file1 ..filen  : lista el contenido de archivos
more file1 .. filen   : lista los archivos con pausa entre pantallas completas.
less file : Similar a more, pero permite avanzar y retroceder en el archivo que se está leyendo.

exit: termina el shell actual.
mv file1 file2    Renombra file1 como file2.   file2 puede estar en un directorio diferente.
rm file1 .. filen:   Remueve los archivos.
rm -i file1 .. filen    : pregunta por confirmación antes de remover los archivos.
rm -r file1 .. filen    : remueve los archivos en forma recursiva, incluye los directorios !!.
rmdir diretorio    :    Remueve un directorio.
who: lista a todos los usuarios "logeados" en la máquina que estás usando.
man    <comando>:   entrega información de uso del comando indicado. Ej.: $ man ls
help <comando interno>: entrega información de uso del comando interno Ej: $ help cd

Permisos

Unix permite tres categorias de permisos a archivos:  read, write, y execute.
Las categorias de usuarios son: dueño del archivo, grupo al que pertenece el archivo, y todos los otros usuarios que tienen cuenta en el sistema. Las abreviaciones para éstos son: u (de user),  g ( de group), y  o ( de others).

Ejemplo: en respuesta al comando ls -l en uno de mis directorios podemos ver:

-rwx------   1 agustin  users        4723 Mar  6 09:56 UnixIntro.html
-rwx------   1 agustin  users        6903 Mar  6 09:57 index1s01.html
drwx------   1 agustin  users         512 Mar  2 11:25 tareas
drwx------   1 agustin  users         512 Mar  6 08:29 trabajos

La primera posición: - o d representan archivos o directorios. En general indica el tipo de archivo, hay otros como l (link).
Luego vienen los permisos para cada uno de las categorias de usuarios. Los permisos aparecen en orden rwx.  Primero se indican los correspondientes al usuario, luego grupo y finalmente otros.
La presencia de - indica denegación de ese permiso para esa categoria de usuarios.

Interpretación de r,w, y x
    Para archivos: r otorga permiso de lectura. w de escritura, y x de ejecución.
    Para directorios: los directrorios en Unix son también archivos.
        Permiso de lectura r significa que es posible listar el contenido del directorio.
        Permiso de escritura: w significa que es posible crear archivos en el directorio.
        Permiso de ejecución: x significa que es posible acceder al directorio, por ejemplo a través del comando cd.

    Comando chmod: permite cambiar los permisos de archivos.
        patrón: chmod [opciones] categoria_de_usuarios (+|-) permisos archivos
        + agrega permiso y - lo remueve.
        La categoria de usuarios puede ser una o más de las letras ugoa  y los permisos pueden ser uno o más de las letras rwx. Por ejemplo para dejar permisos de sólo lectura al archivo test.txt podemos hacer: chmod a+r-wx test.txt
También podemos usar una representación octal para señalar los permisos que deseamos. Por ejemplo, con chmod 644 test.txt estamos otorgando permiso de lectura y escritura a su dueño, y lectura para el grupo y otros usuarios.
Usando este formato podemos usar cuatro bits octales. En este caso, el más significativo puede adoptar el valor 4 ó 2 y permite fijar un bit para configurar usuario o grupo efectivo, se conoce como bit setuid. Por ejemplo en chmod 4555 a.out , el ejecutable a.out al ser corrido por un usario cualquiera adoptará los permisos de su duelo durante al ejecución del mismo. Vea el archivo ping como otro ejemplo . Si usamos el cuarto dígito en 1 como en chmod 1555 dir , fijamos el bit de permanencia el cual se usa en directorios y señala que todos podrán escribir en un directorio, pero sólo el super usuario y el propio dueño del archivo podrán borrarlo. Este es el caso del directorio /tmp.

    Atención con umask: permite definir los permisos por defecto al crear archivos.
        Formato: umask [cuantro_digitos_ en octal ]
        Los últimos tres representan las negaciones correspondientes a cada categoria de usuarios.
        Estrategia 1: restricción severa (umask 077 o simplemente umask 77 , 77=> rwx---------  ) y debemos relajar lo que deseamos compartir.
        Estrategia 2: restricción relajada (umask 022 o umask 22,   22 => rwxr-xr-x ) y debemos restringir lo privado.

    Obtención de ayuda: ayuda en línea:  man  y otros utilitarios que ofrezca la versión del sistema operativo con que trabajes.

    Editor de archivos de texto: opciones vi, vim (vi iMproved), emacs, gedit, geany, otros (mc). 

Personalizando el ambiente Linux
    Archivo .bashrc   Éste es un archivo de comandos ejecutado al momento de ejecutar un nuevo shell (bash) que no sea un login shell. Login shell es aquel iniado luego de haber ingresado a nuestra cuenta autenticación habitual.
.bashrc permite personalizar el ambiente de cada shell. Aquí se definen cosas como alias, se define el prompt y cualquier otra definición.
  Cuando se bash es invocado desde un login shell , Shell primero ejecuta los comandos desde /etc/profile
Luego busca y ejecuta uno de los siguientes, y en este orden, ~/.bash_profile,  ~/.bash_login,  and  ~/.profile
Al salir del shell se ejecuta ~/.bash_logout

  Cuando se invoca bash sin venir de un login shell, se invoca .bashrc.

Considere el siguiente segmento tomado de man bash. Ejecute este comando para ver más sobre el comando.
    ......    
    When bash is invoked as an interactive login shell, or as  a

     non-interactive  shell  with  the  --login  option, it first
     reads and executes commands from the file  /etc/profile,  if
     that  file  exists.   After  reading that file, it looks for
     ~/.bash_profile,  ~/.bash_login,  and  ~/.profile,  in  that
     order,  and  reads  and executes commands from the first one
     that exists and is readable.  The --noprofile option may  be
     used when the shell is started to inhibit this behavior.
 
     When a login shell exits, bash reads and  executes  commands
     from the file ~/.bash_logout, if it exists.

     When an interactive shell that  is  not  a  login  shell  is
     started, bash reads and executes commands from ~/.bashrc, if
     that file exists.  This may be inhibited by using the --norc
     option.   The  --rcfile  file option will force bash to read
     and execute commands from file instead of ~/.bashrc.
......

Para entender la diferencia entre shell interactivo en login y sin login ver aquí.