💾 Archived View for gmi.osiux.com › linux-sysadmin.gmi captured on 2023-01-29 at 15:51:27. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-01-29)

➡️ Next capture (2023-03-20)

-=-=-=-=-=-=-

Administrador de Sistemas GNU/Linux

Filosofía UNIX

Los objetivos con que se creó determinaron una *filosofía* de *UNIX* caracterizada por:

Algunas directivas son:

En estos conceptos se basa la mayoría del software libre existente, por lo que servidores como `sendmail` o `postfix`, están diseñados en pequeños servidores y/o programas que hacen partes de todo un proceso y, mediante sus ficheros de configuración, se pueden enlazar de una u otra forma, así como usar otros programas y/o servidores en lugar de los que vienen por defecto y, así, extender su funcionalidad.

Sobre *filosofía Unix*, de una forma más extensa, *Mike Gancarz*, escribe las siguientes líneas:

La *filosofía UNIX* supone crear programas rápidos, simples, con poca intervención por parte del usuario, o en caso de necesitarla, esta se produzca al principio o lo más mínima posible. Esta se acopla perfectamente a las necesidades de computación de los laboratorios científicos, puesto que *Unix* fue originalmente desarrollado en uno de estos.

A continuación algunas premisas:

En resumidas cuentas la *filosofía Unix* se puede describir como bien lo dice *Doug Mcllroy*:

"Escribe programas que hagan una cosa y la hagan bien, que trabajen en armonía con otros y que manejen flujos de texto, pues esta es una interfaz universal." - *Doug Mcllroy*

"Aquellos que no pueden entender UNIX, están condenados a reinventarlo, pobremente." - *Henry Spencer*, 1987

Linux por dentro, jerarquías de directorios

/
+-- bin         binarios
+-- boot        inicio del sistema, imágenes del kernel
+-- dev         dispositivos, presentes y futuros
+-- etc         configuraciones
+-- home        directorios personales de los usuarios
+-- lib         bibliotecas
+-- lost+found  archivos y/o cadenas perdidas
+-- media       dispositivos extraerles
+-- mnt         dispositivos montados
+-- opt         binarios fuera de la distro
+-- proc        procesos en ejecución
+-- root        directorio personal del /root/
+-- run         archivos de procesos en ejecución
+-- sbin        binarios del sistema
+-- selinux     secure linux
+-- srv         servicios ej: ftp
+-- sys         system
+-- tmp         temporales
+-- usr         archivos compartidos
+-- var         archivos que varían de tamaño, ej: logs

Todo es un archivo, conociendo `/proc` y `/dev`

`/proc`

Es un pseudo-sistema de ficheros que se usa como interfaz para las estructuras de datos del núcleo en lugar de leer e interpretar /dev/kmem. La mayor parte de este sistema de ficheros es de sólo lectura, pero algunos ficheros permiten cambiar variables del núcleo.

`/proc/partitions`

Podemos ver las particiones que leyó el *kernel*:

cat /proc/partitions

major minor  #blocks  name

:

   8        0  488386584 sda
   8        1   52428800 sda1
   8        2   52428800 sda2
   8        3  383527960 sda3
  11        0    1048575 sr0
 254        0  383525912 dm-0

`/proc/uptime`

El `uptime` de nuestro equipo puede ser consultado directamente en `/proc/uptime`,

cat /proc/uptime

1901728.32 3010323.20

Si utilizamos el comando `uptime`, éste lee el valor expresado en **epoc** (segundos que pasaron desde el 01/01/1970) y nos informa hace cuántos días y horas nuestro servidor está prendido, además de informar otros valores, como la cantidad de usuarios y el **average**:

uptime

 10:53:05 up 22 days, 15 min,  6 users,  load average: 1,63, 1,70, 1,58

`/dev`

Aquí se encuentran todos los dispositivos del sistema, presentes y futuros.

`/dev/null`

Este dispositivo es muy especial y sumamente útil, es un agujero negro, todo lo que se envía a `/dev/null` desaparece

ls -lh /dev/null

crw-rw-rw- 1 root root 1, 3 ene 20 10:37 /dev/null

Si enviamos algo y luego miramos con un `ls` no vemos que se incremente el tamaño del archivo:

echo "hola" >/dev/null
ls -lh /dev/null

crw-rw-rw- 1 root root 1, 3 ene 20 10:37 /dev/null

`/dev/sdX`

Los discos están identificados con el prefijo `sd`, luego una letra `a`, `b`, `c`, etc y finalmente un número `1`, `2`, `3`, etc que identifica la partición:

Listamos el disco `sda`

ls /dev/sda*

/dev/sda
/dev/sda1
/dev/sda2
/dev/sda3

Vemos si esta montado `sda`:

mount | grep sda

/dev/sda1 on /mnt/sda1 type ext4 (rw,relatime,user_xattr,barrier=1,data=ordered)

Visualizamos el espacio disponible:

df -h | grep sda

/dev/sda1                                                 50G    14G   34G  29% /mnt/sda1

Entrada estándar, Salida estándar y Tuberías

Descriptores de archivos

Existen 3 descriptores básicos de archivos:

┌─────┬──────────┬───────────────────┐
│     │          │                   │
╞═════╪══════════╪═══════════════════╡
│ `0` │ `stdin`  │ entrada estándar  │
├─────┼──────────┼───────────────────┤
│ `1` │ `stdout` │ salida estándar   │
├─────┼──────────┼───────────────────┤
│ `2` │ `stderr` │ salida de errores │
└─────┴──────────┴───────────────────┘

Es posible redireccionar cada uno de éstos descriptores mediante los operadores `>`, `<` y `|`

Enviar la salida estándar a un archivo

[IMG]

Enviar la salida de errores a un archivo

[IMG]

Enviar la salida estándar y la salida de errores a un mismo archivo

[IMG]

Enviar la salida de errores a la salida estándar

[IMG]

Enviar la salida de estándar a `/dev/null`

[IMG]

Enviar la salida de estándar y la salida de errores a `/dev/null`

[IMG]

Enviar un archivo a la entrada estándar

[IMG]

Enviar la salida estándar a un archivo y a la salida estándar

[IMG]

Enviar la salida estándar de un comando como la entrada estándar de otro comando

[IMG]

`stdout`

Buscar el texto **model** en el archivo `/proc/cpuinfo` y enviar el resultado a un nuevo archivo llamado `/tmp/cpu` que contendrá únicamente las líneas que coinciden con el texto **model**:

grep model /proc/cpuinfo > /tmp/cpu
cat /tmp/cpu

model      : 28
model name : Intel(R) Atom(TM) CPU D425   @ 1.80GHz
model      : 28
model name : Intel(R) Atom(TM) CPU D425   @ 1.80GHz

Buscar el texto **cache** en el archivo `/proc/cpuinfo` y agregar el resultado al archivo `/tmp/cpu`

grep cache /proc/cpuinfo >> /tmp/cpu
cat /tmp/cpu

model      : 28
model name : Intel(R) Atom(TM) CPU D425   @ 1.80GHz
model      : 28
model name : Intel(R) Atom(TM) CPU D425   @ 1.80GHz
cache size : 512 KB
cache_alignment    : 64
cache size : 512 KB
cache_alignment    : 64

`stderr`

Enviar la salida con errores a `/dev/null`:

xkcd 2>/dev/null

Redireccionar la salida con errores a la salida estandar:

echo "xkcd" | grep 2>&1

pipes

El símbolo `|` es usado para redireccionar la salida de un comando a la entrada de otro comando.

Ejemplo:

