You are on page 1of 16

1.

Introduccin
Este el es SMB COMO. Describe cmo usar el protocolo Session Message Block (SMB), tambin llamado protocolo etB!OS o "anManager, con el "inu#. Este documento es mantenido por Da$id %ood ( dwood@plugged.net.au). Cual&uier a'adido, modi(icacin o correccin puedes en$iarla a&u) para incluirla en la siguiente entrega. El protocolo SMB es usado por Microso(t %indo*s +.,,, - . /0 para compartir discos e impresoras. 1sando el pa&uete de 2erramientas Samba creado por 3ndre* -ridgell, las m4&uinas 1 !5 (inclu.endo "inu#) pueden compartir discos e impresoras con ser$idores %indo*s. 6a. cuatro cosas &ue uno puede 2acer con Samba7 ,. Compartir 8. Compartir +. Compartir 9. Compartir una una una una unidad de "inu# con m4&uinas %indo*s. unidad de %indo*s con m4&uinas "inu#. impresora de "inu# con m4&uinas %indo*s. impresora de %indo*s con m4&uinas "inu#.

-odos estos puntos est4n cubiertos en este documento. E#cusatorio7 "os procedimientos . scripts le (uncionan al autor o se sabe &ue les (unciona a la gente &ue los don. 3lgunas con(iguraciones pueden dar problemas con la in(ormacin &ue a&u) se da. Si te encuentras en tal situacin, puedes mandar un e:mail al autor con sugerencias para me;orar este documento, pero el autor no garanti<a nada. =>u esperabas? El autor tambin es un e#perto, despus de todo...

2. Ms Informacin
Este COMO intenta e#plicar la con(iguracin de ser$icios SMB b4sicos de (ic2eros e impresoras en una m4&uina "inu#. Samba es un pa&uete mu. comple;o . completo. o deber)a 2aber ra<n para duplicar toda la documentacin de Samba a&u). @ara ma.or in(ormacin, por (a$or lee alguno de estos documentos7

"a documentacin de Samba, disponible en el pa&uete de distribucin del Samba. El pa&uete est4 disponible en7 ftp://nimbus.anu.edu.au/pub/tridge/samba/ El COMO A!mprimiendo en "inu#A. ("inu# @rinting 6O%-O) El Mini:6O%-O @rint8%in.

3. Instalacin
"a Bltima $ersin del cdigo de Samba est4 disponible en7 ftp://nimbus.anu.edu.au/pub/tridge/samba/ De todas maneras, si 2as instalado la distribucin Ced6at de "inu#, tienes la opcin de instalarlo como pa&uete. 3lgunas otras distribuciones tambin inclu.en los e;ecutables de Samba. Se re&uieren los dos demonios siguientes para el pa&uete Samba. Se suelen instalar en /usr/sbin . se pueden e;ecutar tanto desde los scripts de arran&ue del sistema como desde inetd. 3lgunos scripts de e;emplo los puedes $er en E;ecutando los demonios.

smbd (El demonio de SMB) nmbd (@ro$ee un nameser$er de

etB!OS para soporte de clientes)

6abitualmente, se instalan en /usr/bin los siguientes e;ecutables de Samba, aun&ue la locali<acin (como de costumbre) es opcional.

