Recordando viejos comandos: uuencode y uudecode
Juan CaballeroHace 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