Lista el directorio `/var/log` ordenando los archivos más nuevos al principio y muestra sólo las primeras 10 líneas mediante el comando `head`

ls -lht /var/log | head

total 14M
-rw-rw-r-- 1 root              utmp       107K feb 10 20:46 wtmp
-rw-r----- 1 root              adm        769K feb 10 20:45 mail.info
-rw-r----- 1 root              adm        769K feb 10 20:45 mail.log
-rw-r----- 1 root              adm        356K feb 10 20:45 syslog
-rw-r----- 1 root              adm        337K feb 10 20:45 auth.log
-rw-r----- 1 root              adm        3,1K feb 10 19:49 messages
-rw-r----- 1 root              adm        2,9K feb 10 19:49 kern.log
-rw-r--r-- 1 root              root        29K feb 10 16:42 Xorg.0.log
-rw-r----- 1 root              adm        1,9K feb 10 16:42 daemon.log

lista el directorio `/var/log` mostrando el tamaño de cada archivo, se filtra el resultando por Megabytes (`M`), luego ordena de mayor a menor y finalmente limita la lista a los primeros 10 archivos que más espacio ocupan, incluyendo el total del directorio:

cd /var/log;du -ch *  | grep M | sort -nr | head

496M total
468M atop
15M  installer
14M  installer/cdebconf
3,3M mail.log.1
3,3M mail.info.1
1,5M auth.log.1

Comandos básicos de terminal

Directorios:

El separador de archivos y directorios es la barra `/`

ejemplos:

/              directorio raíz (*root*)
/etc           directorio usr (sub-directorio de la raíz =/=)
/etc/apache2   apache2 subdirectorio de /etc

Moviéndose en el sistema de archivos:

1. `pwd`

Muestra el directorio actual.

2. `cd`

Cambia al directorio definido en `HOME`

3. `cd /etc/php5`

Cambia el directorio actual a `/etc/php5`

4. `cd apache2`

Cambia al subdirectorio `apache2` del directorio actual

5. `cd ..`

Cambia al directorio inmediato superior

6. `cd $HOME`

Cambia al directorio definido en la variable `HOME`

7. `cd ~osiris`

Cambia al directorio del usuario osiris

Listar directorios:

1. `ls -l`

Listar en formato ancho, de esta manera se visualizan gran parte de los atributos de cada archivo y/o directorio

2. `ls`

Listar directorio actual

3. `ls -a`

Listar directorio actual incluyendo archivos ocultos (comienzan con `.`)

## Cambiando permisos y atributos

r = read 4

w = write 2

x = execute 1

propietario 7 = rwx lectura, escritura y ejecución

grupo 5 = rx- lectura y ejecución

todos 0 = --- ningún permiso


Es necesario ser el propietario del archivo/directorio (o *root*) para realizar el cambio de `usuario` o `grupo`.

### `chmod 750 archivo`

Listamos los permisos del archivo `~/.bash_history`

ls -l ~/.bash_history


-rwxr-x--- 1 osiris osiris 326316 feb 10 21:55 /home/osiris/.bash_history


Cambiamos el permiso a `750` y volvemos a listar:

chmod 750 ~/.bash_history

ls -l ~/.bash_history


-rwxr-x--- 1 osiris osiris 326316 feb 10 21:55 /home/osiris/.bash_history


Finalmente cambiamos el permiso a `600` y volvemos a listar:

chmod 600 ~/.bash_history

ls -l ~/.bash_history


-rw------- 1 osiris osiris 326316 feb 10 21:55 /home/osiris/.bash_history


### `chgrp grupo archivo`

Establece el grupo al archivo

### `chown usuario archivo`

Establece el usuario como propietario del archivo

### `chown usuario archivo`

Establece el usuario como propietario del directorio y todo su contenido recursivamente.

## Moviendo, renombrando y copiando archivos:o

Copiamos el archivo `~/.bash_history` a `~/.bash_history.bak` y verificamos que sea igual:

ls -lh ~/.bash_history

cp ~/.bash_history ~/.bash_history.bak

ls -lh ~/.bash_history.bak

md5sum ~/.bash_history ~/.bash_history.bak


-rw------- 1 osiris osiris 310K feb 11 11:07 /home/osiris/.bash_history

-rw------- 1 osiris osiris 310K feb 11 11:07 /home/osiris/.bash_history

7b862a967fc7096882583f9a6f662230 /home/osiris/.bash_history

7b862a967fc7096882583f9a6f662230 /home/osiris/.bash_history.bak


#+END~SRC~

Movemos el archivo `~/.bash_history.bak` a `~/historial.bak`:

mv -vi ~/.bash_history.bak ~/historial.bak

ls -l ~/.bash_history ~/historial.bak


«/home/osiris/.bash_history.bak» -> «/home/osiris/historial.bak»

-rw------- 1 osiris osiris 316801 feb 11 11:07 /home/osiris/.bash_history

-rw------- 1 osiris www-data 316801 feb 11 11:13 /home/osiris/historial.bak


Renombramos el archivo `~/historial.bak` a `~/historial.log`

mv -vi ~/historial.bak ~/historial.log

ls -l ~/historial.log


«/home/osiris/historial.bak» -> «/home/osiris/historial.log»

-rw------- 1 osiris www-data 316801 feb 11 11:13 /home/osiris/historial.log


## Ver y editar arhivos:

### `cat`

cat /etc/issue


Debian GNU/Linux 7.0 \n \l


:

### `head`

head /proc/meminfo | head


MemTotal: 2062464 kB

MemFree: 872100 kB

Buffers: 56052 kB

Cached: 642468 kB

SwapCached: 10928 kB

Active: 520204 kB

Inactive: 570096 kB

Active(anon): 366124 kB

Inactive(anon): 211844 kB

Active(file): 154080 kB


### `head -2`

head /proc/meminfo | head -2


MemTotal: 2062464 kB

MemFree: 871860 kB


### `tail`

tail /etc/passwd


hplip:x:106:7:HPLIP system user,,,:/var/run/hplip:/bin/false

pulse:x:107:114:PulseAudio daemon,,,:/var/run/pulse:/bin/false

saned:x:108:118::/home/saned:/bin/false

Debian-gdm:x:109:119:Gnome Display Manager:/var/lib/gdm3:/bin/false

alumno:x:1001:1000:alumno,,,:/home/alumno:/bin/bash

osiris:x:2222:33:OSiRiS,,,:/home/osiris:/bin/bash

sshd:x:110:65534::/var/run/sshd:/usr/sbin/nologin

postfix:x:111:120::/var/spool/postfix:/bin/false

rodrigo:x:1002:1001:Rodrigo Fernandez,,,:/mnt/data/musica:/bin/bash

davfs2:x:112:122::/var/cache/davfs2:/bin/false


tail -2 /etc/passwd


rodrigo:x:1002:1001:Rodrigo Fernandez,,,:/mnt/data/musica:/bin/bash

davfs2:x:112:122::/var/cache/davfs2:/bin/false


### `sed`

cat /etc/issue

sed s/"7.0"/"8.0"/g /etc/issue

cat /etc/issue


Debian GNU/Linux 7.0 \n \l


:

Debian GNU/Linux 8.0 \n \l


:

Debian GNU/Linux 7.0 \n \l


:

## Expresiones regulares

Se utilizan para definir patrones para la búsqueda y filtrado:

### `[a-z]` Minúsculas

Rango de la **a** a la **z**

### `[A-Z]` Mayúsculas

Rango de la **A** a la **Z**

### `[0-9]` Números

Rango de 0 a 9

### `[^..]` Patrón distinto

Negación

### `^` comienzo de línea

