Logo de AulaDigital

Configuracion Impresion Como 4

Impresión Como: LPR Anterior Siguiente Indice

4. LPR

Todo sistema que se precie es capaz de gestionar una o varias impresoras, con uno o varios usuarios, que les envían distintas clases de documentos, más o menos dignamente.

Unix resuelve estos problemas mediante un conjunto de programas, los servidores de impresión, que gestionan los trabajos pendientes, y los encauzan a las impresoras adecuadas, todo de manera completamente transparente al usuario.

Hay dos familias de servicios de impresión: "lp" en UNIX System V (AT&T), y "lpr", en los U*X BSD, y Linux. En este documento sólo se hablará del segundo sistema; el sistema lp no es de dominio publico, y no conocemos ninguna versión que lo sea; de todos modos, ambos tienen hoy día la misma funcionalidad.

Una variante muy prometedora de lpr, LPRng, obvia toda una serie de limitaciones del lpr original. Nos limitaremos a mencionar las diferencias en los capítulos concretos.

Dicen los que saben que lp es más robusto, pero a la hora de trabajar en red lpr se destaca por varios cuerpos.

4.1 �Qué necesita?

Asumimos que usted sabe cómo editar un archivo de texto bajo Linux, y tiene los conocimientos básicos sobre permisos y propiedad de archivos.

También suponemos que su sistema Linux funciona sin tropiezos. Si desea imprimir en máquinas remotas, deberá además tener configurado y funcionando el soporte de red (vea en NET-3-HOWTO N. del Revisor:
Disponible en breve en castellano como NET-3-Como, ver sección Grupos
).

Revise las páginas de manual de los comandos chmod y chown para más información.

4.2 �Cómo imprimir con Linux?

El camino más corto en UNIX (y bajo Linux), es enviar los datos a imprimir directamente al dispositivo adecuado. El siguiente comando envía un listado del directorio a la primera impresora en paralelo (hablando en DOS, LPT1:):

       ls > /dev/lp1

El problema de este método es que no aprovecha las capacidades de multitarea de Linux, debido a que el tiempo que tarda el comando en completarse será el mismo que emplee la impresora en despachar el trabajo.

En una impresora lenta, o en una apagada o sin papel, puede prolongarse un poco. Podríamos ejecutar el comando simplemente en segundo plano, pero no adelantaríamos mucho. Además, deberá tener privilegios de superusuario.

Un remedio mejor es crear un área tampón (spool), es decir, guardar los datos a imprimir en un fichero temporal, y arrancar un proceso en segundo plano que envíe los datos a la impresora, y gestione las incidencias que se presenten.

Esencialmente, así funciona Linux. Para cada impresora, se define un área tampón, donde cada trabajo pendiente se almacena en un fichero. Un proceso en segundo plano (llamado el demonio de impresión) analiza metódica y constantemente los ficheros tampón, buscando nuevos datos a imprimir. Cuando aparece alguno, son enviados a la impresora apropiada; cuando más de un fichero está a la espera, se colocan en una cola (el primero que entra es el primero que se procesa), por lo que se habla propiamente de la "cola de impresión".

En el caso de impresión remota, los trabajos se gestionan localmente, como cualquier otro, pero el demonio de impresión lo envía a través de la red hacia el ordenador o impresora destino.

La información que el demonio de impresión necesita para su trabajo (el dispositivo físico, el tampón de datos, la máquina e impresora remota ...) se almacenan en un fichero llamado "printcap", que describiremos más tarde.

En lo sucesivo, el término "impresora" se referirá a una máquina lógica definida en /etc/printcap. El concepto "impresora física" o "trasto", define la cosa que mancha papel. Es perfectamente posible describir múltiples entradas en /etc/printcap que se refieren a un sólo trasto, pero por caminos tortuosos. No se preocupe, lo aclararemos al describir printcap.

4.3 Impresión remota e impresión local.

La impresión remota nos permite enviar trabajos de impresión desde una máquina, hacia otra (ordenador/impresora) conectada a una red; por ejemplo, nuestro equipo funciona de servidor en una red, o si una impresora asignada a nuestra máquina debe ser accesible por otros ordenadores.

Imprimimos localmente cuando usuarios de nuestra máquina envían trabajos a una impresora conectada directamente a la misma.

4.4 Los programas importantes

El sistema de impresión de Linux se sustenta en cinco programas, que deberían estar donde aparecen en el siguiente listado, propiedad de root, y grupo lp (o daemon, según el sistema en concreto):

       -rwxr-xr-x          root          lp            /bin/lpr

       -rwxr-xr-x          root          lp            /bin/lpq

       -rwxr-xr-x          root          lp            /bin/lpc

       -rwxr-xr-x          root          lp            /bin/lprm

       -rwxr-x---         root          lp            /sbin/lpd

Los cuatro primeros tienen por fin enviar, cancelar y examinar los trabajos de impresión. /sbin/lpd es el demonio de impresión.

OJO: Los directorios, permisos y propiedad de los ficheros pueden diferir a los de su sistema, aunque no deberían ser MUY distintos.

