A Django site.
February 2, 2010

Rodolfo Pilas
pilas
Rodolfo Pilas
» Automatizando SSH

Algnas veces me ha tocado escriir líneas de ssh bastante complejas, como por ejemplo:

ssh -1 -p 23 -l root -i /etc/ssh/key01 -o CheckHostIP=no 192.134.27.24

que realmente terminan siendo un incordio, cuando esa conexión debe ser vuelta a realizar para repetir tareas de administración remota. Entonces, este artículo es un resúmen de algunos trucos de automatización que he logrado aprender hasta ahora, para hacer mi ssh más fácil y mi vida también.

1. el nombre

Escribir la IP 192.134.27.24 cada vez que me conecto es antidiluviano y no escala a IPv6. Así que lo ideal es disponer de un DNS bien configurado al cuál recurrir.

Lamentablemente en redes internas he visto que asignan nombres a las máquinas que resultan más difíciles que la dirección IPv4 misma, por ejemplo: sssd2p1r3db.sss.com, que significa sss es el nombre de la empresa, datacenter 2, piso 1, rack 3, db pues es el server de base de datos. Fantástico! Cómo no recordarlo? Claro, despues uno ve que terminan usando la IP.

Así que llamemos a nuestro servidor 192.134.27.24 sssd2p1r3db como “tito” (o cualquier otro nombre que me resulte fácil de recordar)

Para que funcione el ssh a tito debo llegar a la IP. Y esta tarea de personalización de los nombres en la red la hace el archivo /etc/hosts. Edito el archivo y agrego:

# Servidor sssd2p3r3db
192.134.27.24 tito

A partir de ahora, todo lo que yo haga a nivel de red con el nombre “tito” va a funcionar desde ssh tito, ping tito, hasta http://tito en el Firefox.

2. las opciones ssh

Las opciones del ssh que son necesarias para esta conexión de ejemplo son: -1 -p 23 -l root -i /etc/ssh/key01 -o CheckHostIP=no, que no es necesario explicar su significado, pues todas estas opciones están a un man de distancia.

El archivo que permite automatizar todo esto para todos los usuarios es /etc/ssh/ssh_config y para un usuario en específico es el archivo $HOME/.ssh/config. Edito el archivo y creo una entrada Host acorde a mis necesidades:

Host tito
Protocol 1
Port 23
User root
IdentityFile /etc/ssh/key01
CheckHostIP no

Y ya está!

Ahora puedo escribir ssh tito y mi conexión va a ser realizada exactamente como si escribiera toda la linea del principio.

Solo una aclaración: la sentencia Host funciona por string, es decir que si escribo ssh 192.134.27.24 no va a producir el mismo efecto de levantar los datos del ssh_config, aunque me esté conectando al mismo servidor.

3. Bash completion

Y por último, hacer que mi Bash permita usar tabulador para los nombres caprichozos y fáciles que he colocado a mis servidores… porque?, a ver: nadie pretende que me acuerde que el server se llama “tito”, es mucho más acordarme que empieza con “t” y sigue con “algo” ;)

Edito ~/.bashrc y agrego:

