Introducción a Linux/Comandos

Los comandos, en su mayor parte, no son realmente más que pequeños programas incorporados en el sistema operativo. Técnicamente, lo único que diferencia los comandos de los programas (o de los scripts) es que los comandos siempre están en carpetas muy concretas (/bin, /usr/bin, y en el caso de haber iniciado sesión como superusuario, /sbin), así que no es necesario especificar dónde se encuentran.

Por ello, todas las reglas de sintaxis aplicables a los comandos son aplicables a cualquier programa o script de Bash, con un cambio: en lugar de escribir el nombre del comando, hay que especificar exactamente dónde esta el programa o script (la ruta del programa o script)

Más abajo se dan ejemplos más concretos, pero como ejemplo introductorio, usaré los comandos cd (cambiar directorio actual) y ls (mostrar contenido de directorio actual)

Reglas de sintaxis

editar

Capitalización

editar

Regla número 1: la distinción entre mayúsculas y minúsculas es crucial. Los nombres de los comandos siempre se escriben en minúsculas; los parámetros cambian de significado o son inservibles si se usa la capitalización incorrecta.

anais@pepeluis:~$ LS -L
bash: LS: no se encontró la orden
anais@pepeluis:~$ ls -l
drwxr-xr-x 1 pepeluis pepeluis       4096 mar  4 20:08 Documentos
drwxr-xr-x 2 pepeluis pepeluis       4096 mar  4 20:08 Escritorio
drwxr-xr-x 1 pepeluis pepeluis       4096 mar  8 19:37 experimento
anais@pepeluis:~$ ls -L
Documentos  Escritorio  experimento

Parámetros (dije Ortega y Gasset, no Ortega y Gasset)

editar

Regla número 2: todos los parámetros se separan por espacios; la consola reconoce la primera palabra como el nombre del comando (o la ruta del programa) y cada cadena de texto entre espacios como un parámetro.

anais@pepeluis:~$ cd Documentos
anais@pepeluis:~/Documentos:$ ls
drwxr-xr-x 1 pepeluis pepeluis       4096 mar  4 23:24 Pinky y Cerebro
drwxr-xr-x 2 pepeluis pepeluis       4096 mar  6 13:35 Recetas de cocina
anais@pepeluis:~/Documentos:$ cd Pinky y Cerebro
bash: cd: Pinky: No existe el fichero o el directorio

El sistema entendió "acceder a la carpeta Pinky" (el comando cd solo admite un argumento y considera los siguientes cháchara; otro comando podría haber intentado acceder a los archivos "Pinky", "y" y "Cerebro", por ejemplo). Para poder usar un espacio, lo más fácil es entrecomillar el nombre entre apóstrofos:

anais@pepeluis:~/Documentos$ cd 'Pinky y Cerebro'
anais@pepeluis:~/Documentos/Pinky y Cerebro:$

También se pueden escribir las primeras letras y pulsar la tecla Tabulación para activar el autocompletado. El resultado sera éste:

anais@pepeluis:~/Documentos$ cd Pinky\ y\ Cerebro

(de haber varias opciones posibles, mantener pulsada la tecla Tabulación para que aparezcan todas en pantalla. Tecléense unas cuantas letras más, y vuélvase a probar)

La barra inversa (\), que se puede obtener en teclados españoles pulsando Alt Gr + º, es un "carácter de escape". Esto significa que modifica el significado del carácter siguiente: por ejemplo, \n significa "salto de línea". La barra es necesaria porque hay varios símbolos que tienen un significado especial en Bash (el espacio es el más evidente). Si rodea un argumento con apóstrofos, ninguno de estos símbolos usará su significado especial, pero será imposible acceder a ninguna carpeta con apóstrofos.

Existen muchas formas de usar parámetros con apóstrofos, si se sabe sintaxis de Bash. A este nivel básico, la forma más fácil y segura es sustituyendo el apóstrofo por '\.

A estas horas ya habrá advertido el significado de la barra hacia adelante (/); la carpeta que va después de ella está contenida dentro de la carpeta que va antes de ella. Una barra hacia adelante suelta indica el directorio raíz

