Algunas ocasiones nos encontramos de cara a un problema entre unix y windows, ¿Como copio archivos entre ellos? sino dispongo de un servidor de NFS en windows es decir algunas versiones viejas como 2003 server entre otros, y además quiero hacer una copia calendarizada de ciertos archivos. Nota que el sentido de la copia es de windows a unix estando desde unix, ya que en el otro sentido “podría” ser más sencilla usando algún cliente de ssh, y notese que dije podría, tal vez no, pero bueno finalmente ese no es el caso.

Bueno pues resulta que algunos sistemas como linux disponemos de un cliente de smb el cual nos permite montar a través de cifs como si se tratase de nfs y asunto solucionado. Pero algunos unix como por ejemplo solaris, el cliente de smb(smbclient para ser mas precisos) trabaja como si fuera un ftp, es decir la interfaz de usuario se comporta como un cliente de ftp pero a través de cifs. Dijimos que necesitamos que sea una copia calendarizada, desatendida, automática, o como nosotros queramos llamarle.

Pues yo les prometí que sería de 3 patadas es decir, sencillito.

Personalmente me gusta hacer scripts de manera que sean al estilo unix, es decir que lean datos de la entrada standard y escriban datos a la salida standard por lo que usare el siguiente comando para hacerlo:
FILESLIST=`cat`

¿Y que sucederá cuando ejecute el script?, hay de 2 sopas o le pasamos el listado de archivos por medio de algún comando, por ejemplo: ls
o escribimos directamente en la entrada standard los archivos y cuando terminemos pulsamos ^D
ejemplo: copysmb.ksh
file1
file2
^D

Cuando digo ^D me refiero a la secuencia de comandos control-D No se vayan a confundir.

Para facilitarnos la tarea emplearemos un archivo de texto con las credenciales de la cuenta de windows, el archivo solo para fines didacticos lo pondré en tmp, quedando: /tmp/auth.txt
con el siguiente formato:
username = <value>
password = <value>
domain = <value>

Con ésto ya solo hace falta lo mas facil, por si creían que lo anterior era facil, pues lo que sigue, lo es más.

Es decir tenemos el script completo.

#!/usr/bin/ksh
FILESLIST=`cat | awk ‘{print “get ” $0 “;”}’`

SBMCLI=’/usr/sfw/bin/smbclient “//computer/share” -W WORKGROUP -U administrator -A /tmp/auth.txt -c ” $FILESLIST exit;”‘
eval $SBMCLI

Y que significa “cat | awk ‘{print “get ” $0 “;”}‘”, bueno para aquellos que son principiantes como yo, he de decir que lo que hace es transformar cada nombre de archivo por el siguiente formato: get fileX; ya que el smbclient requiere ese formato para descargar archivos. Si yo se, que parece que al script le falta algo, pero créanme está completo y funciona, bueno y si aun después de que les dije que funciona no me creen, pueden probarlo. Cabe mencionarles que éste script ha sido probado copiando unos 12,000 archivos y no he tenido problemas.

Si tienen la sensación que alguien se robó algunas líneas, les diré que quien hace la magia es el comando eval, que hace una sustitución de las variables y ejecución de los comandos que le son pasados por parámetro, por eso no necesitamos hacer mas y no, nadie se robó nada.

Si observamos con detenimiento el script anterior funciona si requerimos hacer una copia muy especifica de archivos es decir especificarle los nombres solo de los archivos que queremos usar, un ejemplo de como usarlo sería:

Copiar todos los archivos de un directorio.
$ ls | copysmb.ksh

Algo un poco mas elaborado, Copiar todos los archivos que contengan el patrón alumno en su nombre.

$ ls | grep alumno | copysmb.ksh

Un poco mas de nivel, Copiar todos los archivos que terminen en varias extensiones.

$ ls | egrep ‘(wmv$|mkv$|mpg$|mpeg$|avi$)’ | copysmb.ksh

Son muchos los ejemplos que podríamos poner pero confío en que ya se haya entendido la idea. Existe una manera de copiar por patrón que el smbclient y que también puede funcionar para otros casos. Les dejo el script modificado.

#!/usr/bin/ksh
FILES=`cat | awk ‘{print “mget ” $0 “;”}’`

/usr/sfw/bin/smbclient “//computer/share” -W WORKGROUP -U administrator -A /tmp/auth.txt -c ” $FILES exit;”

Las palabras que están en verde, remarcadas y subrayadas deben ser sustituidas de acuerdo a las necesidades.

