Grupo Linuxero del Bajío

Recordando viejos comandos: uuencode y uudecode

Juan Caballero

Hace unos días solicite el código fuente de un programa, que si bien no es GPL es gratuito para fines académicos, recibí un par correos después de una semana, el primero eran las instrucciones de instalación, el segundo era el código pero insertado a la manera antigua: uuencode/uudecode. ¡Que reliquia!

Esto me trajo buenas memorias de cuando empezaba en Unix y Linux y lo más probable es que muchos de ustedes desconozcan o simplemente han olvidado está herramienta, así que por eso le dedico esta nota al viejo comando uuencode y su par uudecode.

Primero, la necesidad de uuencode nace a porque en el comienzo del correo electrónico lo único que se podía mandar era puro ASCII, nada de binarios, pero cuando se requería tener un archivo era necesario un acceso principalmente por FTP o de plano trabajar en línea usando Telnet. A alguien se le ocurrió insertar la información en el mismo mensaje pero para ello necesitaba que los caracteres fueran compatibles con ASCII en todo momento.

Para ello se ocupa una codificación en Base 64, partiendo de tomar cada 3 bytes (24 bits) y convertirlos en caracteres correspondientes usando 4 bloques de 6 bits, así tenemos para representar los bloques del 0 al 63 en ASCII sencillo.

El comando era muy sencillo de usar, supongamos que tenemos un archivo (prueba.tar.gz) y queremos mandarlo por correo a la vieja usanza, hacemos:

uuencode prueba.tar.gz prueba.tar.gz > texto.uu

Esto nos genera un archivo de texto llamado texto.uu con el contenido codificado de prueba.tar.gz y el nombre de archivo de prueba.tar.gz (por eso esta dos veces).