Cada vez que sea necesario escribir una ruta como un parámetro, se puede escribir:

  • explicitando la ruta exacta, en referencia al directorio raíz (si la ruta empieza con una barra)
  • indicando la ruta en referencia a la carpeta actual (como se hizo en los ejemplos anteriores)
  • en referencia a una de las siguientes abreviaturas (también se pueden usar solas)
    • . para la carpeta actual. (Pinky y Cerebro sería sinónimo con ./Pinky y Cerebro) Conveniente para mover archivos desde una carpeta arbitraria a la carpeta actual, o para ejecutar scripts en la carpeta actual. Curiosamente, es posible escribir rm experimento para borrar el archivo "experimento", pero para arrancarlo es necesario escribir ./experimento, a menos que esté en una de las carpetas clave. Es decir, el punto no es obligatorio para los parámetros, pero sí para los nombres del programa a ejecutar.
    • .. para el directorio inmediatamente superior. (muy fácilmente combinable: ../.. indica el directorio superior del superior; ../../yinlao indica la carpeta "yinlao" que está en el directorio superior del superior del actual; etc.)
    • ~ para la carpeta personal (depende de qué nombre haya usado para iniciar sesión)

Opciones (un tipo especial de parámetros)

editar

Regla número 3: las opciones se escriben anteponiendo un guion, si constan de una sola letra; o dos, si constan de varias. En casi todos los comandos (o por lo menos en todos los comandos de sistema) todas las opciones que se utilicen de una sola letra se pueden contraer juntando todas las letras y usando un solo guion al principio. Esto funciona excepto cuando las opciones necesiten, a su vez, parámetros; en este caso, el parámetro se aplica a la última opción.
Ejemplo: ls -a -l equivale a ls -al

Lista de comandos

editar

Esta es una lista muy reducida que ofrece las opciones más típicas de los comandos más usados. Los parámetros entre signos menor que y mayor que (<>) deben sustituirse por el valor adecuado; los corchetes indican que el parámetro es opcional. No deben escribirse los corchetes ni los símbolos menor que y mayor que, a menos que sean parte del parámetro.

Para más información, use los comandos de ayuda.

Comandos de ayuda

editar
Sintaxis Explicación
info Información general autoexplicativa. Excesivamente detallada; clasifica los comandos según utilidad.
man <comando> Manual completo (o casi completo) sobre un comando
Existe un manual para el propio comando man, al que se accede por man man
<comando> --help Ayuda básica sobre un comando (no todos la ofrecen)
<comando> --usage Sintaxis básica sobre un comando (no todos la ofrecen)
whatis <comando> Información muy reducida sobre un comando
apropos <comando> Parecido al anterior

Administración de carpetas y archivos

editar
Sintaxis Explicación Ejemplo
dir lista los ficheros (refiriéndonos a todos los tipos de archivos: directorios, archivos propiamente dichos, enlaces simbólicos, etc.)  
ls [-a] [-l] visualiza los ficheros y carpetas en colores para distinguir los distintos tipos.
-a refleja los archivos ocultos, que empiezan por un punto en su nombre; no aparecen normalmente ni en la consola ni en modo gráfico.
-l da información extra sobre los archivos en vez de limitarse a escribir los nombres.
 
touch <ruta> cambia los metadatos (fecha,hora de creacion) o crea ficheros en blanco touch -t 03122010 file21.txt touch file21.txt
mkdir <ruta> crea directorios mkdir ~/Esto\ no\ es\ privado
cd <ruta>
marivi@bellota:~$ cd AutoCAD
marivi@bellota:~/AutoCAD$
cd .. cambia siempre al directorio inmediatamente superior
¡no pegar los puntos al comando como en MS-Dos! No reconocerá el comando
marivi@bellota:~/AutoCAD/examples$ cd ..
marivi@bellota:~/AutoCAD$
cd - cambia siempre al directorio visitado anteriormente
marivi@bellota:~/AutoCAD/example$ cd
marivi@bellota:~$ cd - 
/home/marivi/AutoCAD/example
marivi@bellota:~/AutoCAD/example$ 
rmdir <ruta> permite eliminar un directorio vacío  
cp <origen> <destino> copia el fichero o directorio <origen> en <destino> cp -r /home/tarea /root/ruta/Lima
mv <origen> <destino> permite mover y/o cambiar de nombre el fichero <origen> a <destino> mv Istoria Historia
rm [-i] [-r] <ruta> no mueve a la papelera, borra definitivamente los archivos