Hay páginas de manual que explican con detalle todas estas órdenes y que debería consultar para ampliar información.

Es importante saber que, por defecto, lpr, lprm, lpc y lpq trabajan con una impresora llamada "lp". Si define la variable de entorno PRINTER con el nombre de una impresora, pasará a ocupar el valor por defecto. Se puede indicar sobre la marcha una impresora distinta con la opción -P impresora en la línea de órdenes.

La orden lpr

Con lpr se envía un trabajo a la impresora. Este se copia en el tampón, donde el demonio de impresión lo encuentra, y lo envía a la impresora física. Si no le suministra un fichero, lpr usará la entrada estándar.

La orden lpq

lpq muestra los trabajos pendientes para la impresora deseada ("lp" por defecto). lpq muestra el número de cada trabajo, que lo identifica para cualquier proceso posterior.

Muestra también el estado de cada trabajo. "active" indica que el demonio está enviando el trabajo a su destino, o al menos lo intenta. Si no, un número indica su orden en la cola de impresión.

La orden lprm

lprm elimina un trabajo de la cola, es decir, borra los ficheros en espera en el directorio tampón. Puede indicar específicamente la identidad de un trabajo particular, o "-", con lo que cancelamos todos los trabajos destinados a la impresora seleccionada .Si se es superusuario, y quiere eliminar todos los trabajos pertenecientes a un usuario, especifique su nombre de usuario en la línea de órdenes.

la orden lpc

Con lpc podemos comprobar el estado de las impresoras, y controlar algunos aspectos de su uso. Particularmente, le permite arrancar y parar el tampón de datos, permite activar y desactivar impresoras, y reorganizar el orden de los trabajos en cola. Con las órdenes siguientes desactivamos la impresora "impre", activamos la cola de "tuimpre", y mueve el trabajo 37 al principio de la cola.

              lpc down impre

              lpc enable tuimpre

              lpc topq 37

Si no especificamos argumentos, lpc entrará en modo diálogo. con "?" obtenemos ayuda. Advierta que algunas funciones de lpc están reservadas para el superusuario.

4.5 Los directorios fundamentales.

Realmente, sólo hay un directorio importante: el área de tampón donde se almacenan los datos a la espera de que lpd decida qué hacer con ellos. Sin embargo, un sistema típico debería configurarse en varios directorios, uno para cada impresora, lo que facilita notablemente el mantenimiento. En la mayoría de las instalaciones, /var/spool/lpd es el directorio tampón principal, y cada impresora tiene un subdirectorio particular, con el mismo nombre que la impresora. Así, si tiene una impresora llamada PJL-16 que admite PostScript y HPGL, debería crear dos directorios, por ejemplo /var/spool/lpd/PJL-16-ps y /var/spool/lpd/PJL-16-hpgl.

Los directorios temporales deberían pertenecer a root, grupo lp; user y group deben poder leer y escribir, y el resto, leer. permisos:

-rwxrwxr-x
(775)

Para cada directorio de impresora, la orden adecuada sería:

chmod ug=rwx,o=rx PJL-16-ps
chgrp lp myprinter

Los destinos, permisos y propietarios aquí indicados deben considerarse como indicativos, pues pueden variar entre distintos sistemas e instalaciones.

Y sus correspondientes ficheros.

Además de los programas ya tratados, cada directorio temporal debe contener como mínimo estos cuatro ficheros: ".seq" , "errs" , "lock" y "status". Deberán tener permisos

-rw-rw-r-- 
(664).

El fichero .seq contiene la secuencia de trabajos enviados. status contiene el mensaje que devuelve "lpc stat". El fichero lock impide al lpd imprimir al tiempo dos trabajos en la misma impresora, y errs guarda un registro de los fallos de la impresora.

El fichero "errs" es actualmente potestativo, y ahora puede llamarse como le apetezca su nombre se especificará en /etc/printcap. Debe, sin embargo, existir un fichero que permita a lpd registrar los mensajes de error.

4.6 /etc/printcap

/etc/printcap es un fichero texto, modificable con su editor favorito.

Su propietario debe ser root y debe tener permisos

-rw-r--r-- 
(644)

Aunque a golpe de vista parezca tan comprensible como la piedra Rosetta , su estructura es muy sencilla y asequible. Parte de la mala fama se debe a que algunas distribuciones no incluyen página de manual para printcap, y el hecho de que muchos printcap están generados por programas, o por gente cuya manera de despreciar al género humano es omitir comentarios que ayuden a su compresión. Desde aquí hacemos un llamamiento para que su fichero printcap sea tan legible como sea posible.

Cada entrada de printcap describe una impresora. Mejor aún, cada entrada de printcap provee una denominación lógica para un dispositivo físico, y describe cómo deben los datos ser enviados y manejados por él.

Por ejemplo, una entrada de printcap definirá qué puerto vamos a usar, qué directorio tampón, qué proceso deben soportar los datos, qué clase de errores debemos notificar, qué volumen de datos se permiten enviar como máximo, o limitar el acceso de ciertos dispositivos.