Este archivo tiene como contenido: begin 664 prueba.tar.gz (muchos caracteres raros a 60 por línea) \ end`

De aquí pueden cortar y pegar el texto generado en el cuerpo del mensaje y mandarlo, para recuperarlo es necesario uudecode, para ello guardamos el mensaje como texto y eliminamos cualquier cosa fuera de las marcas begin y end, y ejecutamos:

uudecode mensaje.uu

El comando debe generar el archivo especificado después de base 64, pero si se desea crear otro con nuevo nombre se usa la opción -o:

uudecode mensaje.uu -o prueba2.tar.gz

Ahora bien, este comando es obsoleto ante MIME y otras formas de agregar archivos y lo más probable que el filtro anti-spam lo mande a la basura, pero en su momento fue lo mejor para mandar archivos.

Les dejo este texto para que lo vean en acción:

begin 664 texto
M4F5C;W)D86YD;R!V:65J;W,@8V]M86YD;W,Z('5U96YC;V1E('D@=75D96-O
M9&4*"DAA8V4@=6YO<R!DPZUA<R!S;VQI8VET92!E;"!CP[-D:6=O(&9U96YT
M92!D92!U;B!P<F]G<F%M82P@<75E('-I(&)I96X@;F\@97,@1U!,(&5S(&=R
M871U:71O('!A<F$@9FEN97,@86/#H61E;6EC;W,L(')E8VEBPZT@=6X@<&%R
M(&-O<G)E;W,@9&5S<'7#J7,@9&4@=6YA('-E;6%N82P@96P@<')I;65R;R!E
M<F%N(x&QA<R!I;G1R=6-C:6]N97,@9&4@:6YS=&%L86-IP[-N+"!E;"!S96=U
M;F1O(&5R82!E;"!CP[-D:6=O('!E<F\@:6YS97)T861O(&$@;&$@;6%N97)A
M(&%N=&EG=6$Z('5U96YC;V1E+W5U9&5C;V1E+B#"H5%U92!R96QI<75I82$*
M"D5S=&\@;64@=')A:F\@8G5E;F%S(&UE;6]R:6%S(&1E(&-U86YD;R!E;7!E
M>F%B82!E;B!5;FEX('D@3&EN=7@@>2!L;R!MPZ%S('!R;V)A8FQE(&5S('%U
M92!M=6-H;W,@9&4@=7-T961E<R!D97-C;VYO>F-A;B!O('-I;7!L96UE;G1E
M(&AA;B!O;'9I9&%D;R!E<W3#H2!H97)R86UI96YT82P@87/#K2!Q=64@<&]R
M(&5S;R!L92!D961I8V\@97-T82!N;W1A(&%L('9I96IO(&-O;6%N9&\@=75E
M;F-O9&4@>2!S=2!P87(@=75D96-O9&4N"@I0<FEM97)O+"!L82!N96-E<VED
M860@9&4@=75E;F-O9&4@;F%C92!A('!O<G%U92!E;B!E;"!C;VUI96YZ;R!D
M96P@8V]R<F5O(&5L96-T<L.S;FEC;R!L;R##NFYI8V\@<75E('-E('!O9&EA
M(&UA;F1A<B!E<F$@<'5R;R!!4T-)22P@;F%D82!D92!B:6YA<FEO<RP@<&5R
M;R!C=6%N9&\@<V4@<F5Q=65R:6$@=&5N97(@=6X@87)C:&EV;R!E<F$@;F5C
M97-A<FEO('5N(&%C8V5S;R!P<FEN8VEP86QM96YT92!P;W(@1E10(&\@9&4@
M<&QA;F\@=')A8F%J87(@96X@;,.M;F5A('5S86YD;R!496QN970N($$@86QG
M=6EE;B!S92!L92!O8W5R<FEO(&EN<V5R=&%R(&QA(&EN9F]R;6%C:<.S;B!E
M;B!E;"!M:7-M;R!M96YS86IE('!E<F\@<&%R82!E;&QO(&YE8V5S:71A8F$@
M<75E(&QO<R!C87)A8W1E<F5S(&9U97)A;B!C;VUP871I8FQE<R!C;VX@05-#
M24D@96X@=&]D;R!M;VUE;G1O+@H*4&%R82!E;&QO('-E(&]C=7!A('5N82!C
M;V1I9FEC86-IP[-N(&5N($)A<V4@-C0L('!A<G1I96YD;R!D92!T;VUA<B!C
M861A(#,@8GET97,@*#(T(&)I=&5S*2!Y(&-O;G9E<G1I<FQO<R!E;B!C87+#
MH6-T97)E<R!C;W)R97-P;VYD:65N=&5S('5S86YD;R`T(&)L;W%U97,@9&4@
M-B!B:71E<RP@87/#K2!T96YE;6]S('!A<F$@<F5P<F5S96YT87(@;&]S(&)L
M;W%U97,@9&5L(#`@86P@-C,@96X@05-#24D@<V5N8VEL;&\N"@I%;"!C;VUA
M;F1O(&5R82!M=7D@<V5N8VEL;&\@9&4@=7-A<BP@<W5P;VYG86UO<R!Q=64@
M=&5N96UO<R!U;B!A<F-H:79O("AP<G5E8F$N=&%R+F=Z*2!Y('%U97)E;6]S
M(&UA;F1A<FQO('!O<B!C;W)R96\@82!L82!V:65J82!U<V%N>F$L(&AA8V5M
M;W,Z"@HD('5U96YC;V1E('!R=65B82YT87(N9WH@<')U96)A+G1A<BYG>B`^
M('1E>'1O+G5U"@I%<W1O(&YO<R!G96YE<F$@=6X@87)C:&EV;R!D92!T97AT
M;R!L;&%M861O(")T97AT;RYU=2(@8V]N(&5L(&-O;G1E;FED;R!C;V1I9FEC
M861O(&1E('!R=65B82YT87(N9WH@>2!E;"!N;VUB<F4@9&4@87)C:&EV;R!D
M92!P<G5E8F$N=&%R+F=Z("AP;W(@97-O(&5S=&$@9&]S('9E8V5S*2X*"D5S
M=&4@87)C:&EV;R!T:65N92!C;VUO(&-O;G1E;FED;SH*8F5G:6X@-C8T('!R
M=65B82YT87(N9WH**&UU8VAO<R!C87)A8W1E<F5S(')A<F]S(&$@-C`@<&]R
M(&S#K6YE82D*8`IE;F0*"D1E(&%Q=<.M('!U961E;B!C;W)T87(@>2!P96=A
M<B!E;"!T97AT;R!G96YE<F%D;R!E;B!E;"!C=65R<&\@9&5L(&UE;G-A:F4@
M>2!M86YD87)L;RP@<&%R82!R96-U<&5R87)L;R!E<R!N96-E<V%R:6\@=75D
M96-O9&4L('!A<F$@96QL;R!G=6%R9&%M;W,@96P@;65N<V%J92!C;VUO('1E
M>'1O('D@96QI;6EN86UO<R!C=6%L<75I97(@8V]S82!F=65R82!D92!L87,@
M;6%R8V%S(&)E9VEN('D@96YD+"!Y(&5J96-U=&%M;W,Z"@HD('5U9&5C;V1E
M(&UE;G-A:F4N=74*"D5L(&-O;6%N9&\@9&5B92!G96YE<F%R(&5L(&%R8VAI
M=F\@97-P96-I9FEC861O(&1E<W!UPZES(&1E(&)A<V4@-C8T+"!P97)O('-I
M('-E(&1E<V5A(&-R96%R(&]T<F\@8V]N(&YU979O(&YO;6)R92!S92!U<V$@
M;&$@;W!C:<.S;B`M;R`Z"@HD('5U9&5C;V1E(&UE;G-A:F4N=74@+6\@<')U
M96)A,BYT87(N9WH*"D%H;W)A(&)I96XL(&5S=&4@8V]M86YD;R!E<R!O8G-O
M;&5T;R!A;G1E($U)344@>2!O=')A<R!F;W)M87,@9&4@86=R96=A<B!A<F-H
M:79O<R!Y(&QO(&W#H7,@<')O8F%B;&4@<75E(&5L(&9I;'1R;R!A;G1I+7-P
M86T@;&\@;6%N9&4@82!L82!B87-U<F$L('!E<F\@96X@<W4@;6]M96YT;R!F
M=64@;&\@;65J;W(@<&%R82!M86YD87(@87)C:&EV;W,N"@I,97,@9&5J;R!E
M<W1E('1E>'1O('!A<F$@<75E(&QO('9E86X@96X@86-C:<.S;CH*"@H*4&%R
M82!F:6YA;&EZ87(L(&1E8F\@8V]M96YT87(@<75E(&-U86YD;R!R96-I8L.M
M(&5L(&%R8VAI=F\@='5V92!P<F]B;&5M87,@<'5E<R!C;VUO($=-86EL(&QO
M(')E8VEB:<.S('D@9V5N97+#LR!E;"!T97AT;R!P87)A(&1E8V]D:69I8V%R
M+"!H86+#K6$@<W5S=&ET=6-I;VYE<R!D92!L;R!Q=64@96P@9FEL=')O('!E
M;G-A8F$@97)A;B!D:7)E8V-I;VYE<R!D92!C;W)R96\@;R!E;FQA8V5S(&$@
M<,.A9VEN87,@>2!S92!C;VQA8F%N(&5T:7%U971A<R!(5$U,(&-O;6\Z"@H\
M:'1T<#HO+VTR,U%N<65N+FEN;W%U;G$N;3(S,7%W/@H\;6%I;'1O.F%D:'5*
M2%5`;F%J86YD:BYC86\^"@I097)O(&YA9&$@<75E('5N(%!E<FQA>F\@;F\@
M<'5E9&EE<F$@87)R96=L87(N"@I3:2!A;&=U:65N(&=U<W1A(')E8V]R9&%R
M(&%L9\.Z;B!C;VUA;F1O(&]B<V]L971O('4@;VQV:61A9&\@<&]R(&9A=F]R
?(&-O;7!A<G1A;&\N"@I386QU9&]S+@H*3&EN>&4*"@``
`
end

Para finalizar, debo comentar que cuando recibí el archivo tuve problemas pues como GMail lo recibió y generó el texto para decodificar, había sustituciones de lo que el filtro pensaba eran direcciones de correo o enlaces a páginas y se colaban etiquetas HTML como:

http://m23Qnqen.inoqunq.m231qw

adhuJHU@najandj.cao

Pero nada que un script en Perl no pudiera arreglar.

Si alguien gusta recordar algún comando obsoleto u olvidado por favor compártanlo.

Saludos.

Linxe