es el dominio o grupo de trabajo.

es el usuario con los permisos para escribir.

es el archivo donde tenemos las credenciales.

Antes que concluyera mi artículo me di cuenta que hacia falta algo, y ese algo es que nos interesa saber que archivos hay en windows ya que sería complicado(no imposible) saber archivos contiene el recurso compartido windows y basado en eso hacer la copia de archivos. Ya tenemos un script con un gran avance y podemos basarnos en el y hacer lo siguiente:

#!/usr/bin/ksh

/usr/sfw/bin/smbclient “//computer/share” -W WORKGROUP -U administrator -A /tmp/auth.txt -c ” ls; exit;”

Vamos a suponer que el script lo nombramos como lssmb, para ejecutarlo sería:

$ lssmb.ksh

Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.30-1.4.osstech]
. D 0 Sun Apr 6 13:29:41 2014
.. D 0 Wed Dec 25 19:24:42 2013
Documentos D 0 Sat Jan 1 01:02:45 2000
bittorrent D 0 Sat Jan 1 09:17:56 2000
Multimedia D 0 Sat Jan 1 00:05:22 2000
cw D 0 Wed Dec 12 13:38:20 2012

Sin embargo el listado que nos mostrará será al estilo de un ls -l, asi que si queremos pasarlo al copysmb.ksh tendremos que darle un filtrado, ejemplo:

$ lssmb.ksh | head -n -2 | tail -n +3 | copysmb.ksh

Y ya entrados en ésto se me ocurre que podemos mezclarlo con los ejemplos anteriores.

$ lssmb.ksh | head -n -2 | tail -n +3 | grep alumno | copysmb.ksh

$ lssmb.ksh | head -n -2 | tail -n +3| egrep ‘(wmv$|mkv$|mpg$|mpeg$|avi$)’ | copysmb.ksh

Conclusión. Realizar la copia de archivos a través de smbclient es algo muy sencillo, como lo hemos podido constatar. Los scripts presentados anteriormente solo son una guia, y pueden ser mejorados y adaptados a las necesidades de cada quien, podríamos incluir los filtros dentro del script para evitar verlos, pero preferí hacerlo asi ya que eso nos da la oportunidad de ver todos los parámetros de los archivos, sin embargo podemos modificar los scripts para que acepten parámetros y sean mas poderosos y flexibles.

Anuncios

Comparación de listas en Unix de tres patadas.

Publicado: marzo 26, 2014 en Unix
Etiquetas:

Por experiencia propia se que en ocasiones requerimos comparar archivos de texto y saber que registros(líneas) están en un archivo o en el otro o en los 2, en algún momento de nuestras vidas nos enfrentamos a esta ardua tarea de comparar listas/archivos por diversas razones, y no queremos hacer uso de un lenguaje de programación como C/Java, etc, y queremos hacer uso de los comandos provistos por Unix.

Para facilitar la explicación vamos a hacer uso de los conjuntos de la siguiente manera:

Conjunto A. Rojo, Verde, Azul, Violeta.
Conjunto B. Negro, Blanco, Gris, Violeta.
Intersección.  Violeta.
Para hacer las comparaciones vamos a usar sort y uniq. También existe una forma alternativa que encontré mientras redactaba el presente documento, la cual no he probado con archivos grandes; está forma hace uso de egrep. Les dejo a su consideración cual método usar asi como el probar cual es el más eficiente. Si alguien desea compartir sus resultados sería excelente.
Primeramente necesitamos filtrar los conjuntos A y B para evitar duplicaciones con esto garantizamos que el primer método funcione correctamente.
root# sort A | uniq | tee Ap

Azul
Rojo
Verde
Violeta

root# sort B | uniq | tee Bp

Blanco
Gris
Negro
Violeta

Ya estamos listos para entonces pasar a la parte medular de las comparaciones de la lista. Lo primero que haremos será sacar la intersección de los 2 archivos.

 root# cat Ap Bp | sort | uniq –d

Violeta

Forma alterna:
root# egrep  -f B A

Violeta

 

En ocasiones a veces solo queremos saber la intersección y con esto es suficiente para esto sin embargo a veces queremos saber más por ejemplo que elementos solo existen en A o en B y para esto hacemos lo siguiente.

 

Para saber los elementos que están en A y que no están en B:
root# cat Ap Bp | sort | uniq -u | cat – Ap | sort | uniq –d

Azul
Rojo
Verde

Forma alterna:
root# egrep -v -f Bp Ap