Además, podemos definir distintos modos de procesar datos para una misma impresora. Por ejemplo, una misma impresora de HP puede manejar datos en formatos PostScript, HPGL y PCL, dependiendo de la secuencia de órdenes que le enviamos al comienzo de cada trabajo. Tendría sentido definir los tres modos de trabajo como sendas impresoras, cada una de las cuales procesará los datos dependiendo del modo de trabajo. Los programas que generan datos ps se enviarán a la impresora PS, los dibujos HPGL a la impresora HPGL, y así sucesivamente.

Llamaremos "filtros" a los programas que procesan los datos a imprimir. Un filtro puede incluso no enviar ningún dato al puerto.

Los campos de /etc/printcap.

Un ejemplo típico de entrada en /etc/printcap podría ser:


# Ejemplo de printcap con dos alias
impresora|HP850C:\
# lp es el dispositivo de impresion, en este caso, la primera impresora
:lp=/dev/lp1:\
# sd indica el directorio tampon
:sd=/var/spool/lpd/HP850C:

Como vemos, cada entrada de /etc/printcap se estructura en una serie de campos, encabezados por una etiqueta, y limitados por dos puntos, a excepción del primer campo, que describe la impresora. Los campos pueden tener tres tipos de valores - Texto, lógico y numérico, en los que nos extenderemos más adelante.

La primera línea de la entrada determina el nombre y alias de la impresora. La impresora por defecto debería llamarse "lp"; por ejemplo, si la impresora del ejemplo anterior es la única que tenemos, la primera línea sería:


# Ejemplo para la impresora por defecto
lp|HP850C:\

Podemos usar el nombre que nos apetezca como "La Picadora de papel del despacho de Gertrudis", aunque no parezca quizá muy práctico. Ojo: Sólo podemos tener una impresora llamada "lp".

Los siguientes campos son los más comunes, y los más importantes:

Campo    Tipo         Descripcion

lp       Texto        Dispositivo de impresion ( ej.: /dev/lp1 )
sd       Texto        Nombre del directorio tampon de esta impresora
lf       Texto        Fichero que almacena el registro de errores
if       Texto        Nombre del filtro de entrada
rm       Texto        Nombre del host de impresion remota
rp       Texto        Nombre de la impresora remota
sh       Logico       Suprime las Páginas que separan los trabajos
sf       Logico       Suprime las Páginas en blanco al final del trabajo
mx       numerico     Tamagnio maximo del trabajo de impresion (en bloques)

  • lp apunta al puerto/dispositivo de impresión. Si especificamos /dev/null como dispositivo, el resto de los procesos se ejecutan normalmente, pero los datos de salida van a parar al inodoro. No se utiliza a excepción de las pruebas de configuración del dispositivo. Cuando configure una impresora remota con los campos rm y rp , debería poner ":lp=:" en /etc/printcap, indicando que no está asignada a ningún dispositivo local.. No deje este campo en blanco a menos que use una impresora remota, o el demonio de impresión se quejará amargamente, si no especifica un dispositivo de impresión.
  • lf guarda un registro de los errores de impresión. Cualquier fichero que especifique deberá existir antes de su uso, o no se registrarán las incidencias.
  • if indica el nombre del filtro de impresión a ejecutar. Los filtros son programas que reciben datos por la entrada estándar, y los devuelven procesados por la salida estándar. Un empleo típico es detectar texto llano y convertirlo en PostScript para imprimirlo en ese tipo de trastos. Son muy útiles, por ejemplo, para eliminar el efecto escalera, o cambiar la página de códigos sin necesidad de cambiar la configuración de la impresora cada vez que la usemos entre UNIX y DOS. Cuando se especifica un filtro de entrada, el demonio de impresión no envía los datos pendientes al dispositivo especificado. En su lugar, arranca el filtro y asigna el fichero temporal a la entrada estándar, y el dispositivo de impresión como salida estándar.
  • rm y rp controlan el destino de la impresión remota. Enviar el documento a imprimir a una impresora remota es tan fácil como indicar el anfitrión en rm, la impresora correspondiente en rp, y asegurarse que lp está vacío. Fíjese en que los datos se tamponan localmente antes de ser enviados, y que le ejecutará cualquier filtro que especifique. Una entrada típica de /etc/printcap en la máquina local (pera.huerta.net) para trabajar sobre la impresora picapapel, en la estación rábano.huerta.net (remota), sería: picapapel:lp=:rm=rábano.huerta.net:rp=picapapel:sd=/var/spool/lpd/picapapel: En la máquina remota necesitará que /etc/hosts.equiv o /etc/hosts.lpd contenga la línea pera.huerta.net; Tenga cuidado con los permisos de acceso. Vea el punto Y de la impresión remota, �qué?.
  • sh y sf: Portadillas y separadores. Salvo que haya mucha gente distinta usando su impresora, probablemente no estará interesado en las páginas separadoras de trabajos. Las páginas de fin de trabajo son particularmente molestas cuando se trabaja con procesadores de texto, que componen páginas completas, por lo que si especificamos sf, tendremos al final de cada trabajo una página en blanco. sf es muy útil, sin embargo, si usamos la impresora para listar directorios, ficheros en crudo ..., asegurándonos que el trabajo sale completo de la impresión. Se puede presentar un problema si tenemos una impresora PostScript, al quedar residente el último tipo de letra utilizado. Con el campo :tr: lo evitaremos. Es preferible en estos casos dejar :sh:, y que sean los filtros quienes se encarguen de generar las portadillas.
  • mx limita el tamaño del tampón de datos, señalando una cantidad en bloques de 1 K ( 1024 bits ). Si mx=0, el límite viene dado por el espacio disponible en disco. Recuerde que lo que limitamos es el tamaño del tampón, no la cantidad de datos impresos. Si intentamos sobrepasar el límite, el fichero simplemente se trunca, y el usuario recibe el mensaje
    lpr: fichero: copy file is too large".
    
    mx es útil si tiene programas que accidentalmente pueden generar un volumen desproporcionado de datos a imprimir (imágenes, por ejemplo); para impresoras ps, no suele tener mucho interés, pues un volumen pequeño de datos en formato ps pueden generar una notable cantidad de papel impreso. Podemos sustituir el límite de mx escribiendo en cada directorio tampón un fichero llamado "minfree" que contiene el espacio mínimo disponible que permita aceptar trabajos, en forma de fichero texto con el número de bloques mínimos disponibles. Normalmente, suele ser un enlace con el original en /var/spool/lpd, ya que es inusual que cada impresora deba tener un mínimo diferente.