### `


gemini - kennedy.gemi.dev




 fin de línea

### `.` cualquier carácter

### `?` cero o una aparición

### `*` ninguna o muchas repeticiones

### `+` una o más repeticiones

# Acceso remoto usando ssh

# AUTHOR: Osiris Alejandro Gomez

# EMAIL: osiux@osiux.com

## ¿qué es `ssh` y para qué sirve?

`ssh` permite la ejecución remota de un intérprete de comandos como `bash`

# Más información en: https://es.wikipedia.gmi/wiki/Ssh%5B1%5D[1]

## ¿qué ventajas tiene?

# ****Es seguro**** porque cifra la conexión y nadie puede ver qué estamos haciendo

# ****Es rápido**** porque sólo envía texto, por ello envía menos datos que si fuera una imagen de pantalla como programas como `vnc`

# ****Es versátil**** porque permite interactuar con otros comandos obteniendo control total de un sistema de manera remota.

## ¿qué necesito para usar SSH?

# **computadora remota**



  * se instala haciendo:

**computadora local**

¿cómo me conecto por SSH?

En una terminal hay que escribir el comando `ssh` luego el usuario remoto, por ejemplo: ****pepe**** y separado por un *@* arroba la dirección ****IP**** o el dominio (ej: `192.168.0.9` ó `osiux.com`)


## ¿qué sucede la primera vez?

Siempre que nos conectamos por primera vez a un servidor SSH, nos aparece un mensaje para que confirmemos la autenticidad de la computadora a la que estamos conectándonos, por ahora somos confiados y le decimos que sí, tipeando ****yes****

Las próximas veces este paso no es necesario.

Luego ingresamos la contraseña (password en inglés) y si es correcta, ingresamos al sistema remoto!

Listo, entré a la matrix! ¿y ahora?

Ahora podemos hacer todo lo que el usuario que usamos para conectarnos (en este caso ****pepe****) pueda hacer!

Ahora bien, resulta que este sistema remoto cuenta con un administrador, que ve que alguien que no es él, ingresó al sistema con su usuario! Entonces va a matar todos los procesos del usuario ****pepe****, a fin de dejarnos afuera del sistema.

Para esto, utiliza la herramienta `htop` que muestra todos los procesos y presionando la tecla `F4` nos permite filtrar por la palabra ****pepe**** y luego presionando `F9` y eligiendo `SIGKILL` termina cada uno de los procesos del usuario ****pepe****.

También se puede hacer desde la consola sin usar `htop`


## El intruso va por la revancha!

Como lo dejamos afuera a ****pepe**** matando sus procesos, ahora está enojado! Entonces nos empieza a crear ****carpetas**** en el ****Escritorio**** de la siguiente manera:

Si sigue así en algún momento nos va a llenar el ****Escritorio****

Eliminando al intruso!

Matar los procesos activos no es suficiente, debemos eliminar al usuario, para esto hacemos:


# Listo! ahora ****pepe**** no puede ingresar a nuestro sistema

## El intruso es duro de domar!

Resulta que ****pepe**** cuando ingresó la primera vez, fue astuto y cambió la contraseña de ****root****. ¿Y cómo pudo hacerlo? es simple, el usuario ****pepe**** tenía permisos para usar ****sudo**** que permite convertirse en ****root**** (y ser el ****DIOS**** del sistema). Para cambiar la password hizo lo siguiente:

root@lab2:/# passwd Cambiando la contraseña de root. Introduzca la nueva contraseña de UNIX: Vuelva a escribir la nueva contraseña de UNIX: ```

¿Y ahora quién podrá defendernos?

Si un intruso logró obtener cuenta ****root****, estamos fritos! tiene completo control del sistema y sin que nos demos cuenta, salvo que haga algo muy evidente como borrar todo el disco, va a pasar desapercibido. Qué podemos hacer, para evitar esto?

Utilizar contraseñas fuertes, usando `md5` por ejemplo:


# Mucho más fácil de recordar, frases de paso:

NO usar la misma contraseña en todos lados!

NO usar ****sudo****, loguearse como ****root**** sólo para tareas administrativas

NO permitir el login del usuario ****root****

Sólo permitir login por **SSH** desde algunas IPs

OjO: aunque quitando el cable de red, basta para desconectar a los intrusos, hoy día casi que vuelve inservible una compu desconectada del mundo!

Controlando la matrix!

Si bien usamos el ejemplo de un intruso, lo más probable es que nosotros seamos root en muchos otros sistemas, como la compu del trabajo, la de casa, la de un amigo/a, etc. Y poder administrar varios sistemas remotos usando **SSH** u una sola terminal es posible.

Para esto instalamos ****Terminator****


Iniciamos ****Terminator**** y presionando ****CTRL-SHIFT-E**** y ****CTRL-SHIFT-O**** podemos dividir la pantalla vertical y horizontalmente tantas veces como sea necesario, obteniendo muchas terminales dentro de una sola y eligiendo la opción ****retransmitir a todas**** podemos tipear una sola vez y que ese comando vaya a todas las terminales conectadas! :-D

=> https://es.wikipedia.gmi/wiki/Ssh[3] 1: https://es.wikipedia.gmi/wiki/Ssh[4] => https://es.wikipedia.gmi/wiki/PuTTY[5] 2: https://es.wikipedia.gmi/wiki/PuTTY[6] => https://es.wikipedia.gmi/wiki/PuTTY[7] 3: https://es.wikipedia.gmi/wiki/PuTTY[8]

# Entornos gráficos, ejecución remota de aplicaciones gráficas

## `ssh -X`

Es posible ejecutar una aplicación gráfica de un servidor remoto visualizando en el equipo local por medio de `ssh`, solo es necesario incluir el parámetro `-X` y el servidor *X* se redireciona a nuestro *host*

ssh -X caipiroska 'gnome-calculator'


## `DISPLAY\`:0=

Utilizando la aplicación `notify-send` se puede enviar un mensaje de notificación, normalmente es utilizado para visualizar eventos del sistema, y estoy lo podemos hacer en un equipo remoto mediante `ssh`:

ssh -X osiris@localhost "DISPLAY=:0 notify-send 'hola!'"


## `vnc4server`

Habitualmente se utiliza **VNC** para compartir la sesión actual, pero también se pueden levantar instancias nuevas, pudiendo tener entornos gráficos diferentes en cada sesión de usuario en el mismo servidor.

Es necesario ejecutar en el servidor:

vnc4server


# Procesos

# AUTHOR: Osiris Alejandro Gomez

# EMAIL: osiux@osiux.com

# DATE: 2012-11-06 02:33

## ¿Qué es proceso?

# Un proceso es la instancia de un programa en ejecución.

# También se lo conoce como tarea.

## ¿Por qué?

# GNU/Linux es un sistema multitarea, permite la ejecución de múltiples procesos al mismo tiempo.

# Comprender el concepto de procesos nos permite administrar el rendimiento de nuestro equipo.

## Lo que el usuario ve:

=> img/cfp-procesos-01.png [IMG]

## Lo que el sistema ve:

=> img/cfp-procesos-03.png [IMG]

=> img/cfp-procesos-04.png [IMG]

## `PID`

# Todo proceso que se inicia tiene un número asignado llamado ****PID****.

# Este ****PID**** permite identificar el proceso y administrarlo (detenerlo, reanudarlo etc...)

# Ejemplo: Para obtener el ****PID**** de un proceso podemos usar el comando `pidof`:

Listar procesos

El comando `ps` puede listar el estado de los procesos:

[IMG]

Operaciones

Los procesos se pueden controlar de manera externa.

