Administrador de Sistemas GNU/Linux
index | OSiUX | blog | docs | charlas | rss
Filosofía UNIX
UNIX incorpora un conjunto de herramientas que guardan cierta analogía con una navaja multiusos. Son simples, pero hacen muy bien su trabajo. En lugar de construir programas muy complejos, UNIX proporcionaba muchas pequeñas herramientas, y un esquema para poder combinarlas de forma efectiva. Este diseño escala muy bien, permitiendo al sistema crecer, incorporar nuevas herramientas y, a la vez, ser compatible hacia atrás.
Los objetivos con que se creó determinaron una filosofía de UNIX caracterizada por:
- comandos cortos, simples, específicos y muy eficientes, que "hacen una sola cosa pero la hacen muy bien".
- entrada y salida estandarizadas que permiten la interconexión de comandos. Esto se llama entubamiento (pipelining): la salida de un comando es tomada por el siguiente como entrada.
Algunas directivas son:
- Escribe programas que hagan una sola cosa y la hagan bien: esto quiere decir que los programas deben de ser lo más atómicos posible y que se compruebe mucho su rendimiento y funcionamiento para hacerlo lo mejor posible.
- Escribe programas que trabajen juntos: de nada sirve escribir programas que sirvan para una tarea específica y que, después, cuando esa tarea se modifique de cierta forma, haya que reescribir todo el programa.
- Es mejor dividir el problema en varios programas y después desechar o reescribir solo uno de esos pequeños programas, cuando se necesite, o incluso hacer nuevos.
- Escribe programas que manejen flujos de texto, pues esa es la interfaz universal: todo lo que se hace con entrada y salida en formato textual es más fácil de enlazar con otros programas, así como reutilizarla en el pasado, presente y futuro.
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:
- Lo pequeño es hermoso.
- Haz que cada programa haga una sola cosa, pero que la haga bien.
- Construye un prototipo lo antes posible.
- Elige portabilidad sobre eficiencia.
- Guarda los datos en archivos de texto plano.
- Aprovecha funcionalidades del software.
- Usa scripts de shell para aumentar la funcionalidad y portabilidad.
- Evita interfaces de usuario captivas.
- Haz de cada programa un filtro.
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:
- Que cada programa realice únicamente la tarea para la que fue creado y la haga bien.
- Para llevar a cabo una nueva tarea escribe un programa nuevo. No compliques uno viejo añadiendo nueva funcionalidad.
- Escribe tu programa teniendo en cuenta que su salida probablemente sea la entrada de otro programa.
- Guarda los datos en archivos de texto plano. Si necesitas seguridad, confía en los permisos.
- Usa nombres cortos y en minúscula.
- En la manera de lo posible haz que el usuario suministre los datos por línea de comandos en la llamada.
- Haz partes simples conectadas mediante interfaces limpias y bien definidas.
- Céntrate en los datos.
- Claridad mejor que complejidad. La solución más simple es frecuentemente la mejor.
- Portabilidad mejor que eficiencia.
- Piensa en paralelo. Hay otros procesos en el mundo, incluso instancias de tu mismo programa funcionando al mismo tiempo.
- Hacer programas grandes, solo cuando se demuestre que no se puede realizar con uno pequeño.
- Si no hay nada interesante que decir, que el programa mejor no diga nada.
- Para cada problema existen múltiples soluciones.
- Diseña pensando en el futuro (esta cercano). Esto nos ofrece compatibilidad y mayor tiempo de utilización.
- Programa de abajo hacia arriba y de conocimiento pragmático.
- Programa basado en el conocimiento Empírico o Experiencia.
- No se encuentra en los métodos y las normas oficiales, sino en el medio-reflexivo implícito, el conocimiento.
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 16 625130807 sdb 8 17 78148161 sdb1 8 18 78148192 sdb2 8 19 78148192 sdb3 8 20 1 sdb4 8 21 78148161 sdb5 8 22 78148161 sdb6 8 23 78148161 sdb7 8 24 78148161 sdb8 8 25 78091933 sdb9 8 0 488386584 sda 8 1 48827392 sda1 8 2 48828125 sda2 8 3 390729752 sda3 11 0 1048575 sr0 254 0 390727704 dm-0
/proc/uptime
El uptime
de nuestro equipo puede ser consultado directamente en
/proc/uptime
,
cat /proc/uptime
174464.30 316591.54
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:54:49 up 2 days, 27 min, 8 users, load average: 0,56, 0,35, 0,28
/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 jul 10 10:27 /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 jul 10 10:27 /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 / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
Visualizamos el espacio disponible:
df -h | grep sda
/dev/sda1 46G 30G 14G 70% /
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
Enviar la salida de errores a un archivo
Enviar la salida estándar y la salida de errores a un mismo archivo
Enviar la salida de errores a la salida estándar
Enviar la salida de estándar a /dev/null
Enviar la salida de estándar y la salida de errores a /dev/null
Enviar un archivo a la entrada estándar
Enviar la salida estándar a un archivo y a la salida estándar
Enviar la salida estándar de un comando como la entrada estándar de otro comando
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 : 23 model name : Pentium(R) Dual-Core CPU E5400 @ 2.70GHz model : 23 model name : Pentium(R) Dual-Core CPU E5400 @ 2.70GHz
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 : 23 model name : Pentium(R) Dual-Core CPU E5400 @ 2.70GHz model : 23 model name : Pentium(R) Dual-Core CPU E5400 @ 2.70GHz cache size : 2048 KB cache_alignment : 64 cache size : 2048 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 25M -rw-r----- 1 root adm 3,0M jul 12 10:54 auth.log -rw-r----- 1 root adm 146K jul 12 10:54 syslog -rw-r----- 1 root adm 3,2M jul 12 10:50 mail.info -rw-r----- 1 root adm 3,2M jul 12 10:50 mail.log -rw-r----- 1 root adm 411K jul 12 10:43 daemon.log -rw-r----- 1 root adm 217K jul 12 07:29 messages -rw-r----- 1 root adm 174 jul 12 06:47 lpr.log -rw-r----- 1 root adm 162K jul 12 06:47 kern.log drwxr-s--- 2 debian-tor adm 4,0K jul 12 06:25 tor
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
648M total 459M collectl 149M atop 16M installer 15M installer/cdebconf 3,2M mail.log 3,2M mail.info 3,1M mail.log.1 3,1M mail.info.1 3,0M auth.log
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:
pwd
Muestra el directorio actual.
cd
Cambia al directorio definido en
HOME
cd /etc/php5
Cambia el directorio actual a
/etc/php5
cd apache2
Cambia al subdirectorio
apache2
del directorio actualcd ..
Cambia al directorio inmediato superior
cd $HOME
Cambia al directorio definido en la variable
HOME
cd ~osiris
Cambia al directorio del usuario osiris
Listar directorios:
ls -l
Listar en formato ancho, de esta manera se visualizan gran parte de los atributos de cada archivo y/o directorio
$ ls -l -rw-rw-r-- 1 osiris www-data 612 nov 1 19:29 redes.html -rw-rw-r-- 1 osiris www-data 11457 nov 1 19:31 scrum.html -rw-rw-r-- 1 osiris www-data 6556 abr 24 2013 ssh.org -rw-rw-r-- 1 osiris www-data 609 abr 24 2013 graphviz.org -rw-rw-r-- 1 osiris www-data 17326 abr 24 2013 gnuplot.org -rw-rw-r-- 1 osiris www-data 11457 nov 1 19:31 tmp ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | | | | | | | | propietario grupo tamaño fecha hora nombre | | | | número de links al archivo o contenido del directorio | | | permisos para todos | | permisos para miembros del grupo | permisos para el propietario del archivo: | r lectura | w escritura | x ejecutar | - ninguno tipo de archivo: - archivo normal d directorio l enlace simbolico
ls
Listar directorio actual
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
-rw------- 1 osiris osiris 18624 jul 12 10:54 /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 18624 jul 12 10:54 /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 18624 jul 12 10:54 /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 19K jul 12 10:54 /home/osiris/.bash_history -rw------- 1 osiris osiris 19K jul 12 10:55 /home/osiris/.bash_history.bak daf0ff52ee95dae37de32a7f22df042b /home/osiris/.bash_history daf0ff52ee95dae37de32a7f22df042b /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
-rw------- 1 osiris osiris 18624 jul 12 10:54 /home/osiris/.bash_history -rw------- 1 osiris osiris 38259 mar 27 15:57 /home/osiris/historial.bak
Renombramos el archivo ~/historial.bak
a ~/historial.log
mv -vi ~/historial.bak ~/historial.log ls -l ~/historial.log
-rw------- 1 osiris osiris 28196 mar 26 12:59 /home/osiris/historial.log
Ver y editar arhivos:
cat
cat /etc/issue
Debian GNU/Linux 8 \n \l
head
head /proc/meminfo | head
MemTotal: 3439000 kB MemFree: 207776 kB MemAvailable: 1536480 kB Buffers: 303256 kB Cached: 1067364 kB SwapCached: 0 kB Active: 2083352 kB Inactive: 686992 kB Active(anon): 1413532 kB Inactive(anon): 135872 kB
head -2
head /proc/meminfo | head -2
MemTotal: 3439000 kB MemFree: 207544 kB
tail
tail /etc/passwd
mysql:x:112:120:MySQL Server,,,:/var/lib/mysql:/bin/false arpwatch:x:113:121:ARP Watcher,,,:/var/lib/arpwatch:/bin/sh vnstat:x:114:122::/var/lib/vnstat:/bin/false redsocks:x:115:125::/var/run/redsocks:/bin/false monkeysphere:x:116:126:monkeysphere authentication user,,,:/var/lib/monkeysphere:/bin/bash debian-tor:x:117:127::/var/lib/tor:/bin/false logcheck:x:118:128:logcheck system account,,,:/var/lib/logcheck:/bin/false postfix:x:119:129::/var/spool/postfix:/bin/false geoclue:x:120:132::/var/lib/geoclue:/bin/false fetchmail:x:121:65534::/var/lib/fetchmail:/bin/false
tail -2 /etc/passwd
geoclue:x:120:132::/var/lib/geoclue:/bin/false fetchmail:x:121:65534::/var/lib/fetchmail:/bin/false
sed
cat /etc/issue sed s/"7.0"/"8.0"/g /etc/issue cat /etc/issue
Debian GNU/Linux 8 \n \l Debian GNU/Linux 8 \n \l Debian GNU/Linux 8 \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
$
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
ssh
permite la ejecución remota de un intérprete de comandos
como bash
- Más información en: https://es.wikipedia.org/wiki/Ssh
¿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
- servidor SSH
- se instala haciendo:
sudo apt-get install openssh-server
- conexión a la red (si es internet mejor!)
- puerto 22 abierto (OjO con el firewall)
- que la computadora esté encendida! (aunque más adelante veremos cómo encender remotamente una computadora)
- servidor SSH
- computadora local
- cliente ssh
- en todos los linux ya está instalado!
- en otros sistemas pod usar PuTTY
- https://es.wikipedia.org/wiki/PuTTY
- dirección IP de computadora remota
- usuario válido de computadora remota
- contraseña del usuario de la computadora remota
- que el puerto 22 de salida esté habilitado en el firewall (aunque hay trucos para saltearlo)
- cliente ssh
¿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
)
ssh pepe@192.168.0.9
¿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
osiris@osiux.com:/home/osiris# ssh 192.168.0.9 The authenticity of host 'lab2 (192.168.0.9)' can't be established. RSA key fingerprint is e1:92:a3:54:95:e6:67:b8:89:80:11:02:93:f4:05:36. Are you sure you want to continue connecting (yes/no)?
- 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
root@lab2:/# pkill -u pepe
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:
pepe@lab2:~/$ cd Escritorio pepe@lab2:~/$ mkdir aguante pepe@lab2:~/$ mkdir la pepe@lab2:~/$ mkdir academia
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:
root@lab2:/# deluser pepe
- 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:
pepe@lab2:~/$ sudo -s [sudo] password for pepe: root@lab2:/# 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:echo -n maradona | md5sum 8b123b7a7cf86f5aa9424d1f379384d8
Mucho más fácil de recordar, frases de paso:
Se te escapo la tortuga!
- 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
sudo apt-get install 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
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
¿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:
Lo que el sistema ve:
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
:pidof init emacs
1 9175
Listar procesos
El comando ps
puede listar el estado de los procesos:
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:
Jerarquía
El comando pstree nos permite ver la organización de los procesos en ejecución:
ps -fax | grep -A 10 bash | head
23324 pts/12 Ss 0:00 \_ -bash 23470 pts/12 S+ 0:00 \_ /bin/bash /home/osiris/bin/tmuxemacs 23475 pts/12 S+ 0:00 \_ tmux a -t emacs 1830 ? Ss 0:00 /lib/systemd/systemd-logind 1853 ? Ss 0:01 avahi-daemon: running [stout.local] 1968 ? S 0:00 \_ avahi-daemon: chroot helper 1855 ? Ss 0:45 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation 1972 ? S 1:38 /usr/bin/tor --defaults-torrc /usr/share/tor/tor-service-defaults-torrc --hush 1979 ? Ssl 0:02 /usr/sbin/rsyslogd -n 1985 ? S 0:05 /usr/sbin/arpwatch -u arpwatch -N -p
pstree -p -U | head
systemd(1)─┬─/usr/bin/termin(4301)─┬─bash(4310)───tmuxmoc(4435)───tmux(4443)───sh(10217)───vlock-main(10218) │ ├─gnome-pty-helpe(4309) │ └─{gmain}(4311) ├─/usr/bin/termin(5167)─┬─bash(5174)───tmuxchat(5299)───tmux(5305)───sh(1722)───vlock-main(1731) │ ├─gnome-pty-helpe(5173) │ └─{gmain}(5175) ├─/usr/bin/termin(5664)─┬─bash(5672)───tmuxrcc(5805)───tmux(5815)───sh(15839)───vlock-main(15842) │ ├─bash(17884)───vim(18035)─┬─{ruby-timer-thr}(18037) │ │ └─{vim}(18036) │ ├─gnome-pty-helpe(5670)
En tiempo real
Para visualizar los procesos en ejecución, también se puede usar
htop
o top
:
export TERM=linux top -b -n1 | head -20
top - 10:55:04 up 2 days, 27 min, 8 users, load average: 1,11, 0,49, 0,32 Tasks: 218 total, 1 running, 217 sleeping, 0 stopped, 0 zombie %Cpu(s): 5,2 us, 2,9 sy, 0,6 ni, 90,6 id, 0,6 wa, 0,0 hi, 0,0 si, 0,0 st KiB Mem: 3439000 total, 3239652 used, 199348 free, 303412 buffers KiB Swap: 0 total, 0 used, 0 free. 1075224 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13213 lp 20 0 12708 1236 1064 S 6,4 0,0 4:01.07 lpd 1 root 20 0 111456 5204 2832 S 0,0 0,2 0:03.27 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:00.04 kthreadd 3 root 20 0 0 0 0 S 0,0 0,0 0:15.02 ksoftirqd/0 5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:+ 7 root 20 0 0 0 0 S 0,0 0,0 0:56.71 rcu_sched 8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0,0 0,0 0:00.44 migration/0 10 root rt 0 0 0 0 S 0,0 0,0 0:00.94 watchdog/0 11 root rt 0 0 0 0 S 0,0 0,0 0:00.94 watchdog/1 12 root rt 0 0 0 0 S 0,0 0,0 0:00.46 migration/1 13 root 20 0 0 0 0 S 0,0 0,0 0:14.41 ksoftirqd/1 15 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/1:+
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
slides pdf de Hugo Ruscitti a .org
Automatizando tareas: sleep
, jobs
, crontab
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:
# ps fax | grep -C3 firefox 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:
# jobs [1]+ Detenido top
Para recuperar la ejecución de top podemos escribir fg que significa foreground o sea, pasar a primer 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:
# find / >/tmp/archivos.log &
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:
# wc -l /tmp/archivos.log
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 wget-log y nos permite seguir trabajando.
# wget -b http://releases.ubuntu.com/precise/ubuntu-12.04.1-desktop-i386.iso 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%:
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 sleep, luego se ingresa el tiempo usando s para segundos, m para minutos y h para horas:
# sleep 5m; reboot
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:
# Usar numeral para escribir comentarios # +---------------- minutos (0 - 59) # | +------------- horas (0 - 23) # | | +---------- día del mes (1 - 31) # | | | +------- mes (1 - 12) # | | | | +---- día de la semana (0 - 7) (Domingo=0 or 7) # | | | | | # * * * * * comando a ejecutar */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:
# crontab -e
Para listar, ejecutar:
# crontab -l
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:
# sudo apt-get install xautomation
Una vez instalado, es posible mover el mouse y hacer click en un lugar determinado de la pantalla de la siguiente manera:
# xte 'mousemove 100 300'; xte 'mouseclick 1'
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:
# sudo apt-get install scrot
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!:
# for i in {1..186};do scrot; xte 'mousemove 100 300'; xte 'mouseclick 1'; sleep 3s;done
Listo, en una sóla línea es posible definirlo, basta con presionar ENTER y vamos a obtener 186 imágenes distintas.
Veamos que hace cada línea, paso a paso:
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!
Análisis de tráfico de red con tcpdump
y wireshark
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
:
sudo apt-get install tcpdump
Su uso es muy simple, solo basta indicar la interfaz de red:
sudo tcpdump -i eth2
El resultado es similar al siguiente:
10:09:54.261674 IP malbec.ssh > osiale.gcoop.com.ar.49322: Flags [P.], seq 2750542384:2750543808, ack 4116367059, win 1331, options [nop,nop,TS val 20388916 ecr 20607900], length 1424 10:09:54.261748 IP osiale.gcoop.com.ar.49322 > malbec.ssh: Flags [.], ack 1424, win 1321, options [nop,nop,TS val 20607950 ecr 20388916], length 0 10:09:54.263027 IP osiale.gcoop.com.ar.46685 > malbec.domain: 7023+ PTR? 18.1.168.192.in-addr.arpa. (45) 10:09:54.263195 IP malbec.domain > osiale.gcoop.com.ar.46685: 7023* 1/0/0 PTR osiale.gcoop.com.ar. (78) 10:09:54.540654 IP malbec.ssh > osiale.gcoop.com.ar.49322: Flags [P.], seq 1424:2512, ack 1, win 1331, options [nop,nop,TS val 20388986 ecr 20607950], length 1088 10:09:54.540690 IP osiale.gcoop.com.ar.49322 > malbec.ssh: Flags [.], ack 2512, win 1321, options [nop,nop,TS val 20608019 ecr 20388986], length 0 10:09:54.606095 IP osiale.gcoop.com.ar.48150 > malbec.domain: 29621+ A? daisy.ubuntu.com. (34) 10:09:54.606229 IP malbec.domain > osiale.gcoop.com.ar.48150: 29621 2/0/0 A 91.189.95.55, A 91.189.95.54 (66) 10:09:54.785237 IP malbec.ssh > osiale.gcoop.com.ar.49322: Flags [.], seq 2512:3960, ack 1, win 1331, options [nop,nop,TS val 20389047 ecr 20608019], length 1448 10:09:54.785281 IP osiale.gcoop.com.ar.49322 > malbec.ssh: Flags [.], ack 3960, win 1321, options [nop,nop,TS val 20608081 ecr 20389047], length 0
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
:
ifconfig
Veríamos un listado similar al siguiente:
eth0 Link encap:Ethernet direcciónHW 00:15:d2:19:5b:7d ACTIVO DIFUSIÓN MULTICAST MTU:1500 Métrica:1 Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0 Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0 colisiones:0 long.colaTX:1000 Bytes RX:0 (0.0 B) TX bytes:0 (0.0 B) Interrupción:19 Dirección base: 0xa000 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
:
sudo tcpdump -i eth2 -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
:
10:09:54.261674 IP 192.168.1.1.22 > 192.168.1.18.49322: Flags [P.], seq 2750542384:2750543808, ack 4116367059, win 1331, options [nop,nop,TS val 20388916 ecr 20607900], length 1424 10:09:54.261748 IP 192.168.1.18.49322 > 192.168.1.1.22: Flags [.], ack 1424, win 1321, options [nop,nop,TS val 20607950 ecr 20388916], length 0 10:09:54.263027 IP 192.168.1.18.46685 > 192.168.1.1.53: 7023+ PTR? 18.1.168.192.in-addr.arpa. (45) 10:09:54.263195 IP 192.168.1.1.53 > 192.168.1.18.46685: 7023* 1/0/0 PTR 192.168.1.18. (78) 10:09:54.540654 IP 192.168.1.1.22 > 192.168.1.18.49322: Flags [P.], seq 1424:2512, ack 1, win 1331, options [nop,nop,TS val 20388986 ecr 20607950], length 1088 10:09:54.540690 IP 192.168.1.18.49322 > 192.168.1.1.22: Flags [.], ack 2512, win 1321, options [nop,nop,TS val 20608019 ecr 20388986], length 0 10:09:54.606095 IP 192.168.1.18.48150 > 192.168.1.1.53: 29621+ A? daisy.ubuntu.com. (34) 10:09:54.606229 IP 192.168.1.1.53 > 192.168.1.18.48150: 29621 2/0/0 A 91.189.95.55, A 91.189.95.54 (66) 10:09:54.785237 IP 192.168.1.1.22 > 192.168.1.18.49322: Flags [.], seq 2512:3960, ack 1, win 1331, options [nop,nop,TS val 20389047 ecr 20608019], length 1448 10:09:54.785281 IP 192.168.1.18.49322 > 192.168.1.1.22: Flags [.], ack 3960, win 1321, options [nop,nop,TS val 20608081 ecr 20389047], length 0
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:
tcpdump -i eth2 -n -A -c 1 dst port 80
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
.
10:49:31.622425 IP 192.168.1.18.57935 > 67.208.113.123.80: Flags [P.], seq 3592177738:3592178048, ack 4115460638, win 457, options [nop,nop,TS val 21202290 ecr 455625744], length 310 E..j..@.@..... .C.q{.O.P..HJ.L............ .C.r.(L.GET / HTTP/1.1 Host: osiux.com User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive
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:
sudo apt-get install 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
tcpdump -i eth2 -n -A -c5 port 5298
El resultado de capturar 5 paquetes es:
11:15:55.330043 IP6 fe80::215:84ff:fe2b:6b8e.51378 > fe80::3e07:54ff:fe55:62d4.5298: Flags [P.], seq 31812643:31812912, ack 3913411495, win 551, options [nop,nop,TS val 21598217 ecr 29125604], length 269 `....-.@.............<Z.........>.T..Ub.......l#.A.....'.U..... .I. ..k.<message to='Leito@zapata' from='osiris@osiale' type='chat'><body>bien, escribiendo el curso de ayer</body><html xmlns='http://www.w3.org/1999/xhtml'><body><font>bien, escribiendo el curso de ayer</font></body></html><x xmlns='jabber:x:event'><composing/></x></message> 11:15:55.330428 IP6 fe80::3e07:54ff:fe55:62d4.5298 > fe80::215:84ff:fe2b:6b8e.51378: Flags [.], ack 269, win 274, options [nop,nop,TS val 29130803 ecr 21598217], length 0 `.... .@........>.T..Ub..............<Z......A....m0....n...... ...3.I. 11:16:05.557354 IP6 fe80::215:84ff:fe2b:6b8e.51378 > fe80::3e07:54ff:fe55:62d4.5298: Flags [P.], seq 269:554, ack 1, win 551, options [nop,nop,TS val 21600774 ecr 29130803], length 285 `....=...............<Z.........>.T..Ub.......m0.A.....'.e..... .I.....3<message to='Leito@zapata' from='osiris@osiale' type='chat'><body>y necesito capturar el tr..fico de Bonjour</body><html xmlns='http://www.w3.org/1999/xhtml'><body><font>y necesito capturar el tr..fico de Bonjour</font></body></html><x xmlns='jabber:x:event'><composing/></x></message> 11:16:05.557715 IP6 fe80::3e07:54ff:fe55:62d4.5298 > fe80::215:84ff:fe2b:6b8e.51378: Flags [.], ack 554, win 291, options [nop,nop,TS val 29133360 ecr 21600774], length 0 `.... ..........>.T..Ub..............<Z......A....nM...#Y...... ...0.I.. 11:16:07.356720 IP6 fe80::215:84ff:fe2b:6b8e.51378 > fe80::3e07:54ff:fe55:62d4.5298: Flags [P.], seq 554:761, ack 1, win 551, options [nop,nop,TS val 21601223 ecr 29133360], length 207 `....................<Z.........>.T..Ub.......nM.A.....'....... .I.....0<message to='Leito@zapata' from='osiris@osiale' type='chat'><body>:-P</body><html xmlns='http://www.w3.org/1999/xhtml'><body><font>:-P</font></body></html><x xmlns='jabber:x:event'><composing/></x></message>
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>
.
<message to='Leito@zapata' from='osiris@osiale' type='chat'> <body>bien, escribiendo el curso de ayer</body> <html xmlns='http://www.w3.org/1999/xhtml'> <body> <font>bien, escribiendo el curso de ayer</font> </body> </html> <x xmlns='jabber:x:event'><composing/></x> </message>
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
podemos acceder a
https://encrypted.google.com/
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.org/https-everywhere-node
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:
ssh -fN -D 9090 osiris@osiux.com
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.
sudo tcpdump -i eth2 -n -s 0 -w porlasdudas.pcap
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:
apt-get install wireshark
Podemos indicar a WireShark que inicie leyendo el archivo:
wireshark -r porlasdudas.pcap
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:
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.
Introducción a las redes TCP/IP
centralizada
descentralizada
en malla o mesh
Asignación de IPs por medio de DHCP
- DHCP server
- DHCP client
Red de 4 equipos
B
dice, necesito una IP!
- mensaje:
DHCPDISCOVER
- protocolo: UDP
- puerto destino: 67
- dirección física: 01:12:23:34:45:bb
D
dice, yo te puedo dar IP!
- mensaje:
DHCPOFFER
- dirección física: 01:12:23:34:45:dd
- dirección IP: 192.168.10.102
- gateway: 192.168.10.1
- dns primario: 8.8.8.8
- dns secundario: 8.8.4.4
B
dice, confirmo recepción!
- mensaje:
DHCPREQUEST
D
dice, confirmo confirmación!
- mensaje:
DHCPACK
Resolución de nombres de dominios DNS
host localhost
localhost.gcoop.com.ar has address 127.0.0.1
dig osiux.com
; <<>> DiG 9.9.5-9-Debian <<>> osiux.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23648 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4000 ;; QUESTION SECTION: ;osiux.com. IN A ;; ANSWER SECTION: osiux.com. 3600 IN A 198.23.230.106 ;; Query time: 485 msec ;; SERVER: 192.168.10.3#53(192.168.10.3) ;; WHEN: Sun Jul 12 10:55:13 ART 2015 ;; MSG SIZE rcvd: 54
viendo un paquete de query dns
tcpdump -r dns-query.pcap -nvX
analizando un paquete de query dns
tshark -r dns-query.pcap -VO dns
capturar consultas al dns
ssh root@linksys '/usr/sbin/tcpdump -i br0 -s 0 -w - dst port 53' >linksys.pcap
ranking de dns
tcpdump -r linksys.pcap -c 2000 -nnnA dst port 53 | \ egrep -o "A+\? .*\." | sed s/".$"//g | awk '{print $2}' | \ egrep -v "(osiux|fbcdn|akamai)" | sort | uniq -c | sort -nr | head
47 | www.facebook.com |
42 | dns.msftncsi.com |
41 | su.ff.avast.com |
37 | ssl.google-analytics.com |
37 | ipv6.msftncsi.com |
32 | www.habbo.es |
26 | imap.googlemail.com |
21 | dynamic.zoneedit.com |
19 | www.msftncsi.com |
18 | kiwwwi.com.ar |
Sniffers nmap, dsniff
nmap
nmap -sV --open 192.168.10.0/24 -p22 | head
Túneles y Redes Privadas Virtuales VPN
Redireccionar puertos con ssh
ssh -L 2525:localhost:25 osiux.com
Proxy Socks mediante ssh
ssh -D 9090 osiux.com
Tunel reverso con ssh
ssh -R 12345:localhost:22 osiux.com
Cómo saber la IP de un equipo?
B dice, cuál es la IP de D?
- Se que D es 00:14:d1:18:4a:dd
- Yo soy B y mi mac es 00:14:d1:18:4a:bb
- Todos reciben paquete ARP por difusión
D contesta, mi IP es 10.4.14.225
Quénes están en esta red?
sudo arp-scan --interface eth0 --localnet
pingueando
ping -c 5 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.032 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.041 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.044 ms 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.046 ms 64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.040 ms --- 127.0.0.1 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 3999ms rtt min/avg/max/mdev = 0.032/0.040/0.046/0.008 ms
capturando pings
sudo tcpdump -i lo -nnnt -c 5 icmp
viendo un ping
sudo tcpdump -i lo -nnntvvX -c 1 -e icmp
00:00:00:00:00:00 > 00:00:00:00:00:00, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84) 127.0.0.1 > 127.0.0.1: ICMP echo request, id 4177, seq 329, length 64 0x0000: 4500 0054 0000 4000 4001 3ca7 7f00 0001 E..T..@.@.<..... 0x0010: 7f00 0001 0800 a68d 1051 0149 e754 5e51 .........Q.I.T^Q 0x0020: 022f 0d00 0809 0a0b 0c0d 0e0f 1011 1213 ./.............. 0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"# 0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123 0x0050: 3435 3637 4567
traceroute
traceroute -m 100 216.81.59.173
traceroute to 216.81.59.173 (216.81.59.173), 100 hops max, 60 byte packets 1 * malbec (192.168.10.3) 0.092 ms 0.093 ms 2 1-125-16-190.fibertel.com.ar (190.16.125.1) 7.863 ms 10.106 ms 10.089 ms 3 * * * 4 * * * 5 * * * 6 165-164-89-200.fibertel.com.ar (200.89.164.165) 15.324 ms 173-165-89-200.fibertel.com.ar (200.89.165.173) 15.289 ms 181-166-89-200.fibertel.com.ar (200.89.166.181) 15.273 ms 7 130-165-89-200.fibertel.com.ar (200.89.165.130) 9.232 ms 11.037 ms 11.013 ms 8 222-165-89-200.fibertel.com.ar (200.89.165.222) 15.840 ms 15.840 ms 15.872 ms 9 xe-1-2-2.ar3.eze1.gblx.net (208.178.244.213) 50.640 ms 46.635 ms 46.663 ms 10 po3-20G.ar2.MIA2.gblx.net (67.16.139.18) 135.021 ms po2-30G.ar2.MIA2.gblx.net (67.17.106.162) 139.381 ms 139.406 ms 11 xe-0-3-0.mia10.ip4.tinet.net (213.200.84.37) 134.854 ms 135.787 ms 134.816 ms 12 xe-2-1-0.atl11.ip4.gtt.net (89.149.128.25) 160.909 ms xe-5-3-2.atl11.ip4.gtt.net (89.149.128.113) 162.004 ms 161.311 ms 13 * * * 14 * * * 15 * * * 16 * * * 17 * * * 18 * * * 19 * * * 20 * * * 21 * * * 22 * * * 23 * * * 24 * * * 25 * * * 26 * * * 27 * * * 28 * * * 29 * * * 30 * * * 31 * * * 32 * * * 33 * * * 34 * * * 35 * * * 36 * * * 37 * * * 38 * * * 39 * * * 40 * * * 41 * * * 42 * * * 43 * * * 44 * * * 45 * * * 46 * * * 47 * * * 48 * * * 49 * * * 50 * * * 51 * * * 52 * * * 53 * * * 54 * * * 55 * * * 56 * * * 57 * * * 58 * * * 59 * * * 60 * * * 61 * * * 62 * * * 63 * * * 64 * * * 65 * * * 66 * * * 67 * * * 68 * * * 69 * * * 70 * * * 71 * * * 72 * * * 73 * * * 74 * * * 75 * * * 76 * * * 77 * * * 78 * * * 79 * * * 80 * * * 81 * * * 82 * * * 83 * * * 84 * * * 85 * * * 86 * * * 87 * * * 88 * * * 89 * * * 90 * * * 91 * * * 92 * * * 93 * * * 94 * * * 95 * * * 96 * * * 97 * * * 98 * * * 99 * * * 100 * * *
traceroute -m 255 obiwan.scrye.net | awk {'print $2'}
protocolos
Qué tiene un paquete TCP/IP?
+------------------------+--------------------------+ | MAC origen fe:ca:fe:ca | MAC destino ca:fe:ca:fe | +------------------------+--------------------------+ | IP origen 192.168.1.22 | IP destino 96.8.118.129 | +---------------------------------------------------+ | Puerto origen 45678 | Puerto destino: 80 | +------------------------+--------------------------+ | Nro Secuencia 12345 | Nro ACK | +---+---+---+---+---+----+--------------------------+ | U | A | P | R | S | F | GET / HTTP/1.0 | | R | C | S | S | Y | I | | | G | K | H | T | N | N | | +---+---+---+---+---+---+---------------------------+
Ethernet header
| |1 |2 |3 | |0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Hardware type | Protocol type | +---------------+---------------+-------------------------------+ |Hw address len.|Pr address len.| Opcode | +---------------+---------------+-------------------------------+ | Source hardware address | +---------------------------------------------------------------+ | Source protocol address | +---------------------------------------------------------------+ | Destination hardware address | +---------------------------------------------------------------+ | Destination protocol address | +---------------------------------------------------------------+ | Data | +---------------------------------------------------------------+
IP header
| |1 |2 |3 | |0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL | Diff.Services | Total length | +-------+-------+---------------+-----+-------------------------+ | Identification |Flags| Fragment offset | +---------------+---------------+-----+-------------------------+ | TTL | Protocol | Header checksum | +---------------+---------------+-------------------------------+ | Source IP address | +---------------------------------------------------------------+ | Destination IP address | +---------------------------------------------------------------+ | Options and padding | +---------------------------------------------------------------+
UPD header
| |1 |2 |3 | |0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-------------------------------+-------------------------------+ | Length | Checksum | +-------------------------------+-------------------------------+ | Data | +---------------------------------------------------------------+
TCP header
| |1 |2 |3 | |0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-------------------------------+-------------------------------+ | Sequence Number | +-------------------------------+-------------------------------+ | Acknowledgment Number | +-------+-----+-----+-+-+-+-+-+-+-------------------------------+ |dOffset|rsrvd| ECN |U|A|P|R|S|F| Window | | | | |R|C|S|S|Y|I| | | | | |G|K|H|T|N|N| | +-------+-----+-----+-+-+-+-+-+-+-------------------------------+ | Checksum | Urgent Pointer | +-------------------------------+-------------------------------+ | Options and padding | +---------------------------------------------------------------+ | Data | +---------------------------------------------------------------+
ChangeLog
- simplifico y hago correcciones varias
- corrijo gráficos ascii-art
- primer borrador general
Configuración de servicios básicos
Apache
apt-get install apache2-mpm-prefork libapache2-mod-php5
Crear un VirtualHost
Primero se debe crear un archivo preferentemente con el nombre
del dominio y ubicarlo en sites-available
.
vi /etc/apache2/sites-available/sitioweb.com
El contenido debe tener al menos los siguientes parámetros:
<VirtualHost *:80> ServerName sitioweb.com ServerAlias www.sitioweb.com DocumentRoot /var/www/sitioweb <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ErrorLog /var/log/apache2/error.log LogLevel warn CustomLog /var/log/apache2/access.log combined </VirtualHost>
Luego se debe habilitar el sitio, de la siguiente manera:
a2ensite sitioweb.com
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:
/etc/init.d/apache2 start|stop|restart apache2ctl stop|start|graceful
PHP
apt-get install php5 php-pear php-mail php-doc phpmyadmin libapache2-mod-php5 php5-cli php5-mysql php5-xdebug
Configurar PHP
vi /etc/php5/apache2/php.ini memory_limit = 128M error_reporting = E_ALL upload_max_filesize = 20M
Programar PHP
vi /var/www/contacts_emails.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_FETCHMODE_ASSOC)) { printf('<tr> <td bgcolor="white">%s</td> <td bgcolor="white">%s</td> </tr>',$row['name'],$row['address']); } echo '</table>'; ?>
MySQL
CREATE DATABASE sugar CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE user sugar; GRANT ALL ON sugar.* TO 'sugar'@'%'; SET PASSWORD FOR 'sugar'@'%'=PASSWORD('sugar');
UTF8
Definir UTF8 en el cliente
mysql --default-character-set=utf8
Definir UTF8
SET NAMES utf8; SELECT * FROM contacts;
MySQL de Bash
Definir Alias
set alias sugar = 'mysql --default-character-set=utf8 -u sugar -psugar -B sugar -h localhost '
Ejecutar consulta
echo "SELECT user_name FROM users WHERE is_admin = 1;" | sugar
Listado de Tablas
set alias tablas='echo "show tables" | sugar | grep -v Tables_in | sort -u'
Listado Tabla Campo
set alias tablacampo='echo "show tables" | sugar | grep -v Tables_in | while read t; \ do d=$(echo "desc "$t";" | cct15 | grep -v Field | awk1); \ for c in $d;do echo $t"__"$c;done ;done'
Quitar nombre de campo
mysql -N
Vaciar todas las tablas que contengan la palabra calls
sugar < $(echo "show tables" | sugar | grep calls | while read t;do echo "TRUNCATE table $t;";done)
MySQL desde Vim
Agregar en .vimrc
command -range=% SUGAR :<line1>,<line2>w !mysql -u sugar -psugar -B sugar -t -v -v -v
Ejecutar todo el archivo
:SUGAR
Ejecutar la línea actual
:. SUGAR
Ejecutar un rango de líneas
:3,8 SUGAR
Ejecutar desde línea actual hasta el final
:.,$ SUGAR
Usar diccionarios
:set dictionary=tablas, tablacampo CTRL-X CTRL-K
Reemplazar Texto
Buscar duplicados
SELECT last_name, first_name, COUNT(id) AS total FROM contacts GROUP BY first_name, last_name HAVING total > 1 ORDER BY last_name, first_name;
Agrupar
SELECT name, ( SELECT CASE WHEN EXTRACT(HOUR FROM date_start) < 12 THEN 'mañana' ELSE 'tarde' END ) AS turno, COUNT(id) as total FROM calls GROUP BY name, turno HAVING total > 500 ORDER BY total DESC;
Cruzando tablas
Explicito mejor que implicito
SELECT COUNT(cc.id) AS total FROM calls_contacts cc LEFT JOIN contacts co ON co.id = cc.contact_id ; AND cc.deleted = 0 AND co.deleted = 0 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
SELECT COUNT(cc.id) AS total FROM calls_contacts cc LEFT JOIN contacts co ON co.id = cc.contact_id;
Contactos con llamadas entrantes
SELECT co.last_name, co.first_name, CONVERT_TZ(date_start, '+00:00', '-03:00') as fecha FROM contacts co INNER JOIN calls_contacts cc ON (cc.contact_id = co.id AND cc.deleted = 0) INNER JOIN calls ca ON (ca.id = cc.call_id AND ca.deleted = 0) WHERE co.deleted = 0 AND last_name IS NOT NULL LIMIT 20;
Actualizar las llamadas de un contacto
UPDATE calls ca, contacts co, calls_contacts cc SET ca.assigned_user_id = ( SELECT id FROM users WHERE user_name = 'osiris' ) WHERE ca.id = cc.call_id AND co.id = cc.contact_id AND co.id = '2a756d50-ae20-0754-a7c7-49beb64cee37'; 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_user_id = ( SELECT id FROM users WHERE user_name = 'osiris' ) WHERE co. = '2a756d50-ae20-0754-a7c7-49beb64cee37';
Insertar desde otra tabla
DROP TABLE IF EXISTS calls_contacts_today; CREATE TABLE `calls_contacts_today` ( `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_contacts_today (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
UPDATE calls set deleted = 1 WHERE status = 'Not Held'; SELECT COUNT(*) FROM calls; SELECT COUNT(id) FROM calls; SELECT COUNT(id) FROM calls WHERE deleted = 0; SELECT SQL_CALC_FOUND_ROWS id FROM calls WHERE deleted = 0 LIMIT 1; SELECT FOUND_ROWS();
EXPLAIN
EXPLAIN SELECT COUNT(id) FROM calls WHERE deleted = 0 AND assigned_user_id = 'ba8630eb-7442-73f9-a88e-49b6be5882c2';
INDEX
SHOW INDEX IN calls; ALTER TABLE calls ADD INDEX idx_deleted_user (deleted, assigned_user_id); ALTER TABLE calls DROP INDEX idx_deleted_user;
UNIQUE
ALTER TABLE calls_contacts_today ADD UNIQUE idx_contact_call (contact_id, call_id);
AUTO_INCREMENT
ALTER TABLE tracker AUTO_INCREMENT = 9; ALTER TABLE tracker MODIFY id INT(11) AUTO_INCREMENT;
REGEXP
UPDATE contacts SET postal = SUBSTR(postal,4,7) WHERE postal NOT REGEXP '^[0-9]{4}$' AND postal REGEXP '^[A-Z]{3}[0-9]{4}$'
RANDOM
SELECT RAND(); SELECT MD5(RAND()); SELECT SUBSTRING(MD5(RAND()) FROM 1 FOR 8);
Postfix
TODO
DHCP
dhcp3
- 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:dns-update-style none; option domain-name-servers 200.45.191.35,200.45.48.233; default-lease-time 6000; max-lease-time 7200; log-facility local7; subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.100 192.168.0.150; option routers 192.168.0.1; }
- Se trata de una red
/24
, es decir que los primeros tres octetos están fijos, tal como indica la máscara de red255.255.255.0
. - Se entregarán IPs dinámicamente desde la
192.168.0.100
a la192.168.0.150
, siendo192.168.0.1
la IP delgateway
.
En el mismo archivo se pueden asignar IPs fijas, ingresando la dirección física (MAC Address) y la IP elegida:
host syrah { hardware ethernet 00:AC:DC:00:CA:FE; fixed-address 192.168.0.4; }
- Se trata de una red
- iniciar y detener el servicio
/etc/init.d/dhcp start /etc/init.d/dhcp stop
Metodologías ágiles de trabajo
Time Management for System Administrators
GTD
de David Allen 1, libro que en español se ha editado con el título Organízate con eficacia 2.
GTD se basa en el principio de que una persona necesita borrar de su mente todas las tareas que tiene pendientes guardándolas en un lugar específico. De este modo, se libera a la mente del trabajo de recordar todo lo que hay que hacer, y se puede concentrar en la efectiva realización de aquellas tareas.
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
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
Scrum
TODO
Pomodoro
TODO
Autofocus
TODO
Kanban
TODO
Aplicaciones de Consola
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:
ssh tempranillo atop -r /var/log/atop/atop_20140121 -b 10:00 -e 12:00 -D | head -30
htop
iftop
iotop
ssh malbec 'sudo iotop -b -o -n 2 -d 5'
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
ioping
ioping -c 5 /mnt/data
mon
monit
munin
mtr
mtr -r -c 5 -n osiux.com
Start: Sun Jul 12 10:57:39 2015 HOST: stout Loss% Snt Last Avg Best Wrst StDev 1.|-- 192.168.10.3 0.0% 5 0.1 0.1 0.1 0.2 0.0 2.|-- 190.16.125.1 40.0% 5 8.4 291.8 8.4 703.1 364.6 3.|-- ??? 100.0 5 0.0 0.0 0.0 0.0 0.0 4.|-- ??? 100.0 5 0.0 0.0 0.0 0.0 0.0 5.|-- ??? 100.0 5 0.0 0.0 0.0 0.0 0.0 6.|-- 200.89.166.181 0.0% 5 11.8 11.6 10.2 12.9 0.9 7.|-- 200.89.165.5 0.0% 5 11.3 12.0 9.8 14.4 1.6 8.|-- 200.89.165.250 0.0% 5 13.5 12.1 10.8 13.5 1.0 9.|-- 67.17.161.13 0.0% 5 9.7 15.9 9.3 40.5 13.8 10.|-- 67.17.106.162 20.0% 5 139.1 180.7 139.1 240.4 47.1 11.|-- 213.200.84.37 20.0% 5 134.2 134.9 134.2 136.0 0.0 12.|-- 89.149.182.66 0.0% 5 158.3 159.9 156.8 167.9 4.5 13.|-- 69.31.135.94 0.0% 4 161.6 160.8 160.1 161.6 0.0 14.|-- 69.31.134.226 25.0% 4 161.3 161.0 160.1 161.5 0.7 15.|-- 198.23.229.2 75.0% 4 156.6 156.6 156.6 156.6 0.0 16.|-- 198.23.230.106 25.0% 4 168.3 162.6 159.2 168.3 4.8
sysstat
vnstat
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!
parallel-ssh -i -h ~/.ssh/gcoop uptime | tee
[1] 10:57:47 [SUCCESS] cabernet 10:57:48 up 2 days, 18:03, 0 users, load average: 0,00, 0,06, 0,12 [2] 10:57:47 [SUCCESS] torrontes 10:57:49 up 2 days, 18:03, 0 users, load average: 0.08, 0.12, 0.09 [3] 10:57:47 [SUCCESS] malbec 10:57:53 up 2 days, 18:04, 1 user, load average: 0.00, 0.00, 0.00 [4] 10:57:48 [SUCCESS] tempranillo 10:57:50 up 126 days, 23:44, 0 users, load average: 0,04, 0,09, 0,13 [5] 10:57:50 [SUCCESS] bonarda 10:57:52 up 88 days, 1:30, 0 users, load average: 0,00, 0,02, 0,05