Probemos /etc/printcap con un ejemplo

El siguiente guión de shell es un filtro de entrada muy simple. Sólo encadena su entrada al final de un fichero en /tmp, tras una pancarta adecuada. Usaremos este filtro en el campo if, y enviaremos los datos a /dev/null, ahorrándonos las quejas del demonio especificando un dispositivo de impresión.


#!/bin/sh
# Este filtro debera colocarse en el directorio tampon, con el nombre
# filtro_entrada, propiedad de root, grupo lp y permisos -rwxr-xr-x
#
echo ------------------------------------------------>/tmp/testlp.out
date >> /tmp/testlp.out
echo ------------------------------------------------>>/tmp/testlp.out
cat

Y aquí tenemos nuestra flamante entrada en /etc/printcap. Vea que el formato es razonablemente inteligible, usando caracteres de continuación de línea "\" al final de cada una, excepto la última (de hecho, cada entrada en /etc/printcap es una sola línea):


impre|PLJ-H1998:\
:lp=/dev/null:\
:sd=/var/spool/lpd/PLJ-H1998:\
:lf=/var/spool/lpd/PLJ-H1998/errores:\
:if=/var/spool/lpd/PLJ-H1998/filtro_entrada:\
:mx#0:\
:sh:\
:sf: 

Ojo: NO DEJE ESPACIOS EN BLANCO, o no funcionará (le aparecerán impresoras sin nombre, no logrará volcar los trabajos, y se acumularán en cola generosamente)