en principio, elimina ficheros de uno en uno
para borrar una carpeta entera es necesario borrar los archivos de dentro primero, bien a mano o mediante la opción -r (recursivo; borra todo el interior)
la opción -i hace que pida confirmación antes de borrar, muy conveniente si se usa con la opción -r

rm /home/tarea



rm -r /home/Tareas

cat <ruta> visualiza contenido de un fichero; pueden concatenarse varios
la visualización se hace sin pausa; si el texto es más largo que la pantalla no se puede recuperar.
cat /etc/passwd
more <ruta> una forma más avanzada de leer un fichero, hace pausas a cada línea. Se puede leer pulsando Intro repetidamente (o espacio para saltar pantallas)  
less <ruta> una forma aún más avanzada de leer un fichero, permite recorrerlo con las flechas de cursor. Pulsar Q para abandondar  
pwd muestra ruta actual
marivi@bellota:~/Memez$ pwd
/home/marivi/Memez
du Muestra el uso de disco. En general los archivos se almacenan en bloques de 4KB/4096bytes. Si un archivo es menor seguirá ocupando 4K de espacio en disco. du indica la ocupación real.
/var/log@Host1 # du -sch *
20K      acpid
0        apache2
0        auth.log
324K     cron
2,1M     cups
108K     daemons
4,0K     incrementalBackup.sh.root.20100101.log
4,0K     incrementalBackup.sh.root.20100102.log
4,0K     incrementalBackup.sh.root.20100103.log
56K      mail
0        maillog
128K     messages
1,2M     messages.1.gz
3,7M     messages.2.gz
2,5M     msec.log
35M      mysqld
...
111M    total
df pydf df disk free, muestra el espacio libre que queda en disco. pydf (pydf == python disk free) realiza la misma tarea pero ordenando en columnas y con colores. df es útil para scripts automatizados mientras que pydf es mejor para ver el consumo manualmente.
find Comando para búsqueda de ficheros. Tiene decenas de opciones que lo hacen extremadamente potente. Buscar enlaces simbólicos dentro de /etc:
find /etc -type l

Busca ficheros modificados hace 10 o menos días:

find /etc -type f -mtime -10

Busca ficheros modificados hace justamente 10 días:

find /etc -type f -mtime  10

Busca ficheros modificados hace 5 o más dias dentro de /etc con nombre extensión sh o php y sobre cada coincidencia ejecuta un nuevo script pasando el nombre del fichero encontrado como parámetro.('{}' es reemplazado por el nombre del fichero encontrado.).

find /etc -type f -name "*sh" -or -name "*.php" -mtime  +5 -exec script1.sh {} \;

Para este último caso, podemos utilizar un script en línea sustituyendo -exec script1.sh {} por una sentencia similar a

-exec bash -c "   echo \"Fichero:{}\" ; grep \"patron1\" {} ; wc -l {}   "

Copias de seguridad

editar
Sintaxis Explicación Ejemplo
rsync Permite sincronizar carpetas localmente o en un sistema remoto accesible mediante red, realizar backups incrementales e instantaneas (similares a las del sistema "Time Machine" de MacOSX) de una carpeta o directorio. rsync comprueba antes de copiar un fichero que el mismo no existe ya en el destino, comprueba si hubo cambios y si los hubo copia sólamente la parte del fichero que cambió. Esta comprobación puede multiplicar enormente la velocidad de sincronización (hasta 10 veces en copias locales y hasta 1000 en copias a través de redes WAN -ADSL p.ej-).

Para realizar una sincronización entre 2 directorios, manteniendo en el destino los ficheros que pudieran haber sido borrados en el origen:

~$ rsync -a /var/lib/mysql /media/HD_BACKUPS/mysql
            ^              ^
            Dir.Origen    Dir.Destino
*La opción -a no es necesaria pero sí conveniente.

Para realizar una sincronización entre 2 directorios, eliminando en el destino los ficheros que pudieran haber sido borrados en el origen:

~$ rsync -a --delete /var/lib/mysql /media/HD_BACKUPS/mysql