El comando `kill`, `xkill` o `killall` permite enviarle señales a los procesos. Por ejemplo la señal de terminación:

[IMG]

Jerarquía

El comando pstree nos permite ver la organización de los procesos en ejecución:



En tiempo real

Para visualizar los procesos en ejecución, también se puede usar `htop` o `top`:


PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 8203 root 20 0 121m 18m 6500 S 5,9 0,9 3:47.59 Xorg 26355 osiris 20 0 26096 1488 1080 R 5,9 0,1 0:00.02 top 1 root 20 0 10648 788 652 S 0,0 0,0 0:12.03 init 2 root 20 0 0 0 0 S 0,0 0,0 0:00.16 kthreadd 3 root 20 0 0 0 0 S 0,0 0,0 14:15.93 ksoftirqd/0 6 root rt 0 0 0 0 S 0,0 0,0 0:00.00 migration/0 7 root -2 0 0 0 0 S 0,0 0,0 3:50.22 rcuc/0 8 root rt 0 0 0 0 S 0,0 0,0 0:00.00 rcun/0 9 root -2 0 0 0 0 S 0,0 0,0 0:00.00 rcub/0 10 root rt 0 0 0 0 S 0,0 0,0 0:00.00 rcun/1 11 root -2 0 0 0 0 S 0,0 0,0 0:00.00 rcub/1 12 root rt 0 0 0 0 S 0,0 0,0 0:00.00 migration/1 14 root -2 0 0 0 0 S 0,0 0,0 5:24.04 rcuc/1 ```

[IMG]

Resumen

Los procesos son instancias de programas en funcionamiento.

Los recursos del sistema son limitados, el sistema administra y hace posible compartir recursos.

Cada proceso tiene un identificador (`PID`), que nos sirve para enviar señales.

Changelog

[2013-03-18 lun] migro slides pdf[1] de Hugo Ruscitti a `.gmi`

1: http://wiki.gcoop.coop/_media/apuntes:procesos.pdf[10]

Automatizando tareas: `sleep`, `jobs`, `crontab`

AUTHOR: Osiris Alejandro Gomez

EMAIL: osiux@osiux.com

Procesos padres e hijos

Cada vez que ejecutamos un comando en una terminal, éste comando se convierte en un proceso hijo de la terminal que estamos ejecutando. Por ejemplo, si estamos en la interfase gráfica, la terminal sería ****gnome-terminal**** quien a su vez invoca al intérprete ****bash**** y desde ahí podríamos invocar a ****firefox****. Esto se puede visualizar de la siguiente manera:


4444 ? Ssl 0:13 gnome-terminal 4453 ? Z 0:00 \_ gnome-pty-helper 4454 pts/10 Ss 0:00 \_ bash 4509 pts/10 S+ 0:52 \_ firefox 6347 pts/13 Ss 0:00 \_ bash 11781 pts/13 S+ 0:01 | \_ ps fax 11782 pts/13 S+ 0:01 | \_ grep -C3 firefox ```

Lo que vemos es el árbol de ejecución de procesos y si cerramos la terminal, también se cerraría ****firefox**** por depender del proceso ****terminal****.

## Para mí, vos estás en segundo plano

Al ejecutar un comando en una terminal, por ejemplo ****top****, este comando pasa a estar en primer plano y hasta que no interrumpamos el comando presionando ****CTRL-C**** o saliendo del mismo mediante la tecla ****q****, no se puede ejecutar ningún otro comando en el misma terminal. Para solucionar este inconveniente es posible pasar el proceso a ****segundo plano****, para esto sólo basta presionar ****CTRL-Z****, lo cual nos devuelve el ****PROMPT**** de la terminal para que invoquemos nuevos comandos.

Es posible visualizar la lista de tareas mediante el comando ****jobs****, en este caso nos mostraría que está detenido:

Análisis de tráfico de red con `tcpdump` y `wireshark`

AUTHOR: Osiris Alejandro Gomez

EMAIL: osiux@osiux.com

DATE: 2012-15-12 22:19

la era de la inocencia

Iniciamos Firefox como es costumbre de todos los días y empezamos a saltar de un sitio web a otro. Nada extraño sucede, leemos y escribimos comentarios, ingresamos a algún chat, en fin nos comunicamos con otras personas a través de la red.

Suponemos que debido a que estamos solos frente a la compu, nadie más está viendo todo lo que enviamos y recibimos a través de la red... :-S

olfateando la red

Si mientras estamos usando la red, se nos ocurre ver qué datos pasan a través de la red, sólo necesitamos usar `tcpdump`:


Su uso es muy simple, solo basta indicar la interfaz de red:

El resultado es similar al siguiente:


Lo que vemos, es la información del encabezado de cada paquete que pasa por la interfaz de red, en este caso `eth2`.

Si no sabemos qué interfaz de red utilizar o simplemente ver cuáles están disponibles, usamos el comando `ifconfig`:

Veríamos un listado similar al siguiente:


eth2 Link encap:Ethernet direcciónHW 00:15:84:2b:6b:8e Direc. inet:192.168.1.18 Difus.:192.168.1.255 Másc:255.255.255.0 Dirección inet6: fe80::215:84ff:fe2b:6b8e/64 Alcance:Enlace ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1 Paquetes RX:632042 errores:0 perdidos:0 overruns:0 frame:0 Paquetes TX:647823 errores:0 perdidos:0 overruns:0 carrier:0 colisiones:0 long.colaTX:1000 Bytes RX:207733278 (207.7 MB) TX bytes:291419413 (291.4 MB) Interrupción:18 Dirección base: 0xc800