smbclient (1n cliente SMB para ma&uinas 1 !5) smbprint (1n script para imprimir a una impresora en un ser$idor SMB) smbprint.sysv (Como el de encima, pero para m4&uinas 1 !5 SDC9) smbstatus ("ista de las cone#iones SMB en marc2a en el ser$idor local) smbrun (1n script EcolaE para (acilitar la e;ecucin de aplicaciones en ser$idores )

3dicionalmente, se inclu.e en este COMO un script llamado EprintE, &ue sir$e como un Btil (ront end para el script smbprint. El pa&uete Samba es sencillo de instalar. Simplemente consigue el cdigo (uente del ser$idor &ue nombramos antes, . lee el (ic2ero README de la distribucin. 6a. tambin un (ic2ero llamado docs/I !"A##.t$t en la distribucin &ue te da un sencillo con;unto de instrucciones paso a paso. Siguiendo con la instalacin, pon los demonios en /usr/sbin . los e;ecutables en /usr/bin. !nstala las p4ginas del manual en /usr/local/man. Cuando compiles el pa&uete Samba, deber)as especi(icar en el Ma%efile la locali<acin del (ic2ero de con(iguracin, smb.conf. Feneralmente deber)a estar en /etc, pero puedes ponerlo donde &uieras. 3 estas alturas, presumimos &ue especi(icaste la locali<acin del (ic2ero de con(iguracin como /etc/smb.conf, el (ic2ero de registro como /var/log/samba&log.'m . el directorio de blo&ueo como /var/loc%/samba !nstala el (ic2ero de con(iguracin, smb.conf. De al directorio donde se compil el Samba. Mira en el directorio e$amples/simple . lee el (ic2ero README. En ese directorio encontrar4s el (ic2ero smb.conf. Cpialo en /etc. G-E C1!D3DOH Si tienes una distribucin de "inu# &ue tiene el Samba instalado .a, puede &ue .a tengas un (ic2ero de con(iguracin en /etc. @robablemente deber)as usar el antiguo. Si no &uieres &ue tu con(iguracin est en /etc, ponla donde &uieras . luego pon un enlace simblico en /etc7
ln &s /pat(/to/smb.conf /etc/smb.conf

4. Ejecutando los demonios


"os dos demonios de SMB son /usr/bin/smbd . /usr/sbin/nmbd. @uedes e;ecutar los demonios de Samba desde inetd o como procesos independientes . Si est4s con(igurando un ser$idor de (ic2eros permanente, deber)an e;ecutarse desde inetd para &ue sean ree;ecutados si EmuerenE. Si solo &uieres usar los ser$icios SMB de $e< en cuando o como a.uda a la administracin del sistema, puedes e;ecutarlos con un script en /etc/rc.d/init.d o incluso a mano cuando los necesites. @ara e;ecutar los demonios desde inetd, pon las siguientes l)neas en el (ic2ero de con(iguracin de inetd, /etc/inetd.conf7
) !ervicios !AM*A et*I+! ,para compartici-n de fic(eros e impresoras en ./0 netbios&ssn stream tcp nowait root /usr/sbin/smbd smbd netbios&ns dgram udp wait root /usr/sbin/nmbd nmbd

Entonces ree;ecuta inetd con el siguiente comando7


%ill &12. 3

@ara e;ecutarlos desde los scripts de inicio del sistema, pon las siguientes l)neas en /etc/rc.d/init.d/smb . 2a<le un enlace simblico con los (ic2eros indicados en los comentarios7
)4/bin/s( ) ) /etc/rc.d/init.d/smb & comien5a y termina los servicios !M*. ) ) !e deben crear los siguientes fic(eros como enlaces simbolicos a este fic(ero: ) symlin%s: /etc/rc.d/rc3.d/678smb ,"ermina los servicios !M* al cerrar el sistema0 ) /etc/rc.d/rc7.d/!93smb ,/omien5a los servicios !M* en modo multiusuario0 ) /etc/rc.d/rc:.d/678smb ,"ermina los servicios !M* al (acer un reboot0 ) ) #ibreria de funciones . /etc/rc.d/init.d/functions ) /onfiguracion de red . /etc/sysconfig/networ% ) Asegurarse ;ue la red esta a punto < => E"?+R6I @A B CnoC D EE e$it F ) /omprobar como fuimos llamados case C=3C in empe5ar0 ec(o &n C.oniendo en marc(a los servicios !M*: C daemon smbd &D daemon nmbd &D ec(o touc( /var/loc%/subsys/smb

GG parar0 ec(o &n C"erminando los servicios !M*: C %illproc smbd %illproc nmbd rm &f /var/loc%/subsys/smb ec(o CC GG H0 ec(o CModo de uso: smb >empe5arIpararAC e$it 3 esac

5. Configuracin General (/etc/smb.conf


"a con(iguracin de Samba en un "inu# (u otra m4&uina 1 !5) es controlada por un solo (ic2ero, /etc/smb.conf. Este (ic2ero determina &u recursos del sistema &uieres compartir con el mundo e#terior . &ue restricciones deseas poner en ellos. Como las siguientes secciones Edireccionar4nE la comparticin de unidades e impresoras de "inu# con m4&uinas %indo*s, el (ic2ero smb.conf mostrado en esta seccin es lo m4s simple posible, solo para propsitos introductorios. o te preocupes por los detalles, aBn. Otras secciones m4s adelante introducir4n los conceptos m4s importantes. Cada seccin del (ic2ero empie<a con una cabecera como <globalDJ <impresorasD, etc. "a seccin <globalD de(ine unas pocas $ariables &ue Samba usar4 para de(inir la comparticin de todos los recursos. "a seccin <(omesD permite a los usuarios remotos acceder a sus respecti$os directorios principales en la m4&uina "inu# local (cada uno al su.o nada m4s). Esto es, si un usuario de %indo*s intenta conectar a este recurso desde su m4&uina %indo*s, ser4 conectado a su directorio personal. 3 tener en cuenta &ue para 2acer esto, tiene &ue tener una cuenta en la m4&uina "inu#. I:) El (ic2ero smb.conf &ue $iene deba;o como e;emplo permite a los usuarios remotos acceder a su directorio principal en la m4&uina local . escribir en un directorio temporal. @ara &ue un usuario de %indo*s $ea estos recursos, la m4&uina "inu# debe estar en la red local. Entonces el usuario simplemente conecta una unidad de red desde el E#plorador de %indo*s o el %indo*s Jile Manager. J);ate &ue en las siguientes secciones, se dar4n entradas adicionales a este (ic2ero para permitir la comparticin de m4s recursos.

G G G G G

/etc/smb.conf Reinicia el servidor cada ve5 ;ue (agas cambios a este fic(eroJ eK: /etc/rc.d/init.d/smb parar /etc/rc.d/init.d/smb empe5ar

<globalD G Luita el comentario a la siguiente linea si ;uieres cuentas de invitado G guest account B nobody log file B /var/log/samba&log.'m loc% directory B /var/loc%/samba s(are modes B yes <(omesD comment B Directorios principales browseable B no read only B no create mode B FM8F <tmpD comment B Espacio de fic(eros temporales pat( B /tmp read only B no public B yes

!. Com"artiendo #na #nidad $inu% Con M&uinas 'indo(s


Como se muestra en el (ic2ero smb.conf anterior, compartir una unidad "inu# con usuarios %indo*s es (4cil. De todas maneras, como todo lo dem4s con Samba, puedes tener las cosas M1K controladas. 3&u) tienes unos pocos e;emplos7 @ara compartir un directorio con todo el mundo, crea una copia de la seccin <tmpD a'adiendo algo como esto al smb.conf7
<publicD comment B /osas publicas pat( B /(ome/public public B yes writable B yes printable B yes

@ara &ue este directorio lo pueda leer todo el mundo, pero &ue slo lo puedan cambiar gente del grupo ElaboralesE, modi(ica la entrada de esta manera7
<publicD comment B /osas publicas pat( B /(ome/public public B yes writable B yes printable B no write list B @laborales

@ara aprender otros tru&uillos con &ue ;ugar con las unidades compartidas, mira la documentacin de Samba o las p4ginas del man.

). Com"artiendo #na #nidad 'indo(s Con M&uinas $inu%


Se inclu.e un programa cliente de SMB para m4&uinas 1 !5 con la distribucin de Samba. @ro$ee un inter(a< estilo ftp para la l)nea de comandos. @uedes usar esta utilidad para trans(erir (ic2eros entre un Eser$idorE %indo*s . un cliente uni#. @ara $er &u recursos est4n disponibles en un 2ost dado, e;ecuta7
/usr/sbin/smbclient &# (ost

donde E2ostE es el nombre de la m4&uina &ue &uieres E$erE. Esto de$ol$er4 un lista de nombres de Eser$iciosE ::esto es, nombres de unidades o impresoras &ue puede compartir contigo::. 3 menos &ue el ser$idor SMB no tenga la seguridad con(igurada, te preguntar4 por una cla$e. Dale la cla$e de la cuenta de Ein$itadosE o de tu cuenta personal en esa m4&uina. @or e;emplo7
smbclient &# 5immerman

"a salida de este comando deber)a ser algo parecido a esto7


!erver time is !at Aug 3F 38:8N:OM 399: "ime5one is 2"/P3F.F .assword: DomainB<?+R6@R+2.D +!B<?indows " 7.83D !erverB< " #A

Manager 7.83D

!erverB<QIMMERMA D 2serB<D ?or%groupB<?+R6@R+2.D DomainB<D !(arename &&&&&&&&& ADMI = public /= I./= +Reilly print= "ype &&&& Dis% Dis% Dis% I./ .rinter Dis% /omment &&&&&&& Remote Admin .ublic Default s(are Remote I./ +Reilly .rinter Drivers

"(is mac(ine (as a browse list: !erver &&&&&&&&& 1+..ER 6ER I@A #+RE#A/E RI"/1IE QIMMERMA /omment &&&&&&& !amba 3.9.38pN !amba 3.9.38pN !amba 3.9.38pN !amba 3.9.38pN

"a lista muestra otros ser$idores SMB con recursos para compartir con la red. @ara usar el cliente, e;ecuta7
/usr/sbin/smbclient servicio SpasswordT

donde Eser$icioE es una m4&uina . un ser$icio. @or e;emplo, si est4s intentando entrar en un directorio &ue 2a sido compartido como EpublicE en una m4&uina llamada 5immerman, el ser$icio deber)a llamarse LL<immermanLpublic. De todas maneras, debido a restricciones del s2ell, necesitar4s poner las barras in$ertidas con secuencias de escape, por lo &ue al (inal saldr4 algo parecido a esto7
/usr/sbin/smbclient UUUU5immermanUUpublic miclave

donde EmiclaveE es una cadena literal con tu pass*ord. Entonces te aparecer4 el EpromptE del smbclient7
!erver time is !at Aug 3F 38:8N:VV 399: "ime5one is 2"/P3F.F DomainB<?+R6@R+2.D +!B<?indows " 7.83D !erverB< " #A smb: UT Manager 7.83D

Escribe E2E para obtener una a.uda de como usar el cliente7


smb: UT ( ls get more md translate cancel newer setmode smb: UT dir mget mas% rmdir lowercase stat arc(ive (elp lcd put del rd print ;uit tar W cd mput rm prompt printmode ; bloc%si5e 4 pwd rename m%dir recurse ;ueue e$it tarmode

Si sabes usar el (tp, no deber)as necesitar las p4ginas del man del smbclient.

*. Com"artiendo #na Im"resora $inu% Con M&uinas 'indo(s


@ara compartir una impresora "inu# con m4&uinas %indo*s, necesitas asegurarte de &ue la impresora est4 preparada para traba;ar ba;o "inu#. Si puedes imprimir desde "inu#, preparar una EcomparticinE SMB de la impresora es autom4tico. M)rate el COMO !mprimir (@rinting 6O%-O) para poner a punto la impresora

con "inu#. Como el autor usa una impresora conectada a una m4&uina %indo*s -, esta seccin no deber)a ser $ista como algo de(initi$o, sino como mera sugerencia. Cual&uiera &ue tenga detalles &ue compartir con el autor, por (a$or, &ue los mande a dwood@plugged.net.au para &ue esta seccin pueda ser completada. 3'ade la con(iguracin de la impresora a tu smb.conf7
<globalD printing B bsd printcap name B /etc/printcap load printers B yes log file B /var/log/samba&log.'m loc% directory B /var/loc%/samba <printersD comment B "odas las impresoras security B server pat( B /var/spool/lpd/lp browseable B no printable B yes public B yes writable B no create mode B FMFF <lKetD security B server pat( B /var/spool/lpd/lp printer name B lp writable B yes public B yes printable B yes print command B lpr &r &( &. 'p 's

G3segBrate de &ue el Epat2E de la impresora (en este caso ba;o <lKetD) se corresponde al directorio de EspoolE en /etc/printcapH O-37 6a. algunos problemas compartiendo impresoras conectadas a 1 !5 con m4&uinas %indo*s - usando Samba. 1n problema es &ue - E$eaE la impresora compartida correctamente. @ara conseguirlo, m)rate las notas en la distribucin de Samba en el (ic2ero docs/?in ".t$t. El otro $a con problemas con las cla$es. M)rate los comentarios en ese mismo (ic2ero para conseguir una molesta ganancia de conocimientos . (allos (;e;e;e) para arreglar el problema.

+. Com"artiendo #na Im"resora 'indo(s Con M&uinas $inu%


@ara compartir una impresora en una m4&uina %indo*s, debes 2acer lo siguiente7 a) Debes tener las entradas adecuadas en /etc/printcap . deben

corresponderse a la estructura de directorios local (el directorio de spool, etc) b) Debes tener el script /usr/bin/smbprint. Diene con las (uentes de Samba, pero no con la distribucin de e;ecutables del Samba. M4s aba;o comentamos una copia ligeramente modi(icada. c) Si &uieres con$ertir (ic2eros 3SC!! a @ostScript, debes tener el EnenscriptE o su e&ui$alente. nenscript es un con$ersor de @ostScript . 2abitualmente est4 instalado en /usr/bin. d) @uedes desear &ue las impresiones de Samba sean m4s sencillas teniendo un (ront end (4cil de usar. M4s aba;o tienes un sencillo script en perl para mane;ar 3SC!!, @ostScript o @ostScript generado. "a entrada para /etc/printcap &ue tenemos deba;o es para una impresora 6@ 0M@ en un 2ost %indo*s -. "as entradas son las siguientes7
cm lp sd af m$ if & & & & & & comentario nombre del dispositivo a abrir para salida el directorio de spool de la impresora ,en la mX;uina local0 el fic(ero de cuentas el tamano ma$imo del fic(ero ,cero es ilimitado0 nombre del fic(ero de entrada ,script0

@ara m4s in(ormacin, lee el COMO !mprimir (@rinting 6O%-O) o la p4gina del man de printcap.
) /etc/printcap ) ) //5immerman/oreilly via smbprint ) lp:U :cmB1. 8M. .ost!cript +Reilly en 5immerman:U :lpB/dev/lp3:U :sdB/var/spool/lpd/lp:U :afB/var/spool/lpd/lp/acct:U :m$)F:U :ifB/usr/bin/smbprint:

3segBrate de &ue los directorios de spool . cuentas e#iste . se puede escribir en ellos. 3segura tambin &ue la l)nea EifE tiene el pat2 adecuado para el script smbprint (&ue damos deba;o) . &ue apunta al dispositi$o adecuado. (el (ic2ero /dev especial). "o siguiente es el propio script smbprint. ormalmente est4 en /usr/bin . es atribuible a 3ndre* -ridgell, la persona &ue cre el Samba (&ue .o sepa). Diene con la distribucin de las (uentes del Samba, pero est4 ausente de algunas distribuciones de e;ecutables, por lo &ue lo 2e recreado a&u). -e podr)a interesar mirarlo con cuidado. 6a. algunas pe&ue'as alteraciones &ue 2an demostrado ser Btiles.

)4/bin/s( &$ ) Este script es un filtro de entrada para la impresion de printcap en ) una ma;uina uni$. 2sa el programa smbclient para imprimir un fic(ero ) en el servidor y servicio basados en smb especificados. ) .or eKemploJ puedes tener una entrada en printcap como esta ) ) smb:lpB/dev/null:sdB/usr/spool/smb:s(:ifB/usr/local/samba/smbprint ) ) ;ue creara una impresora uni$ llamada CsmbC ;ue imprimira a traves de ) este script. ecesitarras crear el directorio de spool /usr/spool/smb ) con los permisos y pertenencias apropiados para tu sistema. ) A(ora preparalos con el servidor y servicio en ;ue ;uieras imprimir ) En este eKemplo tengo un ./ ?f?g llamado ClaplandC ;ue tiene una ) impresora e$portada llamada CprinterC sin password. ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) !cript alterado por (amilton@ecn5.co.n5 ,Mic(ael 1amilton0 para ;ue servicioJ servidor y clave puedan ser leidos desde un fic(ero /usr/var/spool/lpd/.RI " AME/.config .ara ;ue esto funcione la entrada en /etc/printcap debe incluir un fic(ero de cuentas ,afB...0: cdcolour:U :cmB/D I*M /olorKet on :t(:U :sdB/var/spool/lpd/cdcolour:U :afB/var/spool/lpd/cdcolour/acct:U :ifB/usr/local/etc/smbprint:U :m$BF:U :lpB/dev/null: El fic(ero /usr/var/spool/lpd/.RI " AME/.config deberia contener: servidorB!ERRID+RY./ servicioB +M*REYIM. claveBCclaveC EK. servidorB.A2#!Y./ servicioB/ZE"Y7M3 claveBCC

) ) [ic(ero de registro para correccionesJ cambiar a /dev/null si se ;uiere ) fic(regB/tmp/smb&print.log ) fic(regB/dev/null ) ) El ultimo parametro para el filtro es el nombre del fic(ero de ) cuentas ) dirYspoolB/var/spool/lpd/lp fic(YconfigB=dirYspool/.config

) Deberia leer las siguientes variables activadas en el fic(ero de ) configuracion: ) servidor ) servicio ) clave ) usuario eval \cat =fic(Yconfig\ ) ) Algo de ayuda en la correccion de errores. /ambia el TT por T si ) ;uieres salvar algo de espacio. ) ec(o Cservidor =servidorJ servicio =servicioC TT =fic(reg , ) +"A: .uede ;ue ;uieras anadir la linea \ec(o translate] si ;uieres /R/#[ ) automatico cuando imprimes. ec(o translate ec(o Cprint &C cat 0 I /usr/bin/smbclient CUUUU=servidorUU=servicioC =clave &2 =usuario & &. TT =fic(reg

"a ma.or)a de las distribuciones de "inu# $ienen con el nenscript para con$ertir los documentos 3SC!! a @ostscript. El siguiente script perl 2ace la $ida m4s (4cil dando un inter(a< sencillo para &ue linu# imprima a tra$s de smbprint.
[orma de uso: print <&aIcIpD SnombreYfic(eroT &a imprime SnombreYfic(eroT como A!/II &c imprime SnombreYfic(eroT formateado como codigo fuente &p imprime SnombreYfic(eroT como .ostscript !i no se pasa ningun parametroJ print intenta averiguar el tipo de fic(ero e imprimirlo adecuadamente.

smbprint tiende a truncar las l)neas demasiado largas cuando imprime (ic2eros 3SC!!. Este rompe las l)neas largas donde 2a.a un espacio en blanco (en lugar de en mitad de una palabra), si es posible. El (ormateado de cdigo (uente se 2ace con nenscript. Coge un (ic2ero 3SC!! . lo (ormatea en 8 columnas con una cabecera muE mona ((ec2a, nombre de (ic2ero , etc). 3dem4s enumera las l)neas. 1s4ndolo como e;emplo, se pueden lograr otros tipos de (ormateado. "os documentos @ostscript tambin se imprimen correctamente, por lo &ue pasan directamente.
)4/usr/bin/perl

) !cript: print ) Autores: *rad Mars(allJ David ?ood ) .lugged In /ommunications ) [ec(a: 9:FNFN ) /ambios: Ricardo Zavier /ardenes Medina ) Ra5on: "raduccion de comentarios y codigo a espanol para ) mayor comprension. ) [ec(a: 9:33F9 ,!ab 9 de oviembre de 399:0 ) ) !cript para imprimir a +reilly ;ue esta actualmente en 5immerman. ) .roposito: "oma fic(eros de varios tipos como parametros y ) los procesa apropiadamente para mandarlos al script de impresion de !amba. ) ) "ipos soportados actualmente: ) ) A!/II & Asegura ;ue las lineas con mas de =largoYlinea caracteres seran ) divididas aprovec(ando los espacios en blanco. ) .ost!cript & o (ace nada. ) /odigo & #o formatea en .ost!cript ,usando nenscript0 para una meKor ) presentacion ,fuenteJ etc...0. ) ) Ma$ima longitud permitida para cada linea de te$to A!/II. =largoYlinea B M:G ) .at( y nombre del script ]print] de !amba. =progYprint B C/usr/bin/smbprintCG ) .at( y nombre del nenscript ,el convertidor A!/II&&T.ost!cript0 =nenscript B C/usr/bin/nenscriptCG unless , &f die A unless , &f die A =progYprint 0 > C^ o encuentro =progYprint4CG =nenscript 0 > C^ o encuentro =nenscript4CG

EInterp#in/om,@AR@R0G ) D*@ print CEl tipo de fic(ero es =tipofic(UnCG if ,=tipofic( e; CA!/IIC0 > ERompe,=largoYlinea0G A elsif ,=tipofic( e; CcodigoC0 > E[ormatea/odigoG A elsif ,=tipofic( e; CpostscriptC0 > E/rea"ablaG A else > print C#o siento..tipo de fic(ero desconocido.UnCG e$it FG A ) Enviar el array a smbprint open,IM.RE!+RAJ CI=progYprintC0 II die C^ o puedo abrir =progYprint: =4UnCG foreac( =linea ,@newlines0 > print IM.RE!+RA =lineaG A

) Enviar un avance de linea e$tra en caso de ;ue el fic(ero tenga una ) ultima linea incompleta. print IM.RE!+RA CUnCG close,IM.RE!+RA0G print C"erminadoUnCG e$it FG ) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ) ) "odo lo de debaKo es una subrutina ) ) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ) sub Interp#in/om > ) Interpreta la linea de comandoJ averiguando el tipo de fic(ero ) "oma =par y =fic( como parametro ,si e$iste0 y nombre del ) fic(ero. if ,=)Y S F0 > E[orma2soG A ) D*@ ) foreac( =elemento ,@Y0 > ) print CH=elementoH UnCG ) A =par B s(ift,@Y0G if ,=par B_ /U&./0 > =com B =parG ) D*@ ) print CUEncontrado =com.UnCG =fic( B s(ift,@Y0G A else > =fic( B =parG A ) Defining t(e file type unless ,=com0 > ) o tenemos parXmetro if ,=fic( B_ /U.ps=/0 > =tipofic( B CpostscriptCG A elsif ,=fic( B_ /U.Kava=IU.c=IU.(=IU.pl=IU.s(=I U.cs(=IU.mV=IU.inc=IU.(tml=IU.(tm=/0 > =tipofic( B CcodigoCG A else > =tipofic( B CA!/IICG A ) .rocesa =fic( buscando el tipo y devuelve =tipofic( A else > ) "enemos el tipo en =par if ,=com B_ /`&p=/0 > =tipofic( B CpostscriptCG A elsif ,=com B_ /`&c=/0 > =tipofic( B CcodigoCG A elsif ,=com B_ /`&a=/0 > =tipofic( B CA!/IIC A A

sub [orma2so > print C [orma de uso: print <&aIcIpD SnombreYfic(eroT &a imprime SnombreYfic(eroT como A!/II &c imprime SnombreYfic(eroT formateado como codigo fuente &p imprime SnombreYfic(eroT como .ostscript !i no se pasa ningun parametroJ print intenta averiguar el tipo de fic(ero e imprimirlo adecuadamente.Un CG e$it,F0G A sub Rompe ) es ) ) > /rea una tabla con las lineas del fic(eroJ donde cada linea menor ;ue el numero de caracteres especificadoJ y las rompe solo en los espacios en blanco

) "oma el numero de caracteres a los ;ue limitar la linea. =limite B pop,@Y0G ) D*@ )print CEntrando en la subrutina RompeUnCG )print CEl limite de caracteres es =limitUnCG ) #ee en el fic(eroJ lo interpreta y pone en la tabla. open,[I/1ER+J CS=fic(C0 II die C^ o puedo abrir =fic(: =4UnCG w(ile,S[I/1ER+T0 > =linea B =YG ) D*@ )print C#a linea es:Un=lineaUnCG ) Rompe la linea si se pasa del limite. w(ile , lengt(,=linea0 T =limite 0 > ) D*@ )print CRompiendo...CG ) "oma los primeros =limite P3 caracteres. =cac(o B substr,=lineaJFJ=limite P30G ) D*@ )print C#a linea parcial es:Un=cac(oUnCG espacio. ) Mira a ver si el ultimo caracter es un =ultimoYcar B substr,=cac(oJ&3J 30G if , C C e; =ultimoYcar 0 > ) !i lo esJ imprime el resto. ) D*@ )print CEl ultimo caracter era un espacioUnCG substr,=lineaJFJ=limite P 30 B CCG substr,=cac(oJ&3J30 B CCG pus(,@newlinesJC=cac(oUnC0G A else > ) !i no lo esJ busca el ultimo espacio en

la ) sub&linea e imprime (asta alli. ) D*@ )print CEl ultimo caracter no era un espacioUnCG =limite ) *orra el ultimo caracter ;ue pasa de substr,=cac(oJ&3J30 B CCG ) Da la vuelta a la linea para (acer mas ) sencillo buscar el espacio. =cac(oreves B reverse,=cac(o0G =indice B inde$,=revpartJC C0G if , =indice T F 0 > substr,=lineaJFJ=limite&=indice0 B CCG pus(,@newlinesJsubstr,=cac(oJFJ=limite& =indice0 . CUnC0G A else > ) o (ay espacios en la lineaJ por lo ) se imprime (asta =limite. substr,=lineaJFJ=limite0 B CCG pus(,@newlinesJsubstr,=cac(oJFJ=limite0 . CUnC0G

;ue

A A

A close,[I/1ER+0G

A pus(,@newlinesJ=linea0G

sub [ormatea/odigo > ) #lama a la subrutina Rompe cuando filtra a traves de nenscript ERompe,=largoYlinea0G ) Manda los resultados a traves de nenscript para crear un ) fic(ero .ostscript ;ue de una forma decente a nuestro codigo ) fuente para imprimirlo ,fuente /ourierJ numero de lineasJ ) E imprime todo esto a un fic(ero temporal. =fic(tmp B C/tmp/nenscript==CG open,[I/1ER+J CI=nenscript &O@ &i=fic( & &p=fic(tmpfic( &rC0 die C^ o pude abrir nenscript: =4UnCG foreac( =linea ,@newlines0 > print [I/1ER+ =lineaG A close,[I/1ER+0G ) Ruelca el fic(ero temporal en una tabla para ;ue pueda ) ser pasado al script de impresion de !amba. @newlines B ,CC0G open,[I/1ER+J CS=fic(tmpC0 II die C^ o puedo abrir =fic(tmp: =4UnCG w(ile,S[I/1ER+T0 > pus(,@newlinesJ=Y0G A close,[I/1ER+0G

...0.

II

system,Crm =fic(tmpC0G A sub /rea"abla > ) /rear la tabla para postscript open,[I/1ER+J CS=fic(C0 II die C^ o puedo abrir =fic(: =4UnCG w(ile,S[I/1ER+T0 > pus(,@newlinesJ=Y0G A close,[I/1ER+0G A

You might also like