Para realizar una instantanea de un directorio a partir de otra instantanea creada anteriormente (/media/HD_BACKUPS/mysql.201001 en el ejemplo):

rsync -a --link-dest=/media/HD_BACKUPS/mysql.201001 \  <--- Última copia
           /var/lib/mysql \                            <--- Dir. Origen
           /media/HD_BACKUPS/mysql.201008              <--- Dir. Destino

La opción --link-dest comprueba antes de copiar en el nuevo directorio (/media/HD_BACKUPS/mysql.201008 en el ejemplo) si el mismo ya existe en la copia anterior indicada en la opción --link-dest. Si existe crea un enlace duro a la misma. Si no copia el fichero.
Los enlaces duros permiten acceder a un fichero desde varias rutas alternativas, en este caso desde .../mysql.201001/ruta1 y .../mysql.201008/ruta2. Cuando desde una ruta borramos el fichero con rm, el fichero sigue estando accesible desde el resto de rutas o enlaces duros. Cuando se elimina el último enlace duro el fichero es eliminado. Con esta técnica podemos crear instantaneas de un directorio tal y como estaba en una fecha dada al tiempo que el espacio ocupado en disco es similar a una copia incremental, ya que entre una fecha y otra sólo se almacenan los ficheros que han cambiado.

Relativos a permisos y usuarios

editar
Sintaxis Explicación Ejemplo
passwd [-d] [<usuario>] sustituyendo usuario por el nombre de usuario (o no escribiendo nada para el usuario que ejecute el comando) permite cambiar la contraseña, o establecer una nueva si no tiene
La opción -d permite borrarla, dejando la cuenta sin contraseña (peligroso)
Sólo el superusuario puede cambiar contraseñas que no sean la suya

En caso de error la contraseña quedará sin cambios.
marivi@bellota:~$ passwd
Cambiando la contraseña para marivi.
(actual) contraseña de UNIX:
Enter new UNIX password:
Retype new UNIX password:

Se entiende que los espacios en blanco son para teclear las contraseñas, como es costumbre en GNU/Linux no aparecerán en la pantalla al escribirlas.

chmod <permisos> <ruta> cambia los permisos de acceso a un archivo.


Los permisos se pueden dar mediante un número octal o mediante la notación
<usuarios afectados><modo de concesión><permisos> donde:

  • los usuarios afectados se expresan con la letra u (usuario propietario), g (usuarios que compartan grupo con el propietario), o (otros usuarios que no compartan grupo), a (todos) o una combinación de varias
  • modo de concesión: añadir privilegios (+), retirarlos (-) o establecerlos como los únicos existentes (=)
  • los permisos en sí, entre otros r (lectura), w (escritura), x (ejecución para archivos, permiso de paso para directorios)

Consulte la sección de permisos de archivo para más información

chmod a=rwx konquest
Se permite a todos los usuarios leer, escribir y ejecutar konquest


chmod u-wx konquest
Se deniega al usuario propietario la posibilidad de escribir o ejectuar konquest

chown <usuario>[:<grupo>] <ruta> cambia la propiedad de <ruta> en favor del usuario <usuario>, cambiando también el grupo propietario a <grupo>, si se especifica chown marivi:bellota Historia
sudo <comando con opciones> ejecuta un comando con privilegios de superusuario; para que funcione es necesario introducir la clave del usuario actual
kant@kant:/etc/ sudo cp fstab fstab~
[sudo] password for kant:
su [<usuario>] cambio de usuario (es necesario introducir la contraseña del nuevo usuario)


si no se marca a qué usuario cambiar por defecto prueba a cambiarse por root
curiosidad: se puede cambiar a usuario root con la contraseña del usuario normal mediante sudo su

 
gksu <comando> versión gráfica de sudo gksu kate /etc/fstab
aparecerá una ventana para introducir en la contraseña, de introducirla correctamente arrancará el comando kate /etc/fstab con permisos de superusuario, cargando su configuración y permitiendo abrir y modificar ese archivo, de permiso restringido.
el ejemplo anterior sólo sirve para Kubuntu o un sistema que incluya el editor de archivos kate; en cualquier caso el funcionamiento del comando gksu es el mismo.
Sintaxis Explicación Ejemplo
echo <cadena de texto> muestra en pantalla <cadena de texto>
watch -n secs "comando" Repite el comando cada secs segundos, refrescando la pantalla
shutdown <tiempo> reinicia el sistema operativo, ejecutando un init otra vez.


