Automatizar tareas FTP dentro de un script en BASH
La automatización de tareas vía FTP dentro de un script , puede resultar muy útil para scripts de copias de seguridad por ejemplo. Vamos a ver la forma de hacerlo y las posibilidades que nos ofrece. La sintaxis básica para hacer la llamada a FTP dentro de un script en bash es la siguiente: ftp -inv direccion_ipLos códigos de color en Bash
Por si estás programando algun script en bash o necesitar imprimir algun texto en consola de manera especial y no recuerdas cual era la combinación, El siguiente script (color-bash.sh) te imprime una tabla de colores en bash:
#!/bin/bash
# prints a color table of 8bg * 8fg * 2 states (regular/bold)
echo
echo Table for 16-color terminal escape sequences.
echo Replace ESC with \\033 in bash.
echo
echo "Background | Foreground colors"
echo "---------------------------------------------------------------------"
for((bg=40;bg<=47;bg++)); do
for((bold=0;bold<=1;bold++)) do
echo -en "\033[0m"" ESC[${bg}m | "
for((fg=30;fg<=37;fg++)); do
if [ $bold == "0" ]; then
echo -en "\033[${bg}m\033[${fg}m [${fg}m "
else
echo -en "\033[${bg}m\033[1;${fg}m [1;${fg}m"
fi
done
echo -e "\033[0m"
done
echo "--------------------------------------------------------------------- "
done
echo
echo
O tambien puedes descargarlo:
wget dev.redcodenetwork.ro/public/shell/color-bash.sh
chmod +x color-bash.sh
./color-bash.sh
Enlace | Red code | Relacionado | Top 7 de prompts para la terminal
Tip: Generar un fichero binario desde Consola
No se si a alguien más le será útil (a mi sí ^^). Si generar un fichero de texto plano es muy simple con el comando “echo”.
$ echo "Hola Caracola!!" | tee -a output.txt
Generar un fichero binario tambien es muy simple con echo. Ejemplo:
$ echo -e -n "\x0A\xFF\x01\x02" > output.bin
Crea un fichero binario de 4 bytes con los contenidos en hexadecimal 0A, FF, 01 y 02.
Puedes comprobarlo con un editor hexadecimal, como por ejemplo “bless”
$ bless output.bin
Puedes crear tu propio contenido binario de manera similar mediante echo, concatenando secuencias hexadecimales con “\x”
Encontrar todos los host de una red
Este es un truquito bastante conocido ya por todos para encontrar todos los host “vivos” dentro de un segmento de red, con tan solo un ping
$ for ip in $(seq 1 254); do ping -c 1 192.168.1.$ip>/dev/null; [ $? -eq 0 ] && echo "192.168.1.$ip UP" || : ; done
[Script] Mejorando la productividad: Automatizando conexiones SSH mediante expect
Trabajo mucho con máquinas remotas, en estos casos me gusta abrir mi terminal y conectarme rapidamente utilizando SSH, lo cual no siempre es “tan rápido” porque he de introducir la contraseña u otros parametros de inicio. Para estos casos recomiendo utilizar aplicaciones tan geniales como Pac Manager, que nos simplifica mucho estas tareas o habilitar la posibilidad de conexion SSH sin necesidad de usar contraseña (mediante clave pública). Pero no siempre podemos hacer lo que queramos en máquinas ajenas o instalar software adicional, asi que me plantee crearme unos sencillos scripts que me permitan acceder rapidamente a todas las máquinas remotas que necesite mediante SSH. Son los siguientes y puedes mejorarlos o personalizarlos como necesites.
conectar
conectar es el script principal, es un script que utiliza el comando “expect” (deberás tenerlo instalado en la máquina) y recupera los siguientes parametros que se le pasan por la linea de comandos: máquina, usuario, password, directorio de inicio y caracter usado para el prompt. Su funcionalidad es tan simple como automatizar la conexion ssh de manera que no sea necesario indicar la password y que nos deje en el directorio indicado. Entonces inicia una sesión interactiva para que escribamos los comandos que necesitemos en la máquina remota.
#!/usr/bin/expect set host [lindex $argv 0] set user [lindex $argv 1] set password [lindex $argv 2] set prompt [lindex $argv 3] set directorio [lindex $argv 4] spawn ssh $user@$host expect "password:" send "$password\n"; expect "$prompt" send "cd $directorio\n"; expect "$prompt" interact
c.txt
Es el fichero que utilizo como base de datos para guardar los datos de las máquinas remotas. Pienso utilizar sqlite más adelante pero no queria complicarlo mucho inicialmente para aquellos que desconozcan el uso de sqlite. El fichero es de la forma:
soledad|127.0.0.1|jose|jose|/home/jose/Escritorio|>|SSH|Mi servidor ssh # Formato: alias | ip | user | password | directorio | prompt | protocolo | descripcion
Es decir, añades una linea por cada máquina a la que quieras conectar y en esta linea indicas el nombre de la conexion (alias a usar), la dirección ip de la máquina, el usuario con el que conectar, la password, el directorio base de inicio donde quieres quedarte al inicio de la sesión, el prompt utilizado y el protocolo.
c
Es el script de bash que se encarga de llamar al script de expect (conectar) con los parametros adecuados. Su función principal es a partir de un alias que se le pasa como parametro, examinar el fichero c.txt y extraer la ip, user, password y directorio de esa máquina, para pasarle esos parametros a expect (script conectar). Si no se le pasa ningún parametro lo que hace es imprimir la lista actual de alias del fichero c.txt a modo de recuerdo de las máquinas a las que puedes conectar.
#!/bin/bash
CONSOLA=false
repo="${HOME}/UTIL/c.txt"
RUTA_LIB="${HOME}/UTIL/"
function DEBUG()
{
if ( $CONSOLA )
then
echo "DEBUG: $1 \n"
fi
}
#-----
GET_IP()
{
busqueda="$1"
#DEBUG "Buscando por : [ $busqueda ]"
cat $repo | grep $busqueda | awk -F"|" '{print $2}'
}
#----
GET_USER()
{
busqueda="$1"
#DEBUG "Buscando por : [ $busqueda ]"
cat $repo | grep $busqueda | awk -F"|" '{print $3}'
}
#----
GET_PASSWORD()
{
busqueda="$1"
#DEBUG "Buscando por : [ $busqueda ]"
cat $repo | grep $busqueda | awk -F"|" '{print $4}'
}
#----
GET_DIRECTORIO()
{
busqueda="$1"
#DEBUG "Buscando por : [ $busqueda ]"
cat $repo | grep $busqueda | awk -F"|" '{print $5}'
}
#----
CONECTAR_SSH()
{
${RUTA_LIB}conectar "$1" "$2" "$3" "$4" "$5"
}
SSH()
{
alias="$1"
_Host=`GET_IP "$alias"`
_User=`GET_USER "$alias"`
_Pass=`GET_PASSWORD "$alias"`
_Directorio=`GET_DIRECTORIO "$alias"`
_Prompt=">"
CONECTAR_SSH "$_Host" "$_User" "$_Pass" "$_Prompt" "$_Directorio"
}
ALIASNAME="$1"
if [ -z $ALIASNAME ];
then
echo "Sintaxis: $0 <alias o nombre maquina>"
echo ""
echo "Conexiones disponibles:"
echo "-----------------------"
echo ""
tac $HOME/UTIL/c.txt | grep -v "#" | awk -F"|" '{print $1}' | sort
else
SSH "$1"
fi;
Nota importante: por defecto todos estos scripts deben estar ubicados en $HOME/UTIL aunque se podria editar fácilmente el último script para que utilizara otro path.
Nota 2: el prompt de momento no lo uso y paso por defecto “>” pero es fácil de usar el que sea necesario. p.ej “$”
Por último sólo seria necesario crear el siguiente “alias” en nuestro fichero .bashrc
alias sshe=’$HOME/UTIL/c \$1′
Uso “sshe” por que me recuerda a “ssh y la e es de expect” pero podrias usar cualquier otro nombre.
Ahora conectar a cualquier máquina es tán simple como ejecutar desde consola:
$ sshe alias_de_la_maquina
Ejemplo:
$ sshe soledad
(usa tus propias máquinas de acuerdo al fichero c.txt)
y los scripts anteriores ya se encargan de dejarte el terminal preparado con la conexión ssh abierta.
He preparado un instalador que se encarga de copiar ya todo a tu directorio $HOME/UTIL. Puedes descargarlo junto al resto de scripts del siguiente enlace (nota: wordpress no me deja subir ficheros .zip directamente , asi que está renombrado como .doc pero realmente es un fichero .zip, cambiale la extensión y ya lo podrás descomprimir).
Espero que sea útil, a mi por lo menos si que me lo resulta.
Descarga | SSHE.zip
Imagelabel Nautilus Script: Añade texto a tus imágenes
Buen script para Nautilus que nos permite añadir textos a nuestras imagenes, permitiendo elegir el tamaño de la fuente y el color de fondo, entre otras opciones.
Descarga | Gnome-look
Script para instalar VirtualBox 4.0 Beta (Maverick)
Lo comente el otro día, pero bueno, aqui dejo un pequeño script para instalar VirtualBox 4.0 beta en la versión Maverick de 32 bits.
#!/bin/bash echo ":::::::::::::::::::::::::::::::::::::::::::" echo ": Instalador de Virtualbox 4.0 beta " echo ":::::::::::::::::::::::::::::::::::::::::::" echo "" echo "Este script instala VirtualBox 4.0 Beta para MAVERICK 32 bits" echo "Desea continuar (s/n)?" echo "" read option if [ $option == "s" ]; then sudo apt-get remove virtualbox* sudo apt-get install libstdc++5 wget "http://download.virtualbox.org/virtualbox/4.0.0_BETA1/virtualbox-4.0_4.0.0~beta1-68572~Ubuntu~maverick_i386.deb" sudo dpkg -i virtualbox-4.0_4.0.0~beta1-68572~Ubuntu~maverick_i386.deb wget "http://download.virtualbox.org/virtualbox/4.0.0_BETA1/Oracle_VM_VirtualBox_Extension_Pack-4.0.0_BETA1-68572.vbox-extpack" else exit; fi;
Genial Script para descarga de ficheros con barra de progreso (wget y Zenity)
Un muy útil código que podemos utilizar en nuestros scripts cuando queremos descargar un fichero y mostrar una barra de progreso del mismo (requiere zenity instalado en la máquina).
DOWNLOAD() {
rand="$RANDOM `date`"
pipe="/tmp/pipe.`echo '$rand' | md5sum | tr -d ' -'`"
mkfifo $pipe
wget -c $1 2>&1 | while read data;do
if [ "`echo $data | grep '^Length:'`" ]; then
total_size=`echo $data | grep "^Length:" | sed 's/.*\((.*)\).*/\1/' | tr -d '()'`
fi
if [ "`echo $data | grep '[0-9]*%' `" ];then
percent=`echo $data | grep -o "[0-9]*%" | tr -d '%'`
current=`echo $data | grep "[0-9]*%" | sed 's/\([0-9BKMG.]\+\).*/\1/' `
speed=`echo $data | grep "[0-9]*%" | sed 's/.*\(% [0-9BKMG.]\+\).*/\1/' | tr -d ' %'`
remain=`echo $data | grep -o "[0-9A-Za-z]*$" `
echo $percent
echo "#Downloading $1\n$current of $total_size ($percent%)\nSpeed : $speed/Sec\nEstimated time : $remain"
fi
done > $pipe &
wget_info=`ps ax |grep "wget.*$1" |awk '{print $1"|"$2}'`
wget_pid=`echo $wget_info|cut -d'|' -f1 `
zenity --progress --auto-close --text="Connecting to $1\n\n\n" --width="350" --title="Downloading"< $pipe
if [ "`ps -A |grep "$wget_pid"`" ];then
kill $wget_pid
fi
rm -f $pipe
}
if [ $1 ];then
DOWNLOAD "$1"
else
dllink=$(zenity --entry --text "Your download link :" --width="350" --entry-text "" --title="Download url")
if [ $dllink ];then
DOWNLOAD "$dllink"
fi
fi
Via | Ubuntu Forums
Tip: Imprimir el contenido de un archivo en orden inverso
Seguro que conoces “cat” para imprimir el contenido de un archivo. Pero si lo que quieres es imprimirlo en orden inverso, ejecuta entonces “tac”: fácil de recordar, es “cat” pero al reves.
$ tac fichero.txt
$ ls -l | tac
Script: Crear un icono personalizado para JDownloader en funcion del color del panel
Cansado de cambiar de tema (por ejemplo usar Ambiance o Radiance) y de tener que ir modificando el icono del tray de JDownloader, he aprovechado la entrada de mi post anterior y he creado un pequeño script para crear un icono de JDownloader personalizado que coge el color del panel y crea una imagen con ese color como fondo.
Funcionamiento: Utilizo la clave de gconftool para intentar recuperar el color actual del panel superior.
Despues abro una ventana de dialogo donde muestro ese color para que se use o lo cambies si deseas utilizar un color diferente y con la seleccion ya emplea imagemagick para generar un nuevo icono. Los requisitos son imagemagick y zenity.
A continuación la imagen que uso de plantilla y el script, dejalos en el mismo directorio:
Scritp: jdcreator.sh
#!/bin/bash #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: # Jdownloader Icon creator para Ambiance & Radiance # Piwi- Ubuntulife # Requiere de "zenity" instalado y la imagen "transparent_jd_logo_128_128.png" en el directorio. #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: # Intento recuperar el color de fondo del panel COLOR_PANEL=`gconftool-2 -g "/apps/panel/toplevels/top_panel_screen0/background/color"` #unset COLOR_PANEL szAnswer=$(zenity --entry --title "JDownloader Icon Creator" --text "background color?" --entry-text "$COLOR_PANEL"); echo $szAnswer COLOR_PANEL=$szAnswer # Comprobar si encuentra un valor, si no lo tiene salir. if [ -z $COLOR_PANEL ]; then exit; fi # Imagen origen a la que le queremos cambiar el color de fondo (transparente) TEMPLATE="transparent_jd_logo_128_128.png" # Nuevo color de fondo sera el color del panel recuperado o el color indicado convert $TEMPLATE -fuzz 5% -fill "$COLOR_PANEL" -opaque transparent output.jpg convert output.jpg jd_logo_128_128.png rm output.jpg zenity --info --text="Imagen generada (jd_logo_128_128.png), Copia esta imagen a la ruta donde tengas instalado jdownloader en jd/img/logo." exit;
Utilizacion:
chmod +x ./jdcreator.sh
./jdcreator.sh






