lunes, 23 de febrero de 2015

Passwords con caracteres aleatorios

En muchas ocasiones, cuando tenemos que crear un servicio que pide usuario/password, tendemos al uso de passwords simples o poco elaboradas. Tanto si es para un uso personal como si es para compartir información entre usuarios (este, quizás, más importante aún securizar), las password simples o basadas en diccionarios no son del todo una buena idea.

Este pequeño script de python genera una clave de N caracteres aleatorios (pasados por argumento, o 10 en su defecto), que puede añadir símbolos indicando el argumento "@".

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import string,random,sys

dictionary = string.ascii_letters + string.digits
dictionary_extra = '@.-!~'

N = 10
if(len(sys.argv)>1):
 if(sys.argv[1][0]=='@'):
  dictionary += dictionary_extra
  if(len(sys.argv[1])>1): N=int(sys.argv[1][1:])
 else:
  N = int(sys.argv[1])
print ''.join(random.SystemRandom().choice(dictionary) for _ in range(N))

Ejemplos de uso:

$ python randompasswd @20
Dk5nl8w~.WxrkEj94!V~

$ python randompasswd @
0KAiU0z@rC

$ python randompasswd 
eqUL9Kaw22G1QFc
Share to Facebook Share to Twitter Email This Share on Google Plus Share on LinkedIn

jueves, 19 de febrero de 2015

sendlines, un expect simplificado

Para automatizar tareas siempre había hecho uso de autoexpect, ya que, una vez realizado (y guardado) todo la primera vez, sólo había que hacer un par de apaños al script resultante. Sin embargo, hay veces que no necesitamos algo tan sofisticado o no queremos instalar tcl/tsh en la máquina.

No hay problema: un pequeño script en python lee de un archivo de texto y le manda, línea a línea, su contenido al ejecutable que hayamos elegido.

Seguramente haya muchas cosas por pulir, pero hace lo que tiene que hacer (Pricipio KISS, que le llaman ;) ).

Uso: sendlines -f fichero_de_texto -c "comando a ejecutar" [ -d delay ], donde:

  • fichero_de_texto: archivo que contiene las lineas que se van a mandar. No contempla comentarios, lo manda del tirón
  • comando: orden que recibirá las entradas de fichero_de_texto. Si tiene parámetros, poner todo el comando entre comillas (ej: "grep -v grep")
  • delay: tiempo entre lineas. Opcional, espera un tiempo (en segundos) entre cada linea que manda

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess
import time
import sys, getopt

def run(cmd,textFile,delay):
 with open(textFile,'r') as text:
  content=text.readlines()
 p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stdin=subprocess.PIPE)
 for line in content:
  p.stdin.write(line+'\n')
  if(delay): time.sleep(float(delay))
 p.communicate()[0]
 p.stdin.close()


def usage():
 print '''
Usage: sendlines -f TEXTFILE -c "COMMAND" [ -d DELAY ]
- TEXTFILE: Text file where read lines from. Mandatory.
- COMMAND: Command to be executed (if there are any arguments to be sent, must be put all between quotes). Mandatory
- DELAY: Time (in seconds) to wait between sending lines. Optional.
'''


if __name__ == "__main__":
 textfile = None
 command = None
 delay = None
 try:
  opts, args = getopt.getopt(sys.argv[1:], "f:c:d:", ["file=", "command=", "delay="])
 except getopt.GetoptError as err:
     # print help information and exit:
  print str(err) # will print something like "option -a not recognized"
  sys.exit(2)
 for o, a in opts:
  if o in ("-f", "--file"):
   textfile = a
  elif o in ("-c", "--command"):
   command = a.split(' ')
  elif o in ("-d", "--delay"):
   delay = a
  else:
   assert False, "unhandled option"
   usage()
 if(command and textfile):
  run(command,textfile,delay)
 else:
  usage()
  print 'Missing argument(s). Exit\n'
  sys.exit(2)
Share to Facebook Share to Twitter Email This Share on Google Plus Share on LinkedIn

martes, 17 de febrero de 2015

Hacer un pg_dump aprovechando los cores de la máquina

Desde la versión 9.3, postgreSQL permite hacer dumps de la base de datos en forma paralela, aprovechando así el número de cores de la máquina.

En una forma rápida, podemos lanzar este proceso:

pg_dump -h $MAQUINA -U $USER -d $DATABASE -Fd -j `nproc` -f $DESTINO

Las variables son autorreferentes, con lo que la gracia de este comando se encuentra en la opción -Fd (obligatoria para que use diferentes cores), que realiza el dump en un directorio en lugar de un archivo; y la opción -j, que refiere al número de procesos que se lanzan simultáneamente. En este caso, hacemos uso de lo que devuelve nproc para levantar tantos procesos como núcleos.

Un pequeño script de backup de base de datos local (perfecto para meter en un cronjob del usuario postgres) sería:
#!/bin/bash
## This script will create a backup for each database listed in the DATABASES variable
## Use as postgres user or add the -U [username] to the pg_dump line

DATABASES="template1 db other_db"

CORES=`nproc`
TARGET_FOLDER=/var/backups

for DATABASE in $DATABASES; do
    mkdir -p $TARGET_FOLDER/$DATABASE
    pg_dump -d $DATABASE -Fd -j $CORES -f $TARGET_FOLDER/$DATABASE
done
Share to Facebook Share to Twitter Email This Share on Google Plus Share on LinkedIn

Recuperando el blog

¡Buenas!

Han pasado unas cuantas (CUANTAS) cosas desde que hice mi última entrada, tanto en mi vida como en el mundo linux. Desconozco la frecuencia con la que escribiré de nuevo, pero quiero darle un uso de sysadmin a este pobre blog, añadiendo trucos, utilidades y tuneaje, aparte de hablar de los pequeños proyectos que tengo en GitHub.

Así que, abracetes y ¡let the Hunger Games begin!
Share to Facebook Share to Twitter Email This Share on Google Plus Share on LinkedIn