Rojo
Verde
Azul

Si requerimos saber que está en B y no está en A haremos el caso análogo:
root# cat Ap Bp | sort | uniq -u | cat – Bp | sort | uniq –d

Blanco
Gris
Negro

 

Forma alterna:
root# egrep -v -f A B

Negro
Blanco
Gris

Conclusiones. Como podemos ver hacer comparación de listas es algo trivial en unix y no necesitamos programar nada en un lenguaje de alto nivel, sabemos también que éstos comandos están hechos para hacer trabajo de datawarehouse por lo que tenemos la garantía de que funcionarán con archivos enormes.

Diario de un friki.

Publicado: febrero 21, 2011 en Uncategorized

Despues de desayunar, me dispongo a trabajar con la computadora. El dia de hoy he decidido que debo continuar estudiando la guía oficial de ethikal hacker.Mientras estudio me doy cuenta que necesito música para enceder mis neuronas, después de haber puesto mis bocinas 5.1 en una disposición adecuada para escuchar los efectos, escucho algunos temas interpretados por Rostropovich, Rodrigo y otros autores. Me doy cuenta que necesito más adrenalina entonces escucho los greatest hits de Enigma. Mientras tanto recuerdo que he  “reorientado”(el aire la movió hacia el sur) mi antena de wifi hacia una nueva ubicación entonces pongo mi buffalo WHR-G54S flasheado con dd-wrt 23sp2 a buscar nuevas redes, mientras capturo algunos paquetes con el aircrack que instalé a través del ipkg. Estoy en el capitulo de password cracking y recuerdo que tenía un software de @stake el lc 5 el cual no pude encontrar en mi reducido compendio de software(solo suma 120GB), lo cual me hizo recorrer mi asidua página de descargas en la cual tampoco lo encontré; debe ser porque es algo viejo, mientras lo busco encuentro una certificación de red-hat la cual no pude resistir el  deseo de descargar; sigo navegando y me doy cuenta que está disponible la película The expendables la cual no tuve la oportunidad de ver en el cine. Mientras dejo encolada la descarga de la película en el jdownloader se me ocurre que puedo descargar el cain y Abel para amenizar la mañana jugueteando un poco con las contraseñas de Windows. Leer el resto de esta entrada »

Ahora si, espero escribir algo útil.  Ya que en español no he encontrado algo parecido me atrevo a decir que efectivamente es útil.

Vengo del mundo de los linux y despues me transporte a los BSD’s (FreeBSD para ser más exacto), en estos mundos es trivial la instalación de la triada php-mysql-apache, sin embargo en Solaris me ha costado un poco de trabajo, sobre todo la parte de php y sus múltiples bibliotecas. Por lo tanto voy a tratar de mostrar, cómo también puede resultar trivial la instalación de la triada a través de coolstack que es un paquete óptimizado para Solaris, y que será de lo más fácil su instalación.

Sin más preámbulos entremos a la línea de comandos.

Primero nos bajamos el coolstack(por su puesto si no de donde lo sacamos).
La página del susodicho software es: http://ftp.sunet.se/sun-freeware/coolstack.html en la cual podremos encontrar otra variedad de software como es perl, squid, ruby,  tomcat y lighttpd, los cuales en éste momento no nos interesan(bueno eso espero).

En realidad la página de donde vamos a descargar es: ftp://ftp.sunet.se/pub/vendor/sun/freeware/CSK/ de aquí necesitamos descargar lo siguiente(ya que no dispongo de la plataforma sparc bajaré los correspondientes para intel).

iniciamos con la descompresión de los paquetes:
#bunzip2 CSKamp_1.3.1_i386.pkg.bz2
#bunzip2 CSKruntime_1.3.1_i386.pkg.bz2
#bunzip2 CSKlibsbundle_1.3.1_i386.pkg.bz2

Pasamos a la parte complicada que es instalar los paquetes (por supuesto que se requiere ser root):
#pkgadd -d CSKruntime_1.3.1_i386.pkg

Leer el resto de esta entrada »

Hola mundo

Publicado: septiembre 16, 2010 en Uncategorized

Hola mundo.

Mucho tiempo he esperado para crear un blog, ya que por diversos motivos no he querido escribir.

Sin embargo la inquietud no ha podido detenerse y hoy por fin ha llegado el dia.

Mi intención es publicar una gran variedad de articulo, desde tecnología hasta pensamientos propios.

Hasta luego y nos vemos en la blogosfera…