El tiempo se escribe en minutos, now para apagar ahora.
Son necesarios permisos de superusuario generalmente.

halt <tiempo> apaga el equipo.
Misma sintaxis y permisos que el anterior.
reboot <tiempo> reinicia el equipo.
Misma sintaxis y permisos que el anterior.
cpulimit Limita el tiempo de CPU dedicada a un proceso. Ej1: Limitar el tiempo máximo de CPU de los plugins externos de Firefox

(válido a partir de Firefox 3.7)

 cpulimit -e plugin-container -l 30 

Manejo de ficheros de texto

editar

En general los siguientes comandos se utilizan en la práctica anidados en tuberías de forma que la salida de un comando se utiliza como entrada para el siguiente eliminando la opción <ruta> lo cual le indica al comando que utilice como fichero de entra la salida del comando anterior. P.ej, para mostrar los 10 primeros resultados de un fichero de texto conteniendo la palabra "amarillo" ejecutaríamos un comando similar a:

cat "fichero de texto" | grep -i amarillo | head -n 10

2 comandos de texto frecuentemente utilizados y no citados son sed y awk. Estos comandos son muy potentes pero requieren un apartado separado para poder describirlos correctamente.

Sintaxis Explicación
grep <texto> <fichero> Muestra las líneas de un fichero de texto que contienen el texto buscado. La opción -v permite mostrar las líneas que no contienen dicho texto. La opción -B 'N' permite mostrar la línea coincidente y las anteriores 'N' lineas (B == before/antes), mientras que la opción -A 'N' muestra también las posteriores 'N' líneas (A == after/después). La opción -i indica que no distingua entre mayúsculas y minúsculas (por defecto sí distingue).
head -n 'N' <ruta> Muestra las 'N' primeras líneas de un fichero de texto. (head == cabeza)
tail -n 'N' <ruta> Muestra las 'N' últimas líneas de un fichero de texto. (tail == cola)

Monitorización

editar

En general, las opciones de monitorización pueden ser considerados comandos de nivel avanzado o muy avanzado.

Sintaxis Explicación
top permite ver y administrar los procesos en ejecución (útil para matar procesos que cuelguen el sistema)
pulsar Q para abandonar, K para matar un proceso (pedirá el número de proceso, visible en la columna izquiefa); < y > para cambiar de página
sólo se pueden matar procesos de la propia cuenta; se pueden matar procesos de otras ejecutando el comando como root, pero esto sólo se debería hacer si tiene completa idea de lo que está haciendo.
htop Similar a top, pero con una interfaz basada en menús, más amigable de uso.
iotop Similar a top, pero muestra actividad de entrada/salida a disco (Input/Output top).
latencytop monitoriza las latencias. Una introducción en inglés al mismo puede leerse aquí
lsof Permite mostrar qué procesos están accediendo a un fichero o directorio o qué conjunto de ficheros están siendo utilizados por un proceso (opción lsof -p <pid>, donde pid es el identificador numérico del proceso devuelto por top/htop). En Linux todas las entradas/salidas/dispositivos/conexiones de red son tratadas como ficheros, lo cual en la práctica hace a este comando una herramienta muy potente de monitorización.
netstat Permite ver estadísticas de red (conexiones establecidas y en escucha)
vmstat Permite ver estadísticas de utilización de la memoria
iostat Permite ver estadísticas de lecturas/escrituras a dispositivos externos
inotifywatch
inotifywait
Las versiones modernas del kernel de Linux permiten notificar a las aplicaciones de usuario cualquier acceso o cambio a un fichero de forma instantánea. Los comandos inotifywatch e inotifywait nos permiten "conectar a la escucha" con el kernel para ser avisados de cualquier cambio producido en uno o varios ficheros de forma instantanea.
strace -p <pid>
Permite monitorizar las llamadas desde una aplicación de usuario al núcleo o kernel del sistema.
stap Comando extremadamente avanzado que permite monitorizar el funcionamiento del kernel en tiempo real. Un tutorial en inglés puede encontrarse aquí

