Administrador de Sistemas GNU/Linux
index | about | archive | charlas | docs | links
dot
|
git
|
img
|
plt
|
tty
|
uml
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 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
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 : 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:
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
-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
$
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
¿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.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
- 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
ChangeLog
2023-05-20 11:43
agregar DESCRIPTION, KEYWORDS, OpenGraph e imagen en SSH para gobernar el mundo!2019-04-18 00:01
Corregir identación header #+INCLUDE:2015-07-03 04:31
@ 00:05 hs - elimino #+OPTIONS: de todos los archivos excepto header.org2014-04-22 11:35
@ 00:34 hs - Agrego timestamp:nil2013-04-24 08:04
@ 01:50 hs - migro a org 8.02012-12-15 22:31
@ 04:00 hs - convert old blog in rST to org
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 15787
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
2686 ? S 50:52 /bin/bash /usr/share/siguibui/backend/shellserver.sh --daemon 21395 ? S 0:00 \_ sleep 1 2691 ? S 2:54 /usr/bin/python /usr/share/pywwetha/pywwetha.py --daemon 2692 ? Ss 0:00 /usr/sbin/acpi_fakekeyd 2731 ? Ss 0:28 /usr/sbin/acpid 2935 ? Ss 0:30 /usr/sbin/apache2 -k start 3138 ? S 0:00 \_ /usr/sbin/apache2 -k start 3139 ? S 0:00 \_ /usr/sbin/apache2 -k start 3140 ? S 0:00 \_ /usr/sbin/apache2 -k start 3141 ? S 0:00 \_ /usr/sbin/apache2 -k start
pstree -p -U | head
init(1)─┬─NetworkManager(3472)─┬─dhclient(3639) │ ├─{NetworkManager}(3518) │ └─{NetworkManager}(3662) ├─accounts-daemon(4022)───{accounts-daemon}(4024) ├─acpi_fakekeyd(2692) ├─acpid(2731) ├─apache2(2935)─┬─apache2(3138) │ ├─apache2(3139) │ ├─apache2(3140) │ ├─apache2(3141)
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 - 18:34:37 up 11 days, 1:02, 6 users, load average: 0,76, 0,88, 0,86 Tasks: 180 total, 1 running, 179 sleeping, 0 stopped, 0 zombie %Cpu(s): 13,9 us, 4,8 sy, 0,0 ni, 80,1 id, 0,6 wa, 0,5 hi, 0,2 si, 0,0 st KiB Mem: 2044852 total, 1709304 used, 335548 free, 89148 buffers KiB Swap: 0 total, 0 used, 0 free, 600420 cached 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
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
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:
# 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
Topología, redes y Subredes
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.8.4-P1 <<>> osiux.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12788 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;osiux.com. IN A ;; ANSWER SECTION: osiux.com. 300 IN A 96.8.118.129 ;; Query time: 198 msec ;; SERVER: 192.168.10.3#53(192.168.10.3) ;; WHEN: Tue Apr 9 23:29:33 2013 ;; MSG SIZE rcvd: 43
viendo un paquete de query dns
tcpdump -r dns-query.pcap -nvX
02:14:20.301428 IP (tos 0x0, ttl 64, id 27874, offset 0, flags [none], proto UDP (17), length 55) 127.0.0.1.57039 > 127.0.0.1.53: 39172+ A? osiux.com. (27) 0x0000: 4500 0037 6ce2 0000 4011 0fd2 7f00 0001 E..7l...@....... 0x0010: 7f00 0001 decf 0035 0023 fe36 9904 0100 .......5.#.6.... 0x0020: 0001 0000 0000 0000 056f 7369 7578 0363 .........osiux.c 0x0030: 6f6d 0000 0100 01 om.....
analizando un paquete de query dns
tshark -r dns-query.pcap -VO dns
Frame 1: 71 bytes on wire (568 bits), 71 bytes captured (568 bits) Linux cooked capture Internet Protocol Version 4, Src: 127.0.0.1 (127.0.0.1), Dst: 127.0.0.1 (127.0.0.1) User Datagram Protocol, Src Port: 57039 (57039), Dst Port: domain (53) Domain Name System (query) Transaction ID: 0x9904 Flags: 0x0100 Standard query 0... .... .... .... = Response: Message is a query .000 0... .... .... = Opcode: Standard query (0) .... ..0. .... .... = Truncated: Message is not truncated .... ...1 .... .... = Recursion desired: Do query recursively .... .... .0.. .... = Z: reserved (0) .... .... ...0 .... = Non-authenticated data: Unacceptable Questions: 1 Answer RRs: 0 Authority RRs: 0 Additional RRs: 0 Queries osiux.com: type A, class IN Name: osiux.com Type: A (Host address) Class: IN (0x0001)
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
0 packets received by filter, 0 packets dropped by kernel Ending arp-scan 1.8.1: 256 hosts scanned in 1.625 seconds (157.54 hosts/sec). 0 responded
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_req=1 ttl=64 time=0.066 ms 64 bytes from 127.0.0.1: icmp_req=2 ttl=64 time=0.050 ms 64 bytes from 127.0.0.1: icmp_req=3 ttl=64 time=0.050 ms 64 bytes from 127.0.0.1: icmp_req=4 ttl=64 time=0.048 ms 64 bytes from 127.0.0.1: icmp_req=5 ttl=64 time=0.049 ms --- 127.0.0.1 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 3999ms rtt min/avg/max/mdev = 0.048/0.052/0.066/0.010 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.107 ms 0.087 ms 0.083 ms 2 10.29.64.1 (10.29.64.1) 9.180 ms 9.206 ms 9.190 ms 3 cpe-181-47-254-17.telecentro-reversos.com.ar (181.47.254.17) 9.645 ms 9.653 ms 9.706 ms 4 telecentro.baires1.bai.seabone.net (195.22.220.33) 10.882 ms 10.307 ms 10.762 ms 5 bundle-ether1.baires1.bai.seabone.net (195.22.220.32) 15.964 ms 16.074 ms 15.974 ms 6 * * * 7 xe-1-2-0.mia10.ip4.tinet.net (77.67.71.97) 142.397 ms 139.703 ms 142.354 ms 8 xe-2-1-0.atl11.ip4.tinet.net (89.149.184.21) 156.811 ms xe-3-0-0.atl11.ip4.tinet.net (89.149.180.202) 158.695 ms 158.561 ms 9 epik-networks-gw.ip4.tinet.net (77.67.69.158) 159.786 ms 159.491 ms 159.581 ms 10 po0-3.dsr2.atl.epikip.net (216.81.59.2) 176.330 ms 176.462 ms 176.281 ms 11 * * * 12 Episode.IV (206.214.251.1) 224.463 ms 226.258 ms 220.950 ms 13 A.NEW.HOPE (206.214.251.6) 250.974 ms 247.808 ms 259.092 ms 14 It.is.a.period.of.civil.war (206.214.251.9) 259.944 ms 250.907 ms 255.839 ms 15 Rebel.spaceships (206.214.251.14) 218.522 ms 226.211 ms 219.834 ms 16 striking.from.a.hidden.base (206.214.251.17) 241.201 ms 236.375 ms 232.261 ms 17 have.won.their.first.victory (206.214.251.22) 241.703 ms 236.591 ms 224.864 ms 18 against.the.evil.Galactic.Empire (206.214.251.25) 216.832 ms 216.318 ms 214.477 ms 19 During.the.battle (206.214.251.30) 208.949 ms 210.051 ms 208.008 ms 20 Rebel.spies.managed (206.214.251.33) 212.787 ms 212.294 ms 212.273 ms 21 to.steal.secret.plans (206.214.251.38) 255.908 ms 258.825 ms 257.972 ms 22 to.the.Empires.ultimate.weapon (206.214.251.41) 213.769 ms 213.009 ms 216.689 ms 23 the.DEATH.STAR (206.214.251.46) 218.461 ms 218.095 ms 219.359 ms 24 an.armored.space.station (206.214.251.49) 209.458 ms 211.553 ms 213.325 ms 25 with.enough.power.to (206.214.251.54) 216.680 ms 215.119 ms 215.551 ms 26 destroy.an.entire.planet (206.214.251.57) 229.043 ms 225.637 ms 225.987 ms 27 Pursued.by.the.Empires (206.214.251.62) 217.677 ms 217.609 ms 221.162 ms 28 sinister.agents (206.214.251.65) 212.421 ms 218.351 ms 217.477 ms 29 Princess.Leia.races.home (206.214.251.70) 217.438 ms 215.519 ms 215.707 ms 30 aboard.her.starship (206.214.251.73) 208.869 ms 211.286 ms 209.410 ms 31 custodian.of.the.stolen.plans (206.214.251.78) 254.545 ms 257.170 ms 257.258 ms 32 that.can.save.her (206.214.251.81) 230.703 ms 226.975 ms 224.884 ms 33 people.and.restore (206.214.251.86) 213.461 ms 212.716 ms 210.437 ms 34 freedom.to.the.galaxy (206.214.251.89) 240.426 ms 238.993 ms 238.415 ms 35 0-----I-------I-----0 (206.214.251.94) 225.745 ms 228.150 ms 227.564 ms 36 0------------------0 (206.214.251.97) 239.726 ms 242.001 ms 241.268 ms 37 0-----------------0 (206.214.251.102) 216.268 ms 217.171 ms 219.559 ms 38 0----------------0 (206.214.251.105) 213.450 ms 212.874 ms 210.651 ms 39 0---------------0 (206.214.251.110) 211.686 ms 212.642 ms 213.635 ms 40 0--------------0 (206.214.251.113) 243.655 ms 241.858 ms 238.552 ms 41 0-------------0 (206.214.251.118) 218.823 ms 217.698 ms 217.625 ms 42 0------------0 (206.214.251.121) 221.651 ms 217.936 ms 217.573 ms 43 0-----------0 (206.214.251.126) 254.899 ms 255.905 ms 253.906 ms 44 0----------0 (206.214.251.129) 219.658 ms 214.849 ms 218.945 ms 45 0---------0 (206.214.251.134) 254.542 ms 255.310 ms 258.304 ms 46 0--------0 (206.214.251.137) 221.805 ms 218.502 ms 216.293 ms 47 0-------0 (206.214.251.142) 218.543 ms 219.614 ms 218.705 ms 48 0------0 (206.214.251.145) 213.497 ms 216.123 ms 215.188 ms 49 0-----0 (206.214.251.150) 250.876 ms 250.727 ms 253.698 ms 50 0----0 (206.214.251.153) 217.614 ms 218.582 ms 219.936 ms 51 0---0 (206.214.251.158) 216.849 ms 214.232 ms 212.980 ms 52 0--0 (206.214.251.161) 217.178 ms 216.413 ms 215.734 ms 53 0-0 (206.214.251.166) 228.141 ms 231.885 ms 226.433 ms 54 00 (206.214.251.169) 255.405 ms 258.888 ms 258.736 ms 55 I (206.214.251.174) 239.065 ms 241.727 ms 241.572 ms 56 By.Ryan.Werber (206.214.251.177) 228.102 ms 226.607 ms 228.030 ms 57 Blizzards.Breed.CCIE.Creativity (206.214.251.182) 239.656 ms 238.884 ms 239.301 ms 58 Please.Try.Again.Tracerote.to.obiwan.scrye.net (206.214.251.185) 215.164 ms 215.725 ms 216.688 ms 59 read.more.at.beaglenetworks.net (206.214.251.190) 228.818 ms * *
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
Instalar 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
Instalar 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
Crear Base y Usuario
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');
Otorgar privilegios a un usuario@host a una base
GRANT ALL PRIVILEGES ON mydb.* TO myuser@localhost IDENTIFIED BY 'mypasswd';
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
Es un método de gestión de las actividades y el título de un libro
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 cortoPROYECTO
, cosas a realizar dentro de un proyectoEN ESPERA
, depende de otra personaALGÚ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 1552 be/4 root 0.00 B/s 815.89 B/s 0.00 % 0.00 % syslogd
ioping
ioping -c 5 /mnt/data
mon
monit
munin
mtr
mtr -r -c 5 -n osiux.com
HOST: amaretto Loss% Snt Last Avg Best Wrst StDev 1.|-- 192.168.10.3 0.0% 5 0.2 0.2 0.2 0.2 0.0 2.|-- 10.29.64.1 0.0% 5 7.3 7.3 6.9 8.0 0.4 3.|-- 181.47.254.17 0.0% 5 8.4 8.4 7.1 9.8 1.0 4.|-- 208.178.195.210 0.0% 5 9.4 10.1 8.8 11.9 1.4 5.|-- 208.178.195.209 0.0% 5 7.5 7.8 7.0 9.1 0.9 6.|-- 67.16.142.93 0.0% 5 171.9 175.3 170.2 192.6 9.7 7.|-- 204.93.144.25 0.0% 5 171.4 178.4 171.4 201.7 13.1 8.|-- 204.93.204.153 40.0% 5 173.3 174.2 173.3 174.6 0.8 9.|-- 50.31.170.122 0.0% 5 180.6 180.9 179.6 183.6 1.6 10.|-- 206.217.137.250 0.0% 5 181.1 182.3 179.5 188.5 3.6 11.|-- 96.8.118.251 20.0% 5 178.4 178.0 176.9 178.7 0.8 12.|-- 96.8.118.129 20.0% 5 181.5 182.2 181.5 183.0 0.6
sysstat
vnstat
- top 10
ssh osiux 'vnstat -i venet0 -t'
venet0 / top 10 # day rx | tx | total | avg. rate -----------------------------+-------------+-------------+--------------- 1 03/19/13 4.09 GiB | 64.21 GiB | 68.30 GiB | 6.63 Mbit/s 2 03/20/13 930.99 MiB | 23.57 GiB | 24.48 GiB | 2.38 Mbit/s 3 11/09/13 3.58 GiB | 18.64 GiB | 22.23 GiB | 2.16 Mbit/s 4 03/26/13 1.02 GiB | 18.19 GiB | 19.22 GiB | 1.87 Mbit/s 5 03/25/13 735.60 MiB | 16.55 GiB | 17.27 GiB | 1.68 Mbit/s 6 03/27/13 695.73 MiB | 13.61 GiB | 14.29 GiB | 1.39 Mbit/s 7 03/21/13 700.46 MiB | 13.58 GiB | 14.26 GiB | 1.38 Mbit/s 8 04/09/13 648.98 MiB | 13.32 GiB | 13.95 GiB | 1.35 Mbit/s 9 01/07/14 13.21 GiB | 356.93 MiB | 13.56 GiB | 1.32 Mbit/s 10 07/03/13 830.55 MiB | 12.69 GiB | 13.50 GiB | 1.31 Mbit/s -----------------------------+-------------+-------------+---------------
- vista mensual
ssh osiux 'vnstat -i venet0 -m'
venet0 / monthly month rx | tx | total | avg. rate ------------------------+-------------+-------------+--------------- Mar '13 16.50 GiB | 190.62 GiB | 207.12 GiB | 648.70 kbit/s Apr '13 20.32 GiB | 125.04 GiB | 145.36 GiB | 470.42 kbit/s May '13 15.09 GiB | 6.23 GiB | 21.33 GiB | 66.79 kbit/s Jun '13 15.15 GiB | 10.28 GiB | 25.43 GiB | 82.29 kbit/s Jul '13 19.02 GiB | 19.53 GiB | 38.55 GiB | 120.75 kbit/s Aug '13 24.59 GiB | 21.24 GiB | 45.83 GiB | 143.53 kbit/s Sep '13 15.25 GiB | 8.18 GiB | 23.43 GiB | 75.84 kbit/s Oct '13 26.23 GiB | 25.19 GiB | 51.42 GiB | 161.03 kbit/s Nov '13 10.20 GiB | 30.08 GiB | 40.28 GiB | 130.36 kbit/s Dec '13 1.67 GiB | 9.41 GiB | 11.08 GiB | 34.69 kbit/s Jan '14 25.88 GiB | 7.73 GiB | 33.61 GiB | 105.25 kbit/s Feb '14 4.46 GiB | 2.76 GiB | 7.22 GiB | 70.61 kbit/s ------------------------+-------------+-------------+--------------- estimated 12.57 GiB | 7.79 GiB | 20.36 GiB |
- vista semanal
ssh osiux 'vnstat -i venet0 -w'
venet0 / weekly rx | tx | total | avg. rate ---------------------------+-------------+-------------+--------------- last 7 days 3.16 GiB | 2.30 GiB | 5.46 GiB | 76.48 kbit/s last week 3.19 GiB | 2.19 GiB | 5.39 GiB | 74.70 kbit/s current week 418.63 MiB | 265.81 MiB | 684.44 MiB | 70.05 kbit/s ---------------------------+-------------+-------------+--------------- estimated 3.12 GiB | 1.98 GiB | 5.09 GiB |
- vista por horas
ssh osiux 'vnstat -i venet0 -h'
venet0 22:14 ^ r | r | r r r r r r r r r r r | r r r r rt r r r r r r | r r r r rt r r r r r t r | r r r r rt r r r r rt t t r | rt r r r rt r rt r r rt t t t r | rt r r r rt r rt rt r rt t t t t r | rt rt rt r rt r rt rt r rt t t t t t t r | rt rt rt r rt r rt rt r rt t t t t t t t rt t t t r -+---------------------------------------------------------------------------> | 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!
parallel-ssh -i -h ~/.ssh/gcoop uptime | tee
[1] 13:14:09 [SUCCESS] redmine 13:13:37 up 6 days, 12:08, 0 users, load average: 0.00, 0.02, 0.00 [2] 13:14:09 [SUCCESS] mysqlcentos 13:13:37 up 6 days, 12:38, 0 users, load average: 0.00, 0.00, 0.00 [3] 13:14:09 [SUCCESS] torrontes 13:13:37 up 37 days, 22:39, 0 users, load average: 0.20, 0.21, 0.22 [4] 13:14:09 [SUCCESS] ssug0003lx 13:13:37 up 6 days, 12:11, 0 users, load average: 0.00, 0.00, 0.00 [5] 13:14:09 [SUCCESS] squeeze 13:13:37 up 6 days, 12:16, 0 users, load average: 0.00, 0.00, 0.00 [6] 13:14:09 [SUCCESS] symfony 13:13:37 up 6 days, 12:25, 0 users, load average: 0.00, 0.00, 0.00 [7] 13:14:09 [SUCCESS] tempranillo 13:13:37 up 67 days, 17:51, 0 users, load average: 0,07, 0,09, 0,06 [8] 13:14:09 [SUCCESS] malbec 13:13:50 up 37 days, 22:45, 0 users, load average: 0.01, 0.58, 0.57 [9] 13:14:09 [SUCCESS] merlot 13:13:59 up 97 days, 4:57, 0 users, load average: 0.28, 0.12, 0.05 [10] 13:14:12 [FAILURE] recibos Exited with error code 255 Stderr: ssh_exchange_identification: Connection closed by remote host