_completossh ()
{
actual=${COMP_WORDS[COMP_CWORD]};
COMPREPLY=($(compgen -W ‘$(cat /etc/ssh/config | grep “^Host\b” – | sed -e “s/Host //”)’ — $actual))
}
complete -F _completossh ssh

Y ahora puedo escribir ssh t + tabulador, y me completará “tito”. Y si tengo más de un servidor que comience con “t” pues dar dos veces tabulador y me muestra la lista.

4. Algunos documentos para leer del tema

May 4, 2009

Rodolfo Pilas
pilas
Rodolfo Pilas
» Twitteando desde la consola

Hace rato que no actualizo mi Twitter, pero hoy de casualidad me topé con la forma de poder publicar en Twitter desde la consola de Linux (y también de las XO, obviamente), así que cree este simple script:

?Descargar tw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 #!/bin/bash
# Script que permite publicar un mensaje en Twitter desde la consola Linux
USUARIO=nombre-usuario-twitter    #CAMBIAR!!!
echo "Ingrese mensaje para Twitter (enter para terminar)"
read MSG
LARGO=$(echo $MSG | wc -c)
echo "Largo del mensaje $LARGO caracteres"
echo -n "Ingrese clave en Twitter: "
read -s PW
echo; echo "... publicando mensaje ..."
wget --keep-session-cookies --http-user=$USUARIO --http-password=$PW \
    --post-data="status=$MSG" -O - --no-verbose \
    http://twitter.com:80/statuses/update.xml > /dev/null
if [ $? -eq 0 ]; then
        echo "Mensaje publicado."
else
        echo "ERROR al publicar el mensaje."
fi
exit 0

que permite publicar fácilmente micro-artículos.

November 27, 2008

Rodolfo Pilas
pilas
Rodolfo Pilas
» Correo POP3+SSL por telnet

Siguiendo con el reciente artículo sobre Correo POP3 por telnet, debo tener en cuenta que mis servidores suelen tener el correo con SSL, para lograr la capa de validación y cifrado para la trasmisión de los datos, por este motivo, el telnet no sirve para hacer conexiones.

Entonces cuando el servidor POP3 tiene SSL (sPOP3) la solución es usar openssl, asi:

$ openssl s_client -connect servidor.correo.com:995
CONNECTED(00000005)
-> Aqui se muestra la validación y
-> el contenido del certificado digital
-> … en varios renglones
->
+OK POP3 Ready

A partir de aquí, funcionan perfectamente todos los comandos de POP3, indicados en el artículo anterior, exactamente como si estuvieramos por telnet normal.

November 4, 2008

Rodolfo Pilas
pilas
Rodolfo Pilas
» Correo POP3 por telnet

Esto no es nada nuevo ni “rocket science“, solo es un apunte personal, ya que esto lo requiero de vez en cuando y al final termino buscando entre documentos y documentos hasta que veo lo que quiero.

Es simplemente cómo hacer telnet al servidor de correo (POP3) y ver los mensajes.

Iniciar sesión en el servidor

$ telnet servidor.correo.com 110

Cuando conecte con el servidor, aparece como lo siguiente:

+OK POP3 Ready

El protocolo POP3 es muy sencillo. Cuando hacemos algo bien el servidor nos contesta con “+OK” y cuando lo hacemos mal nos devuelve un “-ERR”. En ambos casos se añadirá un texto descriptivo.

Ahora el servidor espera nuestra validación:

USER usuario@correo.com

El servidor le responderá con el mensaje de OK:

+OK USER

Significa que ha aceptado el nombre de usuario y que esta esperando por su contraseña. Escriba:

PASS contraseña

empleando la contraseña de su buzón de correo. Si todo ha ido bien el servidor nos responde con lo siguiente

+OK Logged in.

Comandos al servidor

Una vez conectados disponemos de varios comandos que podemos utilizar:

STAT (status) solicita el estado de tu buzón de correos. El servidor responderá informando de cuantos mensajes hay a la espera, en el siguiente formato: +OK mm bb, donde mm es el numero de mensajes, y bb el numero de bytes del total.

LIST te lista todos los mensajes. El primer número es el identificador del mensaje (que se requiere para otros comandos y el segundo número es el tamaño.

LIST
+OK 2 messages (320 octets)
1 120
2 200
.

LIST 2
+OK 2 200

LIST 3
-ERR no such message, only 2 messages in maildrop

TOP nn nl para ver las cabeceras y primeras lineas del mensaje (nn sería el numero del mensaje que quieras ver, nl el numero de lineas de la cabecera, p ej: TOP 1 ALL)

RETR # para ver un mensaje, debe especificarse su numero identificados del mensaje.

+OK XXXX octets follow.
Cabecera del mensaje
Cuerpo del mensaje
.

Donde XXXX es el tamaño del mensaje en bytes. Seguido de esta linea se mostrará la cabecera del mensaje y el cuerpo del mismo. Si el mensaje está codificado en HTML o tiene datos adjuntos es más que probable que entienda poco del mismo.

DELE # borra el mensaje elegido. El borrado no es al enviar el comando, sino al terminar la sesión (se debe desconectar con QUIT o los mensajes no serán borrados)

RSET recupera los mensajes marcados para borrado

NOOP (No Operation) instruye al servidor para que no ejecute ninguna acción, salvo responder con un mensaje de confirmación (+OK).

UIDL (Unique Identifier List) sirve para asignar un identificador unico a todos los mensajes o a uno especifico.

APOP (Authenticate Post Office Protocol) Este comando puede ser usado como sustituto del binomio USER - PASS para identificar y validar un usuario. Su utilidad es evitar que el password del usuario viaje por la red de forma no encriptada. La sintaxis es: APOP (nombre) (codigo).

Desconectar y cerrar sesión

Para desconectar correctamente del servidor escriba:

QUIT

El servidor nos responde con:

+OK Logging out.

Y se cierra el telnet: Connection closed by foreign host.

Fuentes:

December 16, 2007

Rodolfo Pilas
pilas
Rodolfo Pilas
» Colores para el prompt

Hace tiempo que mi CLI tiene colores y la mayoría de las configuraciones están descriptas en Colores para el CLI, pero el otro día estaba configurando mi consola bash en MacOS X y me puse a buscar sobre una guía de colores y encontré esta buena idea:

# ANSI color codes
RS="\[\033[0m\]" # reset
HC="\[\033[1m\]" # hicolor
UL="\[\033[4m\]" # underline
INV="\[\033[7m\]" # inverse background and foreground
FBLK="\[\033[30m\]" # foreground black
FRED="\[\033[31m\]" # foreground red
FGRN="\[\033[32m\]" # foreground green
FYEL="\[\033[33m\]" # foreground yellow
FBLE="\[\033[34m\]" # foreground blue
FMAG="\[\033[35m\]" # foreground magenta
FCYN="\[\033[36m\]" # foreground cyan
FWHT="\[\033[37m\]" # foreground white
BBLK="\[\033[40m\]" # background black
BRED="\[\033[41m\]" # background red
BGRN="\[\033[42m\]" # background green
BYEL="\[\033[43m\]" # background yellow
BBLE="\[\033[44m\]" # background blue
BMAG="\[\033[45m\]" # background magenta
BCYN="\[\033[46m\]" # background cyan
BWHT="\[\033[47m\]" # background white

export PS1="$FYEL\h$RS:$FBLE\w $FGRN\u$RS\$ "

La ventaja de tener todas las variables dentro del propio .bashrc es que resulta muy simple cambiar y experimentar con otros colores, combinaciones y opciones.

La idea original la postea en MiCovran en Ubuntu Forums.

El promtp del bash puede tener información bastante útil (y en algunos casos divertida):

\a El carácter ASCII de campanita(07)
\d la fecha en formato "DiaSemana Mes Fecha"
p.ej: Tue May26
\D{formato}
El formato de fecha de acuerdo con strftime(3) y el
resultdo es mostrado en el prompt.
\e El carácter ASCII de escape (033)
\h El hostname antes del primer '.'
\H El Hostname
\j El numero de tareas que está ejecutando el shell
\l El nombre del dispositivo usado por el shell
\n Nueva línea
\r Retorno de Carro
\s El nombre del shell, el $0 (a partir de la útima /)
\t Hora actual 24-horas formato HH:MM:SS
\T Hora actual 12-horas formato HH:MM:SS
\@ Hora actual 12-horas formato am/pm
\A Hora actual 24-horas formato HH:MM
\u El nombre de usuario actual
\v Version del bash
\V Version del bash completa
\w Directorio actual
\W Nombre completo del directorio actual
\! Numero en el hisórico del actual comando
\# Numero de comando del actual comando
\$ Si el UID es 0, un #, de lo contrario un $
\nnn El caracter correspondiente al número octal nnn
\\ Una retrobarra
\[ Inicio de secuencia de caracteres que no se muestran,
se puede usar para incluir caracteres de control
\] fin de caracteres que no se muestran

Claro, el mataburro de todo esto es un simple man bash.



Wikipedia:  CLI