lo Link encap:Bucle local Direc. inet:127.0.0.1 Másc:255.0.0.0 Dirección inet6: ::1/128 Alcance:Anfitrión ACTIVO BUCLE FUNCIONANDO MTU:16436 Métrica:1 Paquetes RX:186169 errores:0 perdidos:0 overruns:0 frame:0 Paquetes TX:186169 errores:0 perdidos:0 overruns:0 carrier:0 colisiones:0 long.colaTX:0 Bytes RX:37061384 (37.0 MB) TX bytes:37061384 (37.0 MB) ```

En este caso contamos con `eth0`, `eth2` y `lo` que es la interfaz local. Como se puede ver, la `eth2` tiene la dirección ****IP**** `192.168.1.18`.

Si quisieramos ver las ****IPs**** y los números de puertos en lugar de los nombres de dominio y servicios asociados, debemos usar el parámetro `-n`:

Ahora se reemplaza `osiale.gcoop.com.ar` por `192.168.1.18`, `ssh` por `22`, `domain` por `53` y `malbec` por `192.168.1.1`:


El tráfico de red que capturamos depende mucho de en que lugar de la red estamos parados, no es lo mismo hacerlo desde un punto terminal que hacerlo entre un ****router**** y un ****switch**** o desde el ****gateway**** de salida a internet de toda la red. En los puntos donde se concentran todas conexiones vamos va ver el tráfico de más máquinas, es decir más personas!

## mirando en profundidad

Es posible el contenido de los paquetes en formato ASCII mediante el parámetro `-A`, indicar la cantidad de paquetes a capturar con `-c` y aplicar filtros, como por ejemplo que solo nos interesar capturar el tráfico que enviamos a los sitios web, o sea filtrar por puerto de destino `80`.

La sentencia sería la siguiente:

En este caso logramos capturar la consulta al sitio `osiux.com` que corresponde a la ****IP**** `67.208.113.123` y puerto `80`, para esto se está usando un `Firefox` versión `15.0.1` en una máquina con `Ubuntu` y el idioma preferido es `es~ar~` (Español, Argentina).

En este caso, el que realiza la consulta es la ****IP**** `192.168.1.18` desde el puerto `57935`.


Es muchísima información la que se puede obtener con observar un sólo paquete de red!

Entonces podemos saber:

# qué sitios se visitan

# quiénes los miran

# qué escriben

# qué leen

## y si chateamos?

Probemos que sucede si chateamos en la red local, sin salir a Internet. Para esto, usamos ****Pidgin****, un programa que soporta casi todos los protocolos y servicios de chat existentes.

Primero instalamos ****Pidgin****:

Luego lo iniciamos, escribiendo `pidgin` en una terminal o lo buscamos en el menú de la interfaz gráfica, debería estar en ****Aplicaciones->Internet->Pidgin****

Al iniciar, nos solicita ****añadir**** una cuenta, elegimos el protocolo ****Bonjour**** e ingresamos nuestro ****Nombre**** y ****Apodo****, para finalizar presionamos ****Aceptar**** y luego ****Cerrar****.

Listo, ahora vamos a poder chatear con todos aquellos que en la red local, tengan instalando un programa que soporte el protocolo ****Bonjour****, también conocido como ****IChat**** o ****Avahi****.

Comenzamos a chatear con nuestros amigos y al mismo tiempo ejecutamos `tcpdump` filtrando por el puerto `5298`


El resultado de capturar 5 paquetes es:

Si miramos el primer paquete ignorando los caracteres especiales, se puede ver que el mensaje es para ****Leito**** desde la máquina ****zapata**** y lo envía ****osiris**** desde la máquina ****osiale**** y el cuerpo del mensaje se encuentra entre las ****etiquetas**** `<body>` y `</body>`.


Entonces, quiere decir que tanto lo que navegamos como lo que chateamos puede ser interceptado y leído por cualquiera en la red, solo basta usar `tcpdump`.

## el fin de la privacidad?

Cualquier ****sniffer**** como `tcpdump` puede capturar todo el tráfico de la red y hasta se podría modificar el contenido de los paquetes que viajan a través de la red sin que nos demos cuenta.

Y entonces, cómo hacemos para tener algo de privacidad?

La respuesta es ****no enviar mensajes en texto plano****, para esto lo mejor es ****cifrar todos los mensajes****, hay varios protocolos que envían y reciben todos los datos de manera cifrada.

En el caso de los sitios webs es posible acceder por ****HTTPS**** en lugar de ****HTTP****, por ejemplo, en lugar de ir a `http://google.com%5C%60[19] podemos acceder a `https://encrypted.google.com/%5C%60[20] y asi todo lo que enviemos a ****google**** irá cifrado y aunque alguien capture ese tráfico de red, ****no podrá entenderlo****, aunque no evitaremos que sepan que estamos ingresando al sitio ****google.com****.

Tener que tipear ****https**** en lugar de ****http**** todo el tiempo no es algo cómodo y además la mayoría de las páginas web hacen enlaces a los sitios usando ****http****. La solución a este problema es instalar un ****plugin**** en el navegador, por ejemplo para ****Firefox**** existe ****HTTPSEveryWhere****, que hace esto por nosotros y soporta una gran lista de sitios webs, obviamente los más usados.

Para instalarlo, acceder a: https://www.eff.gmi/https-everywhere-node%5B1%5D[21]

También existen otras alternativas como usar un ****túnel SSH****. Siempre que dispongamos de una máquina remota con GNU/Linux conectada a internet (en nuestra casa, por ejemplo) podríamos usarla para cifrar nuestra conexión y lograr (por lo menos) que en la red local, en la que estamos actualmente nadie pueda ver lo que hacemos.

Para esto, podemos hacer lo siguiente:

De esta manera, de ahora en más vamos a tener un ****Proxy SOCKS**** corriendo en el puerto `9090`, sólo bastaría decirle a todas las aplicaciones que usan la red, que no se conecten directamente, sino que utilicen `localhost:9090` como servidor ****Proxy****.

En ****Firefox**** ir a ****Editar->Preferencias->Avanzadas->Red->Configuración****

Ahí seleccionamos ****Configuración manual de proxy**** e ingresamos en ****Servidor proxy SOCKS**** la dirección ****localhost y el puerto 9090****, presionamos ****Aceptar****, y listo, ya podemos navegar tranquilos.

En realidad, sólo estamos cifrando un tramo de la conexión, desde la máquina en donde estamos hasta la máquina remota, desde esta última el tráfico viajará sin el cifrado de ****SSH****.

por las dudas yo guardo el tráfico de red ;-)

Podemos decirle a `tcpdump` que en lugar de mostrarnos el tráfico de red, lo guarde en un archivo, para luego analizarlo en profundidad. También se utiliza para hacer monitoreo remoto o buscar la causa de algún problema en la red, detectar alguna intrusión no autorizada, hacer auditorías, etc.

Mediante `-s 0` indicamos que capture el paquete completo y con `-w` se especifica el archivo donde se guarda el tráfico.


Existen muchas herramientas que leen archivos `.pcap`, una de ellas es ****Wireshark****, que es un analizador de protocolos muy completo y que además posee interfaz gráfica.

Lo instalamos:

Podemos indicar a ****WireShark**** que inicie leyendo el archivo:


También se puede iniciar desde el menú ****Aplicaciones->Internet->Wireshark****

Una vez iniciado, se puede apreciar que la pantalla está dividida en tres partes, que serían:

# el listado de paquetes

# panel de detalles del paquete seleccionado

# panel de bytes del paquete seleccionado

Es bastante intuitivo y muy interesante para los curiosos! :-D

## no entendí nada! :-(

El análisis de tráfico de red, requiere de ciertos conocimientos básicos de redes, sobre el modelo ****OSI**** y el modelo ****TCP/IP****, saber sobre ****DNS****, ****ARP**** y otras tantas cosas como los ****RFC****, pero a no desesperar, leer aunque sea muy por arriba los siguiente links:

# https://es.wikipedia.gmi/wiki/Modelo_osi%5B2%5D[22]

# https://es.wikipedia.gmi/wiki/Modelo_TCP/IP%5B3%5D[23]

La próxima entrega veremos en un lenguaje muy simple y claro, lo básico de cómo funcionan las redes y sobre todo cómo interactúan los distintos elementos que la componen.

La idea de usar ****tcpdump**** era volverlos un poquito paranoicos, ahora saben que es muy probable que alguien en algún punto de la red, esté mirando (y hasta guardando) todos los datos que enviamos y recibimos, aunque sólo se trate del **Administrador de la Red**.

=> https://www.eff.gmi/https-everywhere-node[24] 1: https://www.eff.gmi/https-everywhere-node[25] => https://es.wikipedia.gmi/wiki/Modelo_osi[26] 2: https://es.wikipedia.gmi/wiki/Modelo_osi[27] => https://es.wikipedia.gmi/wiki/Modelo_TCP/IP[28] 3: https://es.wikipedia.gmi/wiki/Modelo_TCP/IP[29]

# Introducción a las redes TCP/IP

# Configuración de servicios básicos

## Apache

# AUTHOR: Osiris Alejandro Gómez

# EMAIL: osiux@osiux.com

# DATE: 2014-02-10 11:56

Instalar Apache

Crear un VirtualHost

Primero se debe crear un archivo preferentemente con el nombre del dominio y ubicarlo en `sites-available`.


El contenido debe tener al menos los siguientes parámetros:

Luego se debe habilitar el sitio, de la siguiente manera:


Iniciar, Detener y Reiniciar Apache

