jueves, 27 de febrero de 2014

(Solucion) Al problema : "/bin/rm: Argument list too long"

EL PROBLEMA
Me ha pasado en ocaciones cuando quiero borrar miles de archivos dentro de un directorio (rm /mi/directorio/*"  obtengo el error:

/bin/rm: Argument list too long

Esto nos indica que la cantidad de archivos es muy grande y no puede gestionarla (wtf?)

LA CAUSA
La causa es una limitación del buffer de la función exec() la cual es de 128K, y esta funcion está utilizada en muchos otros programas como , ls, rm, du ...

El limite afecta la funcion execve() del kernel, la cual es usada por  las funciones exec() (execl, execlp, execle,etc). La funcion trabaja creando un buffer de 128k al final del espacio de memoria y copiando el comando y el entorno para el nuevo proceso en este espacio. En ese momento el kernel carga el nuevo programa en memoria, configura sus punteros argv y endv, y salta al punto de entrada del programa. El mensaje de error "argument list too long" es causado por el codigo de error !E2BIG, siendo devuelto por la funcion execve(), cuando es incapaz de introducir el argumento y entorno suministrados dentro del buffer de 128k.

LA SOLUCIÓN 
La técnica que soluciona esto es seleccionar archivo por archivo . pensarías que esto no es viable ya que tendrías que borrar miles de archivos a mano y tardarías años en realizar este proceso

Para borrar de uno en uno sin hacerlo manualmente podemos hacer un bucle for (ciclo) que seleccione a cada archivo y le aplique el comando rm

for i in ls /mi/directorio/*; do rm -v $i -f; done

También se puede haciendo una búsqueda de todos los archivos  y aplicar a cada uno que vaya encontrando el comando rm

find . -name '*' | xargs rm


y listo, con esto podemos  borrar de manera masiva miles de archivos sin problemas :D


miércoles, 26 de febrero de 2014

Comando sed multiusos (mostrar, sustituir)

Les comparto esta información acerca de el uso del comando "sed", que puede servir tanto para mostrar información de archivos , como para sustituir cadenas de texto en los mismos.


MOSTRANDO SALIDA ESTANDAR

sed -e 'd' archivo.txt
Este comando no edita el archivo, solo muestra el contenido del mismo eliminando la primer linea de la salida estandard

sed -e '1,10d' /etc/services | more
Es parecido al anterior solo que ahora es con rangos, y elimina de la salida estandard de la linea 1 a la 10

sed -e '/^#/d' /etc/services | more
Elimina de la salida todas las lineas que empiezan con el caracter '#'

Expresiones regulares:
^ Apunta al comienzo de la línea
$ Apunta al final de la línea
. Apunta a un único carácter
* Apunta a cero o más ocurrencias del carácter previo
[ ] Apunta a todos los caracteres entre los corchetes


Ejemplos con expresiones regulares:

/./ Apuntará a cualquier línea que contenga al menos un carácter
/../ Apuntará a cualquier línea que contenga al menos dos caracteres
/^#/ Apuntará a cualquier línea que comience con un '#'
/^$/ Apuntará a cualquier línea en blanco
/}$/ Apuntará a toda línea que termine con un '}' (sin espacios)
/} *$/ Apuntará a toda línea que termine con un '}' con cero o más espacios
/[abc]/ Apuntará a toda línea que contenga una 'a', 'b', o 'c' minúscula
/^[abc]/ Apuntará a cualquier línea que empiece con 'a', 'b', o 'c'



sed -e '/expreg/d' /ruta/a/mi/archivo/de/pruebas | more
Elimina de la salida que coincidan con la expresion

sed -n -e '/PRINCIPIO/,/FIN/p' /mi/archivo/de/pruebas | more
Muestra un bloque de texto que comienza con la linea que contiene "PINCIPIO"  y terminará con la linea que contiene "FIN"


SUSTITUCIÓN EN ARCHIVOS

sed -e 's/foo/bar/' miarchivo.txt
Sustituye dentro de miarchivo.txt  la primer coincidencia de foo por la cadena bar

sed -e 's/foo/bar/g' miarchivo.txt
La opción "g" indica que la sustitución será de manera global en el archivo

sed -e '1,10s/enchantment/entrapment/g' miarchivo2.txt
Sustituye la palabra enchantment por entrapment pero solo hasta la linea 10 del archivo

sed -e '/^$/,/^FIN/s/colinas/montañas/g' miarchivo3.txt
Sustituye 'colinas' por 'montañas', pero únicamente en los bloques de texto que comiencen con una línea en blanco, y que terminen con una línea que comience con los tres caracteres 'FIN'

sed -e 's:/usr/local:/usr:g' milista.txt
cambia /usr/local por /usr:

sed -e 's/<[^>]*>//g' miarchivo.html
Elimina etiquetas html. El '[^>]' especifica un "carácter que no sea '>'" y el '*' después del mismo completa la expresión para significar "cero o más caracteres que no sean '>'"

Clases de caracteres

Clase de carácter Descripción
[:alnum:] Alfanumérico [a-z A-Z 0-9]
[:alpha:] Alfabético [a-z A-Z]
[:blank:] Espacios o tabuladores
[:cntrl:] Cualquier carácter de control
[:digit:] Dígitos numéricos [0-9]
[:graph:] Cualquier carácter visible (no espacios en blanco)
[:lower:] Minúsculas [a-z]
[:print:] Caracteres que no sean de control
[:punct:] Caracteres de puntuación
[:space:] Espacio en blanco
[:upper:] Mayúsculas [A-Z]
[:xdigit:] Dígitos hexadecimales [0-9 a-f A-F]


sed -e 's/.*/Rafa dijo: &/' msjorig.txt
El siguiente ejemplo pondrá el prefijo "Rafa dijo: " a cada frase/linea


Y pues siguiendo con este howto les dejo este script que acabo de ocupar para sustituir una dirección web de todos los archivos html de un directorio y hace un backup de los archivos modificados por si necesitas restaurar.

#!/bin/bash
echo "";echo ""; echo ""
echo "Sustituyendo  http://beta.fd.uach.mx"
echo "en todos los directorios y subdirectorios de: $1"

find $1 -iname *.html > tmp
while read linea
do 
 sed 's/http:\/\/beta.fd.uach.mx//g' $linea > $linea.tmp
 cp $linea $linea.bak
 cat $linea.tmp > $linea
 rm $linea.tmp
done < tmp
rm tmp


El modo de uso de este script es:

./script.sh /directorio/de/mis/html




martes, 25 de febrero de 2014

Compartir red / internet a partir de wifi en Ubuntu

Hay situaciones en las que estamos limitados en cuanto a red inalambrica  en algunos dispositivos, y estas situaciones suceden casi  siempre cuando algun otro dispositivo si tiene acceso a red / internet  ya sea por wifi o 3G

Es en estos casos cuando pensamos "Si pudiera pasarle el internet de mi cel / otra laptop" . Pues es justo lo que les vengo a comentar en este post.

Caso de ejemplo:
* Tengo 3G en mi cel y quiero pasarle internet a otro dispositivo por cable de red

Procedimiento:
1.-  Compartir mi red 3G a traves de Wifi
2.- Conectar mi laptop a la red compartida de mi celular
3.- Compartir la red que esta recibiendo mi laptop hacia otro dispositivo

Procedimiento del paso 3 en imágenes:


Habilitar el botón :"Todos los usuarios deben conectarse a esta red"

Establecer el método de conexión: "Compartido con otros equipos"



y con esto tendremos nuestra red compartida.

miércoles, 19 de febrero de 2014

Configurar Locales

Este es un problema común en Debian que se presenta cuando instalas tu server y a cada que instalas un paquete, te salen los errores de la configuración de las "Locales"

Instalar Locales
# apt-get install locales
Configurar Locales
en este paso eliges las locales de tu idioma, ejemplo:

es_MX
es_MX.UTF-8

con el siguiente comando:
# dpkg-reconfigure locales
y por ultimo ejecutamos:
# dpkg-reconfigure console-data
y con esto queda configurado completamente tu sistema y puede detectar acentos y demás caracteres propios de tu idioma

lunes, 17 de febrero de 2014

Ejecutar comandos BASH como otro usuario

para ejecutar comandos como si fueras otro usuario puedes hacerlo con el comando su que sirve para cambiarse de usuario en una sesion shell

las opciones de el comando son:

root@vuach:/home/villatux/pruebas#su --help
Modo de uso: su [opciones] [USUARIO]

Opciones:
  -c, --command ORDEN           pasa la ORDEN a la consola invocada
  -h, --help                    muestra este mensaje de ayuda y termina
  -, -l, --login                hace que la consola sea una de acceso
  -m, -p,
  --preserve-environment        no reinicia las variables de entorno, y mantiene la misma consola
  -s, --shell CONSOLA           usa CONSOLA en lugar de la predeterminada en passwd


Ahora para ejecutar el comando como otro usuario lo podemos hacer de la siguiente forma:

su -c "echo blablah > archivo1" -s /bin/bash villatux

y al mostrarel directorio vemos que los permisos y grupo son de el usuario que elegimos para ejecutar "echo":

root@vuach:/home/villatux/pruebas# ls -lah
total 12K
drwxr-xr-x  2 villatux villatux 4,0K feb 17 11:44 .
drwxr-xr-x 52 villatux villatux 4,0K feb 17 11:44 ..
-rw-rw-r--  1 villatux villatux    8 feb 17 11:44 archivo1

Ejecutando unicamente el comando "echo" sin invocar a ningun usuario : 

echo blablah > archivo2

y al listar el directorio podemos ver los permisos, propietario y grupo:

root@vuach:/home/villatux/pruebas# ls -lah
total 16K
drwxr-xr-x  2 villatux villatux 4,0K feb 17 11:44 .
drwxr-xr-x 52 villatux villatux 4,0K feb 17 11:44 ..
-rw-rw-r--  1 villatux villatux    8 feb 17 11:44 archivo1
-rw-r--r--  1 root     root        8 feb 17 11:44 archivo2

miércoles, 12 de febrero de 2014

Ocultar extensiones php/html con .htaccess

Si quieres ocultar las extensiones de tus archivos web, puedes utilizar el siguiente fragmento de codigo para tu .htaccess:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php
Consulta web sin ocultar extensiones:
www.mipagina.com/contacto.php

Consulta ocultando extensiones :
www.mipagina.com/contacto

lunes, 10 de febrero de 2014

Crear USB Booteable con wifislax / Wifiway

Posiblemente funcionen otras distribuciones con este método, solo hay que leer la documentación de cada una para ello.

Les dejo este tutorial para crear una USB booteable con Wifislax / Wifiway :

1 Conectar la usb y desmontarla manualmente para luego volverla a montar (Cuando se monta automaticamente el sistema no permite correr scripts), En este caso mi memoris USB es /dev/sdb1  pueden comprobar cual es la suya con fdisk -l
umount /dev/sdb1
mkdir /mnt/usb
mount /dev/sdb1 /mnt/usb
2 Descargar wifislax
http://www.wifiway.org/

3 Montar el iso para acceder a los archivos
mkdir /mnt/iso
mount -o loop wifislax-4-7-2-final.iso /mnt/iso
4 copiar el contenido de el iso a la memoria USB
cd /mnt/iso
cp -R wifislax /mnt/usb/
cp -R boot /mnt//usb/
5 Ejecutar el script
cd /mnt/usb/boot
./bootinst.sh

Y aparecerá algo como esto:

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
                        Welcome to Wifislax boot installer                        
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

This installer will setup disk /dev/sdi1 to boot only Wifiway.

Warning! Master boot record (MBR) of /dev/sdi will be overwritten.
If you use /dev/sdi to boot any existing operating system, it will not work
anymore. Only Wifiway will boot from this device. Be careful!

Press any key to continue, or Ctrl+C to abort...



Ahora solo nos queda presionar cualquier tecla varias veces hasta que se reescriba el MBR de tu memoria para que pueda bootear con nuestro live usb

6 Por ultimo nos salimos del directorio de la usb para desmontar todo y borrar los directorios que creamos:
cd /mnt
umount /dev/sdb1
umount /mnt/iso
rm -rf iso
rm -rf usb
exit
Y listo, con esto tenemos nuestro live usb listo para bootear

viernes, 7 de febrero de 2014

Como agregar un nuevo usuario administrador (con privilegios de SUDO)

Agregar un nuevo usuario:

sudo adduser nuevousuario

Dar permisos de administrador al usuario agregado:

sudo adduser nuevousuario sudo

 Con estos comandos el usuario podrá ingresar con privilegios de administrador 

jueves, 6 de febrero de 2014

Habilitar CDR (Reportes de llamadas) con Asterisk y MySQL

Las nuevas versiones de asterisk y las distros que lo llevan no habilitan por default el registro de llamadas con mysql para las interfaces gráficas ya sea de su distro o de FreePBX.

Te das cuenta de esto ya que no puedes ver el registro de llamadas  ni reportes de las mismas.


Para habilitar el registro de llamadas con MySQL
Editar el archivo modules.conf   con tu editor de texto que prefieras, en este caso yo usé vim

vim /etc/asterisk/modules.conf

Localizar la linea:

noload => cdr_mysql.so

Sustituirla por:

load => cdr_mysql.so

miércoles, 5 de febrero de 2014

Ver videos bloqueados con "Like de facebook"

A quien no le ha pasado que ve alguna publicación de amigos en las redes sociales con títulos llamativos  y al darle click al video para verlo te das cuenta que está bloqueado para que le des like y despues de ello lo puedas ver.

Este tipo de videos en particular me repatea, pues no has visto el video y obviamente no sabes si te ha gustado, como para darle like


para evitar estos bloqueos podemos hacer lo siguiente:

1.- Abrir la pagina con el vídeo bloqueado
 ejemplo: http://hd.soyvideos.com/una-nina-le-da-una-moneda-a-un-musico-y-lo-que-sucede-despues-ha-hecho-historia/

2.- click secundadio -> ver el código fuente de la pagina


3.-  En el siguiente código buscamos el valos de data-videoid :


4- Copiamos ese valor del código fuente y nos vamos a youtube, reproducimos cualquier video  y en la barra de direcciones cambiamos la parte donde dice watch?v=cYJ-LRZWnog  lo cambiamos por el valor que copiamos del código fuente.  Algo asi:

watch?v=sP-RL2JrZGI

martes, 4 de febrero de 2014

¿Que DNS tiene mi ISP y ¿cual es la resolución inversa de mi ip?

No es muy común necesitarlos, de hecho no es normal, pero aún así hay veces que si es necesario.  Un amigo me pregunto por los dns de cablemás, por lo que empecé a investigar  desde un servidor de un cliente el cual su ISP es Cablemás:


El servidor de mi cliente tiene un dominio dinámico "dyndns" el cual usé de la siguiente forma para saber la ip publica:

villatux@vuach:~$ host ctrp.selfip.net
ctrp.selfip.net has address 187.253.82.1XX

ya sabiendo la ip publica podemos buscar los dns de el ISP y la resolución inversa de la ip de mi cliente:

villatux@vuach:~$ nslookup 187.253.82.1XX
Server:  127.0.1.1
Address: 127.0.1.1#53

Non-authoritative answer:
1XX.82.253.187.in-addr.arpa name = 187.253.82.1XX.cable.dyn.cableonline.com.mx.

Authoritative answers can be found from:
82.253.187.in-addr.arpa nameserver = cva1.cableonline.com.mx.
cva1.cableonline.com.mx internet address = 200.95.144.3


villatux@vuach:~$ dig cva1.cableonline.com.mx

; <<>> DiG 9.9.3-rpz2+rl.13214.22-P2-Ubuntu-1:9.9.3.dfsg.P2-4ubuntu1.1 <<>> cva1.cableonline.com.mx
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51437
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;cva1.cableonline.com.mx. IN A

;; ANSWER SECTION:
cva1.cableonline.com.mx. 37226 IN A 200.95.144.3

;; AUTHORITY SECTION:
cableonline.com.mx. 37226 IN NS cva2.cableonline.com.mx.
cableonline.com.mx. 37226 IN NS cva1.cableonline.com.mx.

;; ADDITIONAL SECTION:
cva2.cableonline.com.mx. 37226 IN A 200.95.144.4

;; Query time: 0 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Thu Jan 30 13:52:45 MST 2014
;; MSG SIZE  rcvd: 117


Y listo, tenemos los dns con sus respectivas ip de el ISP

cva1.cableonline.com.mx. 37226 IN A 200.95.144.3
cva2.cableonline.com.mx. 37226 IN A 200.95.144.4