Valor y al toro: juntémoslo todo

  • Primero: DEBE SER EL SUPERUSUARIO (root), tanto si le gusta como si no.
  • Segundo: Compruebe los permisos y situaciones de lpr, lprm, lpc, lpq y lpd.
  • Tercero: Cree el directorio tampón de su impresora: (recuerde que el propietario debe ser root, el grupo lp, y los permisos -rwxrwxr-x con las órdenes:
    mkdir /var/spool/lpd /var/spool/lpd/impre
    chown root.lp /var/spool/lpd /var/spool/lpd/impre
    chmod ug=rwx,o=rx /var/spool/lpd /var/spool/lpd/impre
    
  • Cuarto: En el directorio tampón cree los ficheros necesarios, con los debidos permisos y propietarios:
    cd /var/spool/lpd/impre
    touch .seq errores status lock
    chown root.lp .seq errs status lock
    chmod ug=rw,o=r .seq errs status lock
    
  • Quinto: Cree el script filtro de entrada en el directorio tampón. Use por ahora el filtro de prueba anterior. Asegúrese que el fichero pertenece a root.lp, y es ejecutable para todos.
  • Sexto: Cree el fichero /etc/printcap tal y como lo hemos descrito en el punto anterior. Su propietario será root y sus permisos -rw-r--r--.
  • Séptimo: Compruebe que rc.local (normalmente en /etc/rc.d/) contiene la línea /sbin/lpd, y añádala si no está. Esto hace que arranque el demonio de impresión al arrancar. De todos modos puede arrancarlo a mano con la orden lpd.
  • Octavo: Haga una prueba: cruce los dedos y teclee
    ls -l | lpr -Pimpre
    
  • Noveno: Busque en /tmp un fichero llamado testlp.out. Debería contener un listado del directorio, con un encabezado.
  • Décimo: Si ha funcionado (y no dudamos que habrá sido así), edite /etc/printcap, y copie la entrada de prueba en el mismo fichero; En la primera entrada, cambie el nombre de la impresora a "testlp", o el que usted prefiera, pero que no use como nombre real de impresora. En la segunda entrada (que ahora será la de su impresora real), cambie el contenido de lp=/dev/null al del puerto de impresora (normalmente será /dev/lp1) de su ordenador, salvo que vaya a utilizar una impresora remota, en cuyo caso deberá definir rm y rp. Cambie el nombre del filtro if si tiene ya uno previsto, o suprímalo si no va a utilizar ninguno.
  • Once: Reinicie el sistema, o mate el demonio de impresión y arránquelo, ya que lpd sólo lee /etc/printcap al comenzar su trabajo.
  • Doce: Haga una prueba, y aprecie lo bien que funciona su impresora (Si tiene problemas con el efecto escalera, siga leyendo).

Para añadir nuevas impresoras, sólo tendrá que repetir la entrada de printcap, con las modificaciones pertinentes a cada dispositivo.

Y de la impresión remota, �qué?

Como primer paso, cualquier máquina que intente imprimir en su sistema, debe estar registrada en cualquiera de los ficheros /etc/hosts.equiv o /etc/hosts.lpd, que son simples ficheros de texto, con un nombre de maquina por línea. Es preferible el segundo, reservando el primero para proporcionar mayores permisos de acceso, lo que debería ser evitado en lo posible.

Puede restringirse el uso tanto por nombre como por grupos. Especifique los grupos autorizados con uno o varios campos ":rg:" en /etc/printcap - :rg=admin: sólo autorizará el acceso a la impresora a los usuarios asignados al grupo admin. Puede también limitar el acceso a aquellos usuarios con cuenta en su sistema utilizando el campo lógico :rs:.

Socorro: no funciona.

Algo falla; Lo primero que debemos hacer es revisar la existencia y los permisos y propiedad de los ficheros y directorios anteriormente descritos. Como comprobará los permisos de UNIX son algo juguetones hasta que se les controla. No se azore, y siga la siguiente rutina de control. Recuerde que cualquier modificación de /etc/printcap acarrea matar el demonio de impresión y arrancarlo de nuevo, o (último y brutal recurso) reiniciar el sistema.

  1. ejecute "ls -l > /dev/lp?" (como root)
    • La impresora funciona: 2
    • La impresora no funciona: Compruebe el puerto de impresión, el cable, y que la impresora física este encendida y lista.
  2. pruebe con lpr -P<impresora>
    • La impresora responde: 7
    • La impresora no responde: 3
  3. Aparecen mensajes de error indicando que no se puede escribir .seq o que no se puede crear la cola: Compruebe que haya sitio en el disco, que el directorio tampón existe y que tiene los permisos necesarios.
    • no hay mensajes: 4
  4. ejecute
    ps -ax | grep lpd
    
    y vea si aparece lpd en el listado, o hay un mensaje acerca del demonio de impresión:
    • lpd no está arrancado: Vea si rc.local tiene una línea /sbin/lpd; si no, añádala y reinicie el sistema. Puede arrancarlo a mano con /sbin/lpd como root.
    • lpd está funcionando: 5
  5. Compruebe que el filtro de impresión especificado en if funciona. (filtro < datos >salida)
    • El filtro no funciona: corríjalo, y pruebe de nuevo
    • El filtro funciona: 6
  6. Ejecute "lpc status".
    • Aparecen más impresoras que las descritas, algunas con el nombre en blanco: Hay espacios en blanco dentro de la entrada de la impresora en /etc/printcap. Revise la sintaxis de la entrada.
    • sólo aparece una impresora que no es lp: Si no ha especificado nombre de impresora, lpr usará lp por defecto. Pruebe
      lp -P<impresora> 
      
    • La impresora está deseleccionada (down): ejecute
      lpc up <impresora>
      
      (debe ser superusuario).
  7. La impresora funciona, pero imprime mal:
    • Se imprimen las cuatro o cinco primeras líneas, en escalera: Necesita un filtro de entrada. Vea Efecto Escalera
    • El fichero no se imprime completo: Elimine el límite en mx con :mx#0: en /etc/printcap.

Si tras este rastreo sus dificultades continúan, tenemos un buen problema. Una buena idea para aislar fallos es incluir el demonio "syslogd" en el arranque, de modo que obtengamos un registro de las incidencias de los procesos arrancados, que puedan ayudar al rastreo.

Un problema que ha ido apareciendo y desapareciendo de modo recurrente en distintas versiones de Linux está asociado a los mensajes "job queued, but cannot start daemon" o "lpc: connect: no such file or directory", y lpd sí está corriendo, parece manifestar un conflicto entre los módulos de red y el resto del sistema, y que se manifiesta si la red no está correctamente configurada. Si no está conectado a una red, suele corregirse añadiendo en la configuración de arranque:

ifconfig lo localhost
route add localhost

�Dónde puedo encontrar un printcap para la impresora xxxxx?

Si ha leído todo hasta ahora, comprobará que esta pregunta carece de sentido. No se le ocurra preguntar en usenet, si quiere que su dignidad se mantenga a salvo, y léase este documento completo.

El "efecto escalera", bajo control.

Mientras que en *DOS el indicador de nueva línea se compone de los caracteres CR y LF (retorno de carro y salto de línea), UNIX termina las líneas con LF. Esto hace que, si en una impresora configurada para *DOS imprimimos un documento UNIX, obtendremos una sucesión de líneas, que acabarán marchándose inmediatamente por el margen derecho del papel.

Tenemos dos vías para corregirlo: Reconfigurar la impresora para que interprete LF como CR+LF, algo molesto si alterna entre *DOS y Linux, o añadir un filtro de impresión, que lo haga sobre la marcha.

Ofrecemos dos: uno general, y el otro específico para impresoras HP.

#!/bin/sh
# filtro general para prevenir el efecto escalera
if [ "$1" = -c ] ; then
cat
else
sed -e s/$/^M/
fi
echo -ne \\f

#!/bin/sh
# filtro para corregir el efecto escalera en impresoras HP
echo -ne \\033\&k2G
cat
echo -ne \\f

El carácter

^M
es el correspondiente a CR. Para obtenerlo con vi use C-v C-m, y con emacs, C-q C-m (C es la tecla Control).

El mejor sitio para guardar estos filtros es el propio directorio tampón de la impresora. Recuerde que deben especificarse en /etc/printcap en el campo :if=<filtro>:, con permisos -rwxrwxr-x, y propiedad root.lp.

Imprimir por el puerto serie es fácil.

Primero hemos de ver si lpd se queja enviando un error acerca de ioctl(TIOEXCL). Si es así, deberíamos conseguir una versión de lpd que lo acepte (lpd-590p2, por ejemplo).

Necesitaremos configurar dos grupos de campos, además de la velocidad de transferencia br (Observación: Configurar el campo ":fc:" puede puentear el valor del campo ":br#:", así que asegúrese de configurar los dos correctamente).

Cada campo puede tener bits activados y desactivados. Se debe empezar desactivándolos con los campos ":fc#*:" y ":xc#*:", para activarlos posteriormente con ":fs#*:" y ":xs#*:".

Configurar br#; es obvio: ":br#9600:

Es muy fácil traducir la configuración de stty a los campos de /etc/printcap. Consulte la página de manual de stty para obtener más información.

Utilice stty para configurar el puerto de su impresora de manera que con "cat" pueda enviarle un fichero, e imprimirlo sin problemas. Aquí tiene un ejemplo de la configuración del puerto serie de la impresora:

# darkstar:/var/spool/lpd # stty -a < /dev/ttyS2
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop
-echoprt -echoctl -echoke

Deberá estudiar el control de flujo de su impresora serie, y aplicar las correcciones necesarias a la configuración del puerto al que está conectado el equipo.

Una vez tengamos la configuración ajustada, de modo que con la orden

cat fichero > /dev/ttyS?

la impresora escriba correctamente, consultaremos el fichero /usr/src/linux/include/linux/termios.h ( no será mala idea imprimirlo; así sabremos si funciona :-).

En la sección que empieza con

/* c_cflag bit meaning */
#define CBAUD 0000017

está detallado el valor de los bits de "fc#" y "fs#". Apreciará que los nombres que aparecen aquí (tras las velocidades de transmisión) coinciden con una de las líneas del listado producido por stty. �Ve qué fácil?

Estos campos, en stty, van precedidos por un guión (-). Sume los valores (en octal) que aparecen en el listado. Este valor representa los bits a LIMPIAR; es el valor del campo :fc#*:. Note que, como deberá activar posteriormente los bit necesarios, podría usar directamente ":fc#0177777:".

Ahora repita el mismo proceso para las opciones sin guión en la salida de stty. En el ejemplo, los bits importantes son CS8 (0000060), HUPCL (0002000) y CREAD (0000200). Considere también los indicadores para la velocidad de transmisión (en mi caso 0000015). Súmelos; en este caso, tendremos 0002275: el valor del campo :fs#*: (En mi caso, ":fs#02275:" funciona).

Haremos lo mismo con la siguiente sección de termios.h, que comienza con "c_lflag bits". En mi caso, no he necesitado ningún ajuste, y utilizo ":xc#0157777: y ":xs#0:".

Una vez modificado printcap, intente imprimir con lpr. Si no funciona, siga leyendo.

cat funciona, pero lpd no.

Mantener "lpd" en forma se explica en la página adecuada del manual, pero si le persiguen los problemas de configuración, puede evitar que lpd establezca la configuración del puerto, haciendo que su impresora no presente un dispositivo normal (vea la sección impresorasqueno).

El proceso a seguir es el siguiente:

  1. el campo :lp: de /etc/printcap deberá apuntar a /dev/null1 (créelo con mknod /dev/null1 c 1 3), porque no queremos a /dev/null sólo para nosotros. Elimine los campos :br: y :fs:, :fc:, :xs: y :xc:.
  2. Cree un script, por ejemplo, testserie, tal que este:
    #!/bin/sh
    echo if: $* >> /var/spool/lpd/resultados
    # /dev/lp debe estar enlazado (con ln -s) a /dev/ttyS?, donde esta la 
    # impresora
    exec su-filtro-de-entrada-viejo $* > /dev/lp
    
    o si no tiene un :if: instalado
    #!/bin/sh
    echo if: $* >> /var/spool/lpd/resultados
    # asumimos que /bin/sh es bash al usar "echo -ne"
    echo -ne \\f > /dev/lp
    
  3. Asegúrese que es ejecutable y legible para todos (rwxrwxr-x). Pruebe el filtro con
    # testserie < algo-que-imprimir 
    
    y vea si sale algo por la impresora. Modifique /etc/printcap, para que if sea "testserie" (o el nombre que le haya dado).
  4. Con stty, configure el puerto de la impresora. Intente imprimir. Ahora podrá saber si hay datos en el tampón, y algo debería imprimirse si el paso 3 funcionó.

Ahora, si el proceso con if funciona, y cree que la configuración del printcap original es la correcta, vuelva a revisar la configuración del puerto, las etiquetas de termios.h ... Si aún no funciona, probablemente lpd tiene un defecto, y deba obtener una versión nueva.

Impresoras que no son dispositivos simples.

Piense en una impresora conectada de algún modo tortuoso a nuestra red ... ---agárrese: está enchufada a un ordenador con el que sólo podemos comunicarnos mediante correo electrónico---

Para imprimir a través de lpr, el campo :lp: debería ser redirigido a un dispositivo nulo,

mknod /dev/null1 c 1 3

(no a /dev/null, pues lpd lo usa en exclusiva). El filtro de entrada ( :if:, recuerde) debe explícitamente codificar y enviar como correo al ordenador remoto su salida.

Se rumorea que alguien consiguió con algo similar con Novell NetWare y el agente de correo Charon; también hay quien cree en los Reyes Magos.

4.7 Trucos y problemas

lpr -i o como modificar la impresión a nuestro antojo.

La opción -i envía argumentos al filtro de impresión. Ante todo, necesitamos un filtro instalado en printcap para que la opción '-i' funcione. Ésta se limita a pasar a través de lpd hacia el filtro. Si quisiera un filtro que permitiera configurar su impresora sobre la marcha, podríamos utilizar un filtro como este:

#!/bin/sh
# Mi programa de configuracion se llama confimpre.
exec /usr/lib/confimpre $* 

que desplace el margen izquierdo, y pasar como argumento el margen deseado.

#!/usr/bin/perl
# confimpre: Desplaza el margen izquierdo en un texto ascii
# Usamos perl porque convertir numeros a caracteres
# es un campo de minas en programacion shell
for  ( $i=0 ; !($_ = $ARGV[$i]) || !/^-i([0-9])+/;
$i++) {}
print pack( "cAc" , 27 , "l" , $1) ;
while (<STDIN>) { print; }

'lpc' y 'lpq' advierten : "missingdaemons"

Un proceso lpd corre continuamente, y se desdobla en hijos para manipular cada impresora en tanto se necesita. La salud del proceso principal no se manifiesta explícitamente con 'lpc'; basta con la ausencia de errores. El comando 'lpc stat' mostrará de manera normal el mensaje "no daemon present" para cada cola actualmente inactiva. Si la impresión se desactiva, o la cola se vacía, 'lpq' es bastante más escandaloso, gritando "Warning: no daemon present", aunque, de hecho, no hay condición de error. Si el demonio está ausente cuando hay entradas en la cola, y no ha sido explícitamente detenido, probablemente se debe a un fallo en algún filtro. Fíjelo y reinicie con "lpc up <cola>.

De vez en cuando, al desactivar una impresora, 'lpc' alucina, e intenta matar demonios inexistentes, emitiendo un surtido de irritantes e inofensivos mensajes de error. Esta "característica" es muy rara en versiones posteriores a lpd-590p2.

Impresión sobre red (notas adicionales)

Dado que la máquina que alberga la impresora física debe saber quien se conecta, deberemos dar de alta al resto de los ordenadores en los ficheros /etc/hosts.equiv y /etc/hosts.lpd, con sus nombres canónicos, o direcciones IP. Si no está seguro del nombre completo de una máquina, puede incluir todos sus alias conocidos.

Por motivos de seguridad, es preferible que las máquinas que sólo deban tener acceso a la impresora queden restringidas a /etc/hosts.lpd.

Si el servidor de impresión no ejecuta un sistema de impresión tipo BSD ( UnixWare, HP-UX versión 10 ,...), debería ser posible trabajar con él, teniendo en cuenta que los ficheros de autorización pueden variar notablemente, cambiando en cada sistema.

Si aún no puede imprimir sobre un sistema distinto, queda un as en la manga: simplemente use una orden remota, tal que rsh, rexec ...

# rsh rabano.huerta.net "lp -dlp" < fichero 

permitirá imprimir sobre un SYSV, desde nuestra pera.huerta.net.

4.8 Los filtros de impresión

Los filtros en UNIX, son meramente programas (y como tales deben tener permisos de ejecución) que leen la entrada estándar y escriben sobre la salida estándar, independientemente de su complejidad.

Los filtros de lpd lo son en el sentido que leen STDIN y escriben en STDOUT; su peculiaridad estriba en que deben asumir que la entrada estándar es un fichero de acceso aleatorio, sobre el que se pueden realizar operaciones con lseek().

Un filtro que interpreta PostScript nos servirá de ejemplo:

#!/bin/sh
/usr/bin/gs -q -dSAFER -dNOPAUSE -r?? -sDevice=? -sOutputFile=- - < /dev/null

La primera línea invoca al intérprete de comandos que lo interpretará. Podemos usar csh, bash, perl, tcl, etc...; va por gustos.

En la segunda línea usamos gs como filtro, indicando que la entrada es STDIN ( el guión del final ), y la salida, STDOUT (-sOutputFile=-). Lea la página de manual de 'gs' para más detalles.

Es buena práctica guardar los filtros de entrada en el directorio tampón de la impresora en la que se usan (o en /var/spool/lpd/ ), aunque las buenas maneras recomienden camas separadas para datos y programas.

Más difícil aún:

#!/bin/sh
/usr/tex/bin/dvips -f | /usr/bin/gs [...] -sOutputFile=- -

Como se puede ver, este filtro procesará un fichero texto de formato TEX o LATEX, obteniendo un fichero .dvi, que es transformado en PostScript, y reprocesado con ghostscript para imprimirlo en una impresora normal.

Ojo: Si usa impresión remota con lpr, el filtro deberá encontrarse en la máquina remota; LPRng obvia este inconveniente.

Los filtros de salida

Son como el goto en 'C', se pueden usar, pero realmente, es difícil encontrar aplicaciones para ellos. Dado que cualquier comando de iniciación de la impresora es ignorado, si tenemos un trabajo rodando que cambia algo (el tipo de letra, por ejemplo), el nuevo trabajo probablemente acabará mal impreso. No los use.

Depuración de filtros

Es absolutamente trivial: mifiltro <fichero >/dev/lp1 (como root). Comprobaremos de inmediato si de verdad funciona.

Un truco muy útil para los filtros con argumentos en línea de comandos consiste en incluir la línea

echo $* >> /tmp/filter-log

cerca del principio del guión. Recuerde incluir en la primera línea '#!/bin/sh', asegúrese de que el propietario es root, y que son ejecutables por todo el mundo.

Filtros Mágicos

Tienen de especial estos programas que son capaces de identificar la familia de los datos a imprimir a partir de patrones característicos de datos en situaciones determinadas. Son generalmente guiones Shell, Perl, programas en C ...; el programa identifica la fuente de datos, y llama a un filtro ordinario que lo procesa de modo adecuado. Con un filtro mágico adecuado y tres filtros no mágicos podemos imprimir cosas como esta:

# lpr -d fich1.dvi fich2.dvi.Z fich3.ps fich4.tex.gz

Un buen sitio para encontrar filtros mágicos como el del ejemplo anterior es:

ftp://tsx-11.mit.edu/pub/linux/sources/usr.bin/magic-filter-??.tar.gz.

Como podrá suponer, nunca se deberían usar como filtros de salida.

Un ejemplo: el siguiente filtro mágico identifica un fichero fuente ps o texto, y lo procesa de acuerdo a su clase:

#!/bin/sh
printf "<Filtro magico para imprimir texto y ps.>"
read first_line
first_two_chars=`expr $first_line : '\(..\)'`
if [ "$first_two_chars" = "%!" ] ; then # Documento PostScript.
/usr/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=??? -sOutputFile=- - < /dev/null
else 
# Texto llano - Si hace falta, podemos incluir aqui la
# correccion del efecto escalera
echo -n $first_line
cat
printf "\014"
fi

Para desazón de muchos, habrá ya notado que un script ejecutado por alguien distinto al propietario puede ser una brecha de seguridad. Este no es el caso de los filtros de lpd, ya que el entorno de los guiones no está al alcance de potenciales piratas.

Los usuarios de HP estamos de suerte

Hasta donde hemos podido averiguar, HP no tiene ningún programa que permita configurar sobre la marcha sus impresoras (�� ni siquiera para sus propios sistemas UNIX!!), salvo que use MS-Windows, o *DOS; por lo que sólo nos queda, bien usar DOSEMU, o salir a DOS, configurar la impresora, y volver a Linux.

Existe un hermoso programa llamado hpmodeset Nota del Traductor:
Hay también otro programa más moderno y práctico, llamado hpset, localizable en cualquier mirror de Sunsite, en ../system/printing/
, escrito en Eiffel, que hace el trabajo por nosotros, muy fácil de usar. Su autor es Glenn Maughan ( glennm@insect.sd.monash.edu.au); se puede conseguir en ftp://hornet.sd.monash.edu.au/pub/hpmodeset/v2.0.

Permite fijar economode, definición, tipo de papel, etc... en ficheros PCL (el lenguaje de las impresoras HP) y ps. No es tan espectacular como el programa de windows, pero funciona muy bien, y es susceptible de ser utilizado como filtro de impresión.


Anterior Siguiente Indice