Los cambios en los VirtualHost son aplicados sólo cuando se reinicia el servicio, es posible hacerlo de dos maneras:

PHP

AUTHOR: Osiris Alejandro Gómez

EMAIL: osiux@osiux.com

DATE: 2014-02-10 11:56

Instalar PHP


## Configurar PHP

memory~limit~ = 128M error~reporting~ = E~ALL~ upload~maxfilesize~ = 20M ```

Programar PHP


<? include "DB.php"; mysql = new DB(); $dsn = 'mysqli://usuario:secreto@localhost/mibase; b = $mysql->connect($dsn); echo '<table bgcolor="gray" border="0" cellspacing="1" cellpadding="1">'; $query = "SELECT c.name, e.email~address~ from contacts c INNER JOIN contacts~emails~ ce on ce.contact~id~ = c.id INNER JOIN emails e on e.id = ce.email~id~ ORDER BY c.name, e.address;"; $result = $db->query($query); while($row = $result->fetchRow (DB~FETCHMODEASSOC~)) { printf('<tr> <td bgcolor="white">%s</td> <td bgcolor="white">%s</td> </tr>',$row['name'],$row['address']); } echo '</table>'; ?> ```

## MySQL

# AUTHOR: Osiris Alejandro Gomez

# EMAIL: osiux@osiux.com

# DATE: 2009-12-01 01:15

## Crear Base y Usuario

Otorgar privilegios a un usuario@host a una base


## UTF8

Definir UTF8 en el cliente

Definir UTF8


## MySQL de Bash

Definir Alias

Ejecutar consulta


Listado de Tablas

Listado Tabla Campo


Quitar nombre de campo

Vaciar todas las tablas que contengan la palabra ****calls****


## MySQL desde Vim

Agregar en `.vimrc`

Ejecutar todo el archivo


Ejecutar la línea actual

Ejecutar un rango de líneas


Ejecutar desde línea actual hasta el final

Usar diccionarios


CTRL-X CTRL-K ```

## Reemplazar Texto

### Traducir valores

Actualizar registros


## Buscar duplicados

1 ORDER BY last~name~, first~name~; ```">

Agrupar

 500 ORDER BY total DESC; ```">

## Cruzando tablas

Explicito mejor que implicito

SELECT COUNT(cc.id) AS total FROM calls~contacts~ cc, contacts co WHERE co.deleted = 0 AND co.id = cc.contact~id~ AND cc.deleted = 0 ```

Contactos con llamadas


Contactos con llamadas entrantes

Actualizar las llamadas de un contacto


UPDATE calls ca INNER JOIN calls~contacts~ cc ON cc.call~id~ = ca.id INNER JOIN contacts co ON co.id = cc.contact~id~ SET ca.assigned~userid~ = ( SELECT id FROM users WHERE user~name~ = 'osiris' ) WHERE co. = '2a756d50-ae20-0754-a7c7-49beb64cee37'; ```

## Insertar desde otra tabla

CREATE TABLE `calls~contactstoday~` ( `id` varchar(36) NOT NULL, `contact~id~` varchar(36) NOT NULL, `call~id~` varchar(36) NOT NULL, `status` varchar(25) default NULL, `direction` varchar(25) default NULL, PRIMARY KEY (`call~id~`) );

INSERT INTO calls~contactstoday~ (id, contact~id~, call~id~, status, direction) SELECT UUID(), cc.contact~id~, ca.id, ca.status, ca.direction FROM calls ca INNER JOIN calls~contacts~ cc ON cc.call~id~ = ca.id WHERE DATE(ca.date~start~) = CURDATE(); ```

AUTOCOMPLETE


SELECT FROM t<Presionar TAB> ```

## COUNT

EXPLAIN


## INDEX

UNIQUE


## AUTO~INCREMENT~

REGEXP


 AND         postal REGEXP '^[A-Z]{3}[0-9]{4}


 ```">

## RANDOM

Postfix

`TODO`

DHCP

`dhcp3`

1. configuración

Es muy simple la sintaxis del archivo `/etc/dhcp3/dhcpd.conf` donde podemos especificar los sevidores de dns (**domain-name-servers**) entre otros parámetros, lo importante es definir la subred, en el caso de tratarse de una LAN es muy común la siguiente configuración:


2. iniciar y detener el servicio


# Metodologías ágiles de trabajo

## Time Management for System Administrators



## GTD

# AUTHOR: Osiris Alejandro Gómez

# EMAIL: osiux@osiux.com

# DATE: 2014-02-10 11:56

Es un método de gestión de las actividades y el título de un libro de David Allen ^1^[^1], libro que en español se ha editado con el título ****Organízate con eficacia**** ^2^[2].



A diferencia de otros expertos en gestión del tiempo, ****Allen**** no se centra en el establecimiento de prioridades. En su lugar, él insta a la creación de listas de tareas específicas para cada contexto, por ejemplo, una lista de llamadas telefónicas pendientes o recados que hacer en la ciudad. También sugiere que cualquier nueva tarea que pueda ser completada en menos de dos minutos debería ser hecha inmediatamente.

## Workflow

`> img/gtd-workflow.png [IMG] {width`"640" height="480" title="GTD Workflow"}

## Recopilar

# Capturar todo en *****INBOX***** y seguir trabajando * Ideas * Tareas * Recordatorios * Cosas por hacer en general

# Utilizar una herramienta de captura ágil

# Capturar... y olvidarse de momento

# Aplicar ****regla de los 2 minutos****

## Procesar

# Procesar por completo el ****INBOX**** * Si requiere actuar * Delegar a alguien * Asignar a carpeta (sólo si depende de mi) * No requiere actuar * Eliminar * Archivar

# Procesar de manera ágil, tomar decisiones rápidas

# Aislarse de las distracciones

# Aplicar ****regla de los 2 minutos****

## Organizar

# Asignar acciones a una carpeta * ****PRÓXIMO****, a realizar en un lapso de tiempo corto * ****PROYECTO****, cosas a realizar dentro de un proyecto * ****EN ESPERA****, depende de otra persona * ****ALGÚN DÍA****, no tiene prioridad temporal

## Revisar

# Fijar un momento para la revisión

# Revisión ágil y diligente

# Localizar y cuidar las tareas clave

# Las acciones cambian de carpeta

=> http://davidco.com[31] 1: http://davidco.com[32] => http://www.cuspide.com/isbn/849662708X[33] 2: http://www.cuspide.com/isbn/849662708X[34]

## Scrum

`TODO`

[DONE]{.done .DONE} Sprint <2012-08-06 lun>--<2012-08-10 vie>

1. disponibilidad horaria estimada

|        | lun  | mar | mie | jue  | vie | tot  | |--------|------|-----|-----|------|-----|------| | diego  | 2.5  | 3   | 0   | 1.5  | 3   | 10. | | joac   | 3    | 3   | 0   | 1.5  | 3   | 10.5 | | jose   | 6    | 6   | 0   | 3    | 6   | 21   | | hugo   | 4    | 0   | 0   | 3    | 6   | 13   | | osiris | 3    | 3   | 0   | 3    | 6   | 15   | |        | 18.5 | 15  | 0   | 12. | 24  | 69.5 |

2. disponibilidad horaria real

|        | lun  | mar | mie | jue  | vie | tot  | |--------|------|-----|-----|------|-----|------| | diego  | 2.5  | 3   | 0   | 1.5  | 3   | 10. | | joac   | 3    | 3   | 0   | 1.5  | 3   | 10.5 | | jose   | 6    | 6   | 0   | 3    | 6   | 21   | | hugo   | 4    | 0   | 0   | 3    | 6   | 13   | | osiris | 3    | 3   | 0   | 3    | 6   | 15   | |        | 18.5 | 15  | 0   | 12. | 24  | 69.5 |

