Copiando archivos de windows desde unix de 3 patadas.

Publicado: abril 14, 2014 en Uncategorized
Etiquetas:

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

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s