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).
Este es el Script Original en Ingles, Abajo os pondré el mio que modifique básicamente lo puse en español
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
lo Guardamos como download.sh le damos permisos con chmod +x download.sh & Lo ejecutamos ./download.sh
De Google podemos decir cualquier cosa, excepto que sea predecible con sus nuevos servicios y aplicaciones. Y este es el caso de GoogleCL, una aplicación para acceder a los servicios de datos de la empresa desde la línea de comandos. Fue presentado con bombo y platillo hace no más de una semana y no es sino un gran script Python que usa las bibliotecas gdata (Google Data Protocol). Les presentaré unos ejemplos para comenzar a aprovecharlo.
Por ahora, GoogleCL soporta estos servicios:
Docs
google docs edit --title "Comandos Linux"
Blogger
google blogger post --title "Frase" "Si no te equivocas de vez en cuando, es que no lo intentas"
Calendar
google calendar add "Desayuno en Tiffany"
Contacts
google contacts list name,email > contactos-respaldo.csv
Picasa
google picasa create --title "Fotos vergonzosas" ~/fotos/familia/*.png
Youtube
google youtube post --category Education aprendiendo_navi.mp4
Instalación enUbuntu/Debian
Descarga el código fuente o bien el DEB para sistemas de la familia Debian. Elige tu favorita del sitio de descargas. La versión más reciente a la fecha es la 0.9.7. Desde Debian/Ubuntu ejecuta:
sudo dpkg -i googlecl_0.9.7-1_all.deb
Uso
Hay muchos ejemplos en el sitio de GoogleCL. Aquí me concentraré en mostrar cómo configurar el acceso a Google Docs desde la línea de comandos. Antes de eso debes saber que ejecutado sin argumentos, GoogleCL inicia una sesión interactiva a través del comando google, con el carácter “>” como prompt.
google
> help
Welcome to the Google CL tool!
Commands are broken into several parts: service, task, options, and arguments.
For example, in the command
[...más salida...]
Enter "> help <service>" for more information on a service.
Or, just "quit" to quit.
> help docs
Available tasks for service docs: 'edit', 'delete', 'list', 'upload', 'get'
edit: Edit a document
Requires: title Optional: format, editor
delete: Delete documents
Requires: none Optional: title
list: List documents
Requires: delimiter Optional: title, folder
upload: Upload a document
Requires: none Optional: title, folder, no-convert Arguments: PATH_TO_FILE
get: Download a document
Requires: (title OR folder) Arguments: LOCATION
> quit
Usaré la sesión interactiva en todos los ejemplos.
Es importante configurar el navegador que utilizaremos con GoogleCL para realizar ciertas tareas. Hay dos opciones: exportar una variable de ambiente BROWSER o editar el archivo de configuración de la aplicación. Te recomiendo esta última.
echo auth_browser=firefox >> ~./google/config
Desde el shell de GoogleCL y con ayuda de la documentación haremos unas sencillas tareas. Comencemos por obtener una lista de nuestros documentos. La primera vez te solicitará un usuario y luego que aceptes desde el navegador que GoogleCL pueda acceder a tu cuenta en el futuro.
google
> docs list
Please specify user: *****
Please log in and/or grant access via your browser at https://www.google.com
***** then hit enter.
El navegador que elegiste se abre y debes dar clic en “Grant access”. Un archivo access_tok_tu_usuario se crea bajo el directorio ~./google.
De ahora en adelante ya no será necesario autorizar nada para ese usuario. Después de aceptar, en el shell de google aparece un listado de tus archivos. Aquí muestro una vista parcial de la salida porque es extensa.
Lista de ejemplos,http://docs.google.com/Doc?docid=*****
Reporte 10-P,http://spreadsheets.google.com/ccc?key=*****
[... más salida ...]
Ahora edito un documento de texto con Vim.
docs edit --title "In the beginning was the command line" --editor vim
Y aquí lo descargo
docs get --title "In the beginning was the command line"
Downloading In the beginning was the command line to /home/eli/In the [...] .txt
Conclusiones
Como sucede con cualquier herramienta, GoogleCL puede ser tan poderoso como lo quieras. Sobre todo si lo incluyes en tus scripts personales. Además notarás que algunas opciones tienen bugs, pero ten paciencia y espera la versión 1.0 estable. Si eres frecuente usuario del shell y de los servicios de Google, encontrarás en GoogleCL un importante aliado para tu productividad.
Aqui os dejo este .bash_profile útil para sysadmins que administren servidores con Plesk.
Si quereis comentar que alias teneis en vuestro bash_profile es de agredecer, un saludo¡¡¡
Para usarlo copiar y pegar dentro del archivo .bash_profile
alias bye=»exit» alias ns=»netstat -lpn» alias pmysql=»cd /var/lib/mysql» alias phttpd=»cd /var/www/vhosts» alias tailall=»tail -f /var/www/vhosts/*/statistics/logs/error_log /var/www/vhosts/*/statistics/logs/access_log» alias tailallerror=»tail -f /var/www/vhosts/*/statistics/logs/error_log» alias tailallaccess=»tail -f /var/www/vhosts/*/statistics/logs/access_log» alias maillog=»tail -f /usr/local/psa/var/log/maillog» alias myadmin=»mysql -u admin -p`cat /etc/psa/.psa.shadow`» alias mchk=»/usr/local/psa/admin/sbin/mchk –with-spam» alias webpsa=»/usr/local/psa/admin/sbin/websrvmng -av» alias ppass=»cat /etc/psa/.psa.shadow;» alias que=»/var/qmail/bin/qmail-qstat»
echo «############################################################» echo » Shortcuts to your system » echo «############################################################» echo echo «To see your Plesk password, type: ppass» echo echo «To rebuild your Apache/Web Server configuration, type: webpsa» echo echo «To rebuild your Qmail/Mail Server configuration, type: mchk» echo echo «To see your Qmail/Mail Server queue, type: que» echo echo «To connect to your MySQL server as admin, type: myadmin» echo echo «To exit from shell, type: exit» echo echo «To see netstat command, type: ns» echo echo «To see all error/access log, type: tailall» echo echo «To see all error log, type: tailallerror» echo echo «To see email log, type: maillog» echo echo «To see all access log, type: tailallaccess» echo echo «To get rid of these messages/aliases, edit your /root/.bash_profile» echo
Te acuerdas que creaste un archivo entre el 15 de Septiembre de 2010 y el 30 de Septiembre de ese mismo año. ¿Cómo lo puedes buscar en Linux? Fácil, usando el comando find y estos truquitos:
Primera forma para versiones antiguas del comando find (< =2.4)
Bueno otro buen script a la huchaca… esta escrito en bash aparte de ser utilisisimo porque chequea las tablas fragmentadas y tambien chequea todas las bbdds en busca de tablas MyISAM o INNODB y las optimiza.
#!/bin/bash
VERSION="0.7.2" log="$PWD/mysql_error_log.txt"
echo "MySQL fragmentation finder (and fixer) v$VERSION, written by Phil Dufault ( http://www.dufault.info/ )"
showHelp() { echo -e "\tThis script only repairs MyISAM and InnoDB tables" echo -e "\t--help or -h\t\tthis menu" echo -e "\t--user username\tspecify mysql username to use\n\t\t\tusing this flag means the script will ask for a password during runtime, unless you supply..." echo -e "\t--password \"yourpassword\"" echo -e "\t--host hostname\tspecify mysql hostname to use, be it local (default) or remote" }
#s parse arguments while [[ $1 == -* ]]; do case "$1" in --help|-h) showHelp; exit 0;; --user) mysqlUser="$2"; shift 2;; --password) mysqlPass="$2"; shift 2;; --host) mysqlHost="$2"; shift 2;; --) shift; break;; esac done
# prevent overwriting the commandline args with the ones in .my.cnf, and check that .my.cnf exists if [[ ! $mysqlUser && -f "$HOME/.my.cnf" ]]; then if grep "user=" "$HOME/.my.cnf" >/dev/null 2>&1; then if grep "pass=" "$HOME/.my.cnf" >/dev/null 2>&1; then mysqlUser=$(grep user= < "$HOME/.my.cnf" | awk -F\" '{print $2}');
mysqlPass=$(grep pass= < "$HOME/.my.cnf" | awk -F\" '{print $2}');
if grep "host=" "$HOME/.my.cnf" >/dev/null 2>&1; then mysqlHost=$(grep host= < "$HOME/.my.cnf" | awk -F\" '{print $2}');
fi
else
echo "Found no pass line in your .my.cnf,, fix this or specify with --password"
fi
else
echo "Found no user line in your .my.cnf, fix this or specify with --user"
exit 1;
fi
fi # set localhost if no host is set anywhere else
if [[ ! $mysqlHost ]]; then
mysqlHost="127.0.0.1"
fi # error out
if [[ ! $mysqlUser ]]; then
echo "Authentication information not found as arguments, nor in $HOME/.my.cnf"
echo
showHelp
exit 1
fi if [[ ! $mysqlPass ]]; then
echo -n "Enter your MySQL password: "
read -s mysqlPass
fi # Test connecting to the database:
mysql -u"$mysqlUser" -p"$mysqlPass" -h"$mysqlHost" --skip-column-names --batch -e "show status" >/dev/null 2>&1 if [[ $? -gt 0 ]]; then echo "An error occured, check $log for more information."; exit 1; fi
# Retrieve the listing of databases: databases=( $(mysql -u"$mysqlUser" -p"$mysqlPass" -h"$mysqlHost" --skip-column-names --batch -e "show databases;" 2>"$log") ); if [[ $? -gt 0 ]]; then echo "An error occured, check $log for more information." exit 1; fi
echo -e "Found ${#databases[@]} databases"; for i in ${databases[@]}; do # get a list of all of the tables, grep for MyISAM or InnoDB, and then sort out the fragmented tables with awk fragmented=( $(mysql -u"$mysqlUser" -p"$mysqlPass" -h"$mysqlHost" --skip-column-names --batch -e "SHOW TABLE STATUS FROM $i;" 2>"$log" | awk '{print $1,$2,$10}' | egrep "MyISAM|InnoDB" | awk '$3 > 0' | awk '{print $1}') ); if [[ $? -gt 0 ]]; then echo "An error occured, check $log for more information." exit 1; fi tput sc echo -n "Checking $i ... "; if [[ ${#fragmented[@]} -gt 0 ]]; then if [[ ${#fragmented[@]} -gt 0 ]]; then if [[ ${#fragmented[@]} -gt 1 ]]; then echo "found ${#fragmented[@]} fragmented tables." else echo "found ${#fragmented[@]} fragmented table." fi fi for table in ${fragmented[@]}; do let fraggedTables=$fraggedTables+1; echo -ne "\tOptimizing $table ... "; mysql -u"$mysqlUser" -p"$mysqlPass" -h"$mysqlHost" -D "$i" --skip-column-names --batch -e "optimize table $table" 2>"$log" >/dev/null if [[ $? -gt 0 ]]; then echo "An error occured, check $log for more information." exit 1; fi echo done done else tput rc tput el fi unset fragmented done
# footer message if [[ ! $fraggedTables -gt 0 ]]; then echo "No tables were fragmented, so no optimizing was done."; else if [[ $fraggedTables -gt 1 ]]; then echo "$fraggedTables tables were fragmented, and were optimized."; else echo "$fraggedTables table was fragmented, and was optimized."; fi fi
if [[ ! -s $log ]]; then rm -f "$log" fi
unset fraggedTables
Link | http://www.dufault.info/blog/a-script-to-optimize-fragmented-tables-in-mysql/