Gestión de energía

editar

Permite controlar parámetros sobre la gestión de energía, como la frecuencia de la CPU, deshabilitar USBs no usados, ...

Sintaxis Explicación
powertop Es un "top" de recursos energéticos. Indica posibles optimizaciones para mejorar el consumo. En un portátil puede llegar a aumentar un 20% la duración de la batería.

Descarga de archivos

editar

El uso típico de GNU Wget consiste en invocar desde la línea de comandos una o más URL como argumentos:

# Descarga del título de página ejemplo.com a un archivo
# llamado "index.html".
wget http://www.ejemplo.com/
# Descarga desde el código fuente con Wget de un sitio GNU ftp.
wget ftp://ftp.gnu.org/pub/gnu/wget/wget-1.10.2.tar.gz

El uso más complejo incluye descargas automáticas desde múltiples URLs en un directorio con jerarquía:

# Descarga del título de página ejemplo.com , acompañado con
# las imágenes y el ''estilo de cascada'' (css) necesario para mostrar la página, y convertir las
# URLs dentro para referirse a los contenidos disponibles a nivel local.
wget -p -k http://www.ejemplo.com/
# Descarga de todo el contenido de ejemplo.com
wget -r -l 0 http://www.example.com/

Avanzado

# Descargar un espejo de las erratas (errores) para un libro que usted/tú justo compró.
# Seguir todos los enlaces locales recursivamente y hacer apropiados los archivos
# para verlos desconectado.
# Usar una espera arbitraria (al azar) de 0 a 5 segundos entre los archivos.
# Cuando hay un fracaso, reintentar hasta 7 veces con 14 segundos 
# entre cada reintento.
# Poner al agente de usuario a Firefox en Windows XP e ignorar exclusiones.
# Recoger resultados de acceso al archivo local "myLog.log"
wget -t 7 -w 5 --waitretry=14 --random-wait --user-agent="Mozilla/5.0 
     (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 
      Firefox/1.5.0.1" -m -k -K -e robots=off 
      http://www.oreilly.com/catalog/upt3/errata/ -o ./myLog.log
* Recoger sólo los enlaces específicos listados línea a línea en 
* el archivo local "my_movies.txt" 
* Usar una espera arbitraria de 0 a 33 segundos entre archivos.
* Cuando hay un fracaso, reintente para hasta 22 veces con 48 segundos 
* entre cada reintento. No envíe ningún agente de usuario en absoluto. Ignore exclusiones de robot.
* Colocar todos los archivos capturados en el directorio "/movies" 
* y recoger los resultados de acceso al archivo local "my_movies.log"
* Bueno sólo para descargar imágenes específicas conocidas u otros archivos.
wget -t 22 --waitretry=48 --wait=33 --random-wait --user-agent=""
     -e robots=off -o ./my_movies.log -P/movies -i ./my_movies.txt
*Uso de wget para descargar contenido protegido por referer y cookies.
*1. obtener la url base y guardar sus cookies en el archivo 
*2. obtener el contenido protegido usando cookies almacenadas 
wget --cookies=on --keep-session-cookies --save-cookies=cookie.txt http://first_page
wget --referer=http://first_page --cookies=on --load-cookies=cookie.txt --keep-session-cookies --save-cookies=cookie.txt http://second_page
#Sitio web espejo a una copia estática para un navegador local.
#Esto quiere decir que todos los enlaces serán cambiados para apuntar a los archivos locales.
#Nota --html-extension convertirá cualquier archivo CGI, ASP O PHP generado a HTML (o algo más no .html).
wget --mirror -w 2 -p --html-extension --convert-links -P <dir> http://www.yourdomain.com

Operadores

editar
Sintaxis Explicación  Ejemplo
> Una redirección consiste en trasladar la información de un tipo a otro, por ejemplo de la salida estándar a la entrada estándar o del error estándar a la salida estándar ls > listado
>> igual que el anterior, pero añade al archivo en vez de sobreescribirlo  
< recupera parámetros de un archivo cp < ruta
| la salida del comando anterior pasa a ser parámetro del comando siguiente ls | less