3. estimado versus real

| fecha      | est  | real | pend est | pend real | |------------|------|------|----------|-----------| | 2012-08-05 | 0    | 0    | 34.75    | 34.75     | | 2012-08-06 | 9.25 | 9    | 25.5     | 25.75     | | 2012-08-07 | 7.5  | 7.5  | 18.     | 18.25     | | 2012-08-08 | 0    | 0    | 18.     | 18.25     | | 2012-08-09 | 6    | 6    | 12.     | 12.25     | | 2012-08-10 | 12   | 4    | 0.      | 8.25      |

4. burndown

=> gca-scrum-2012-08-06.png [IMG]

## Pomodoro

`TODO`

## Autofocus

`TODO`

## Kanban

`TODO`

# Aplicaciones de Consola

# AUTHOR: Osiris Alejandro Gómez

# EMAIL: osiux@osiux.com

# DATE: 2014-02-10 10:35

## chat

# irssi

# centerim

# finch

## copias

# rdiffbackup

# rsync

# scp

## correo

# alpine

# mutt

# sup

## descargas

# axel

# rtorrent

# wget

# ncftp

## disco

# ncdu

## editores

# emacs

# vim

## explorador de archivos

# mc

# ranger

# vifm

## monitoreo

### `top`

### `atop`

Es posible consultar el registro de un día en particular, por ejemplo qué procesos estaban consumiendo mayor acceso a disco el 24/01/2014 en el servidor tempranillo entre las 10 y 12hs:


ATOP - tempranillo 2014/01/21 10:00:02 ------ 10m0s elapsed PRC | sys 4.15s | user 7.35s | #proc 255 | #zombie 0 | #exit 330 | CPU | sys 1% | user 1% | irq 0% | idle 798% | wait 0% | cpu | sys 0% | user 0% | irq 0% | idle 99% | cpu000 w 0% | cpu | sys 0% | user 0% | irq 0% | idle 100% | cpu001 w 0% | cpu | sys 0% | user 0% | irq 0% | idle 100% | cpu005 w 0% | cpu | sys 0% | user 0% | irq 0% | idle 100% | cpu002 w 0% | cpu | sys 0% | user 0% | irq 0% | idle 100% | cpu007 w 0% | cpu | sys 0% | user 0% | irq 0% | idle 100% | cpu006 w 0% | cpu | sys 0% | user 0% | irq 0% | idle 100% | cpu004 w 0% | cpu | sys 0% | user 0% | irq 0% | idle 100% | cpu003 w 0% | CPL | avg1 0.00 | avg5 0.01 | avg15 0.05 | csw 137938 | intr 135127 | MEM | tot 3.8G | free 44.8M | cache 2.1G | buff 258.7M | slab 225.9M | SWP | tot 4.0G | free 3.9G | | vmcom 2.3G | vmlim 5.9G | PAG | scan 84 | stall 0 | | swin 0 | swout 0 | DSK | xvdb | busy 0% | read 171 | write 923 | avio 0.83 ms | DSK | xvda | busy 0% | read 8 | write 1095 | avio 0.22 ms | NET | transport | tcpi 3900 | tcpo 3845 | udpi 351 | udpo 372 | NET | network | ipi 4312 | ipo 3829 | ipfrw 0 | deliv 4295 | NET | eth0 ---- | pcki 2153 | pcko 1670 | si 3 Kbps | so 18 Kbps | NET | lo ---- | pcki 2160 | pcko 2160 | si 5 Kbps | so 5 Kbps |

PID SYSCPU USRCPU VGROW RGROW RDDSK WRDSK ST EXC S DSK CMD 3595 0.43s 0.61s 0K 28K 0K 2856K -- - S 19% mysqld 4400 0.02s 0.07s 1876K 152K 2180K 56K -- - S 15% imap 2573 0.01s 0.00s 0K 0K 0K 2164K -- - S 15% jbd2/xvdb-8 1358 0.01s 0.00s 0K 0K 0K 1732K -- - S 12% kjournald 2238 0.25s 0.89s 552K 596K 0K 1676K -- - R 11% /usr/sbin/amav ```

### `htop`

### `iftop`

### `iotop`


### `ioping`


--- /mnt/data (xfs /dev/mapper/data) ioping statistics --- 5 requests completed in 4023.8 ms, 216 iops, 0.8 mb/s min/avg/max/mdev = 0.6/4.6/20.8/8.1 ms ```

### mon

### monit

### munin

### `mtr`


### sysstat

### `vnstat`

1. top 10

1. vista mensual


1. vista semanal

1. vista por horas

 | 23 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 h rx (KiB) tx (KiB) h rx (KiB) tx (KiB) h rx (KiB) tx (KiB) 23 38043 18600 07 39022 3080 15 1618 6379 00 39348 9530 08 38429 23452 16 2715 17279 01 39080 10637 09 1997 3372 17 3533 27827 02 38853 3011 10 2148 3307 18 4522 21075 03 38293 32727 11 1117 5484 19 2201 6809 04 38632 4056 12 2979 7545 20 4449 23659 05 39518 18170 13 2040 10555 21 2587 8113 06 37873 14265 14 3063 10136 22 44656 1721 ```">

### multitail

### logcheck

## musica

# moc

## navegadores web

# elinks

# links

# lynx

# w3m

## red

# wicd-curses

# tshark

# tcpdump

# netcat

# nmap

## rss

# newsbeuter

## seguridad

# chrootkit

# cron-apt

# fail2ban

# rkhunter

## utilitarios

# screen

# tmux

## versionado

# etckeeper

# git-core

# mercurial

# subversion

# tig

## ssh

### `parallel-ssh`

Armamos un listado con los ****hostnames**** de cada servidor y lo guardarmos en un archivo, por ejemplo en `~/.ssh/gcoop`, ahora solo falta indicar el comando a ejecutar `uptime` en este caso y listo!


[^1]: -   Detenido top

\`\`\`

Para recuperar la ejecución de ****top**** podemos escribir

plano.

\#\# Sos tan lento... que no te quiero ver

También se puede enviar a segundo plano un comando ni bien lo

invocamos, generalmente esto, se hace con comandos que sabemos que

van a tardar mucho, como por ejemplo listar todos los archivos que

hay en el disco rígido y enviarlo a un archivo, para esto solo basta

agregar el caracter ****&**** o ****ampersand**** al final de un

comando:

\`\`\` {.example}

\`\`\`

De esta manera, el comando ****find**** lista todos los archivos que

se encuentran en la raíz ****/**** y los envía a un archivo usando

Podemos ver que el total de líneas del archivo crece mediante el

comando ****wc****:

\`\`\` {.example}

\`\`\`

Algunos comandos ya incluyen una función de segundo plano, por

ejemplo ****wget**** que sirve para descargar archivos, mediante el

parámetro \*\*-b\*\* redirecciona la salida del comando al archivo

\`\`\` {.example}

Continuando en segundo plano, pid 12949. La salida será escrita a

"wget-log". \`\`\`

Para visualizar si se completó la descargar, solo basta mirar el

archivo ****wget-log****, en la última línea debería decir 100%:

\`\`\` {.example} cat \~/wget-log

--2012-10-29 18:28:50--

<http://releases.ubuntu.com/precise/ubuntu-12.04.1-desktop-i386.iso>

Resolviendo localhost (localhost)... 127.0.0.1 Conectando con

localhost (localhost)\[127.0.0.1\]:8123... conectado. Petición Proxy

enviada, esperando respuesta... 200 OK Longitud: 729067520 (695M)

\[application/x-iso9660-image\] Grabando a:

"ubuntu-12.04.1-desktop-i386.iso"

0K .......... .......... .......... .......... .......... 0% 24,7K

8h0m 50K .......... .......... .......... .......... .......... 0%

68,8K 5h26m 100K .......... .......... .......... ..........

.......... 0% 61,5K 4h41m 150K .......... .......... ..........

.......... .......... 0% 66,8K 4h15m \`\`\`

\#\# Esta compu, se destruye en 5 minutos!

En ocasiones es necesario ejecutar algún comando dentro de cierto

tiempo, por ejemplo dentro de 5 minutos, para ello se puede utilizar

segundos, ****m**** para minutos y ****h**** para horas:

\`\`\` {.example}

\`\`\`

\#\# Tengo un crontab para no olvidar nada

Mediante el uso del ****crontab**** es posible definir la ejecución

de tareas de manera específica.

Es posible entonces programar una tarea de manera diaria, semanal,

mensual, etc:

\`\`\` {.example}

\*/5 \* \* \* \* /root/cada-5-minutos.sh 0 23 \* \* \*

/root/backup-diario.sh 0 0 1 \* \* /root/backup-mensual.sh 0 23 31

12 \* /root/backup-anual.sh 0 12 \* \* 0 DISPLAY=:0.0

/usr/bin/notify-send \"asadito\" 0 12 29 \* \* DISPLAY=:0.0

/usr/bin/notify-send \"ñoquis\" \`\`\`

Para editar, ejecutar:

\`\`\` {.example}

\`\`\`

Para listar, ejecutar:

\`\`\` {.example}

\`\`\`

\#\# Robotizando el mouse

Muchas veces, puede resultar muy útil automatizar tareas de la

interfase gráfica pero usando una terminal, para esto es necesario

instalar ****xautomation****:

\`\`\` {.example}

\`\`\`

Una vez instalado, es posible mover el mouse y hacer click en un

lugar determinado de la pantalla de la siguiente manera:

\`\`\` {.example}

\`\`\`

La orden ****mousemove 100 300**** hace que el mouse se mueva a la

posicion 100 en el eje X, o sea a 100 pixels de la esquina izquiera

del monitor, de igual manera a 300 pixels en el eje Y.

La orden ****mouseclick 1**** emula un click en el botón izquierdo

del mouse.

Imaginemos que por algún motivo, necesitamos movernos a un lugar en

la pantalla y hacer muchos clicks, por ejemplo para avanzar de

página en internet y queremos capturar la pantalla antes de hacer

click y asi guardar lo que se está mostrando.

Entonces necesitamos instalar un capturador de pantalla que funcione

desde la terminal, por ejemplo ****scrot****:

\`\`\` {.example}

\`\`\`

Ahora bien, ya sabemos movernos por la pantalla, hacer click y

tenemos un comando que captura la pantalla, sólo bastaría hacer un

pequeño programa que repita la operación, por ejemplo 186 veces!:

\`\`\` {.example}

\`\`\`

Listo, en una sóla línea es posible definirlo, basta con presionar

Veamos que hace cada línea, paso a paso:

\`\`\` {.example} for i in {1..186} \# incrementa el valor de i

desde 1 a 186 do \# inicia la ejecucion scrot \# captura la pantalla

xte \'mousemove 100 300\' \# mueve el mouse a la posicion 100,300

xte \'mouseclick 1\' \# presiona click izquierdo del mouse sleep 3s

\# espera 3 segundos done \# termina la ejecucion \`\`\`

De esta simple manera, se pueden automatizar muchísimas tareas!


=> https://es.wikipedia.gmi/wiki/Ssh%5B1%5D 1: https://es.wikipedia.gmi/wiki/Ssh%5B1%5D
=> https://es.wikipedia.gmi/wiki/PuTTY%5B3%5D 2: https://es.wikipedia.gmi/wiki/PuTTY%5B3%5D
=> https://es.wikipedia.gmi/wiki/Ssh 3: https://es.wikipedia.gmi/wiki/Ssh
=> https://es.wikipedia.gmi/wiki/Ssh 4: https://es.wikipedia.gmi/wiki/Ssh
=> https://es.wikipedia.gmi/wiki/PuTTY 5: https://es.wikipedia.gmi/wiki/PuTTY
=> https://es.wikipedia.gmi/wiki/PuTTY 6: https://es.wikipedia.gmi/wiki/PuTTY
=> https://es.wikipedia.gmi/wiki/PuTTY 7: https://es.wikipedia.gmi/wiki/PuTTY
=> https://es.wikipedia.gmi/wiki/PuTTY 8: https://es.wikipedia.gmi/wiki/PuTTY
=> http://wiki.gcoop.coop/_media/apuntes:procesos.pdf 9: http://wiki.gcoop.coop/_media/apuntes:procesos.pdf
=> http://wiki.gcoop.coop/_media/apuntes:procesos.pdf 10: http://wiki.gcoop.coop/_media/apuntes:procesos.pdf
=> http://www.w3.gmi/1999/xhtml 11: http://www.w3.gmi/1999/xhtml
=> jabber:x:event 12: jabber:x:event
=> http://www.w3.gmi/1999/xhtml 13: http://www.w3.gmi/1999/xhtml
=> jabber:x:event 14: jabber:x:event
=> http://www.w3.gmi/1999/xhtml 15: http://www.w3.gmi/1999/xhtml
=> jabber:x:event 16: jabber:x:event
=> http://www.w3.gmi/1999/xhtml 17: http://www.w3.gmi/1999/xhtml
=> jabber:x:event 18: jabber:x:event
=> http://google.com%5C%60 19: http://google.com%5C%60
=> https://encrypted.google.com/%5C%60 20: https://encrypted.google.com/%5C%60
=> https://www.eff.gmi/https-everywhere-node%5B1%5D 21: https://www.eff.gmi/https-everywhere-node%5B1%5D
=> https://es.wikipedia.gmi/wiki/Modelo_osi%5B2%5D 22: https://es.wikipedia.gmi/wiki/Modelo_osi%5B2%5D
=> https://es.wikipedia.gmi/wiki/Modelo_TCP/IP%5B3%5D 23: https://es.wikipedia.gmi/wiki/Modelo_TCP/IP%5B3%5D
=> https://www.eff.gmi/https-everywhere-node 24: https://www.eff.gmi/https-everywhere-node
=> https://www.eff.gmi/https-everywhere-node 25: https://www.eff.gmi/https-everywhere-node
=> https://es.wikipedia.gmi/wiki/Modelo_osi 26: https://es.wikipedia.gmi/wiki/Modelo_osi
=> https://es.wikipedia.gmi/wiki/Modelo_osi 27: https://es.wikipedia.gmi/wiki/Modelo_osi
=> https://es.wikipedia.gmi/wiki/Modelo_TCP/IP 28: https://es.wikipedia.gmi/wiki/Modelo_TCP/IP
=> https://es.wikipedia.gmi/wiki/Modelo_TCP/IP 29: https://es.wikipedia.gmi/wiki/Modelo_TCP/IP
=> http://www.tomontime.com/ 30: http://www.tomontime.com/
=> http://davidco.com 31: http://davidco.com
=> http://davidco.com 32: http://davidco.com
=> http://www.cuspide.com/isbn/849662708X 33: http://www.cuspide.com/isbn/849662708X
=> http://www.cuspide.com/isbn/849662708X 34: http://www.cuspide.com/isbn/849662708X