
(impressão no GNU/Linux com "lpr")
O LPR é um sistema de impressão antigo do GNU/Linux, mas ainda usado e cobrado nas provas de certificação LPI. Esse sistema utiliza as portas paralelas do computador para se comunicar com as impressoras. No MS-DOS e MS-Windows tais portas são identificadas como LPT1, LPT2 e LPT3 (ou PRN). Analogamente no GNU/Linux essas portas são identificadas como /dev/lp0, /dev/lp1, /dev/lp2 e assim por diante. Para conhecimento, impressoras USB usam a seguinte identificação: /dev/usb/lp*.
Com o LPR, é possível transformar um computador num servidor de impressão onde poderemos ter clientes GNU/Linux e MS-Windows. Porém, esse último precisa instalar em "Componentes do Windows", o "Serviço de impressão para Unix". O LPR também pode ser cliente de um servidor de impressão, sendo que tal servidor pode ser um GNU/Linux ou MS-Windows. Novamente, esse último precisa instalar em "Componentes do Windows", o "Serviço de impressão para Unix".
O LPR está sendo substituído gradativamente pelo LPRng (LPR Next Generation) que contém funcionalidades avançadas em relação ao primeiro. A maioria dos comandos e opções do LPRng são iguais ao do LPR. Por isso, esse artigo também é um bom caminho para aprender o LPRng.
Instalando
# apt-get install lpr
Imprimindo diretamente
# cat texto.txt > /dev/lp0 (com esse comando se imprime diretamente na impressora que está conectada na porta paralela LPT1. Por medida de segurança, somente o "root" pode fazer isso. Esse é um método antigo usado com impressoras antigas que imprimiam só texto. Também, pode ser utilizado para testes de funcionamento da impressora, porta, cabos etc)
Obs: por medida de securança, somente o "root" e os usuários do mesmo grupo do daemon de impressão estão habilitados a imprimir/escrever diretamente na impressora. Devido a isso, os outros usuários tem que usar o daemon de impressão "lpd" através dos comandos lpr, lpq, lpc, lprm etc para acessar a impressora.
Imprimindo indiretamente
$ cat texto.txt | lpr (os usuários comuns têm que usar o comando "lpr" para conseguir imprimir. Esse comando toma alguns cuidados iniciais antes de imprimir, só depois disso, passa o controle da impressão para o "lpd" [daemon de impressão] que diz a impressora como imprimir)
$ lpr texto.txt (idem. Quando uma impressora nao e especificada, a impressao vai para a impressora padrao)
$ lpr -#2 -sP dj texto.txt (o "lpr" aceita muitos argumentos. O -P indica o nome da impressora que é definida dentro do "/etc/printcap". O "-s" cria um simbolic link aos invés de copiar o arquivo para o diretório do spool de impressão [muito usado para arquivos grandes]. O "-#" especifica a quantidade de cópias)
$ lpr -#2 -sPdj texto.txt (idem)
Obs1: quando o "lpr" é executado, primeiramente o arquivo é enviado para daemon de impressão chamado "lpd". Depois, tal daemon faz uma cópia desse arquivo para o diretório "/var/spool/lpd/" (conhecido como diretório do spool) e permanece lá até que o "lpd" o imprima. Quando o "lpd" faz a cópia para o spool, ele o coloca numa fila (queue) com outras cópias (caso existam). Isso permite que múltiplas impressões (jobs) sejam enfileiradas, monitoradas e gerenciadas.
Obs2: dentre as várias vantagens de se usar o daemon de impressão "lpd", seria a não impressão diretamente na impressora. Observem que a impressora é infinitamente mais lenta que o computador (mesmo aquelas que possuem um grande buffer/memória). Se toda impressão fosse enviada diretamente a impressora, o computador ficaria esperando até que todo o arquivo entrasse no buffer da impressora. Com a existência do "lpd", antes da impressão o arquivo é copiado para o diretório de spool, onde permanece lá até que o daemon decida imprimir. Dessa maneira, libera o computador para outras tarefas logo tenha copiado o arquivo para o spool (/var/spool/lpd/).
Monitorar: fila (queue) de impressão
$ lpq (comando usado para verificar a fila de impressão e o status dele. Caso tenha instalado o "lprng", também, existe o comando "lpstat". A seguir tem uma figura da saída padrão do comando "lpq". Veja que temos uma impressão que já foi impressa "DONE", pelo usuário "ROOT@DEBIAN01, de classe/prioridade "A" [varia de A a Z sendo a A a de menor prioridade e é a default], o arquivo impresso foi ".bash_history" de 1127 bytes e começou a impressão as "23:39:45". Temos também outro estado além do DONE que é o ACTIVE para as impressões que estão ocorrendo no momento)

$ lpq -Pall -s (-Pall mostra todas as impressoras e todos os jobs e "-s" de "short" oculta várias informações)
$ lpq -Pall@servidor_impressão -s (-Pall mostra todas as impressoras e todos os jobs e "-s" de "short" oculta várias informações. Especificando o servidor de impressão)
# /var/spool/ (diretório onde ficam os spools de impressão como o do LPD, CUPS, SAMBA etc. O spool de impressão pode ser entendido como arquivos que foram enviados ao daemon de impressão e que estão numa fila esperando para serem impressos)
# /var/spool/lpd (diretório onde ficam os spools de impressão do LPD. Esse diretório é definido no arquivo de configuração "/etc/printcap/")
Gerenciar: cancelando impressões/jobs
$ lprm (cancela a última impressão/job do usuário corrente)
$ lprm - (cancela todas as impressões/jobs do usuário corrente. Se esse comando for aplicado como root, remove tudo de todos os usuário)
$ lprm -a (idem)
$ lprm -a all (idem)
$ lprm 12 (cancela a impressão/job número 12. Esse número pode ser visto com o comando "lpq" )
$ lprm -Plp nome_usuário (cancela a última impressão/job da impressora "lp" do úsuário "nome_usuário")
Gerenciar: controlando o lpd com o lpc
$ lpc (ambiente de comandos do "lp". Digite "?" para obter ajuda e digite "? comando" para obter uma ajuda mais específica)
$ lpc topq nome_impressora job (faz com que um job que está na fila de impressão seja o primeiro)
$ lpc redirect hp epson (redireciona os jobs da impressora hp para a epson)
$ lpc redirect hp off (cancela o redirecionamento anterior)
$ lpc holdall hp (para todos os jobs da impressora hp. Comando ótimo durante manutenções na impressora)
$ lpc release hp (libera todos os jobs da impressora hp que estavam parados pelo comando anterior)
$ lpc restart hp (restarta a impressora "hp" caso haja novas configurações dentro do arquivo "/etc/printcap". Em vez do "hp" poderia colocar "all" para restartar todas as impressoras)
$ lpc down hp (faz com que a impressora pare de receber e imprimir jobs)
$ lpc up (desfaz o comando anterior, deixando a impressora pronta para receber e imprimir jobs)
# lpc enable hp (habilita a impressora hp a aceitar jobs)
# lpc disable hp (habilita a impressora hp a não aceitar jobs)
$ lpc status (mostra o status [ativas, redirecionadas, qte de jobs no spool] das impressoras)
O comando PR
$ pr -l60 text.txt | lpr (um dos comandos usado em conjunto com o "lpr" é o "pr" que converte [Paginate ou columnate] arquivos texto numa versão paginada ou colunada ideal para impressão)
Arquivo de configuração - permissao de acesso
# vi /etc/hosts.lpd (se esse arquivo existir, os usuarios remotos nao conseguirao imprimir. Para imprimir se deve excluir esse arquivo ou inserir dentro dele os enderecos dos hosts remotos que podem imprimir)
Arquivo de configuração - geral
# vi /etc/printcap

:lp=/dev/lp0:\ (indica que a impressora local está em "/dev/lp0")
:sd=/var/spool/lpd/lp:\ (especifica onde fica o diretório do spool de impressão)
:af=/var/log/lp-acct:\ (indica o arquivo de log das ações realizadas pelo sistema de impressão "lp")
:lf=/var/log/lp-errs:\ (indica o arquivo de log de erros realizadas pelo sistema de impressão "lp")
:pl#66:\ ()
:pw#80:\ ()
:pc#150:\ ()
:mx#0:\ (tamanho máximo do arquivo a ser impresso. Se o valor for "0" significa que não tem limite)
:sh: (indica que não se deve imprimir a página de banner/rosto que tem o nome da máquina, usuário, arquivo etc. Os dois pontos ":" dizem que a configuração dessa impressora acaba aqui)
------------------
rlp|Remote printer entry:\ (nome | descrição da impressora. O nome é "rlp" e é usado quando for imprimir, utilizando o argumento "-P" do comando "lpr". RLP - Remote Linux Printer. Também se poderia colocar nomes mais descritivos como hp-remoto, dj-remoto, lazer-remoto etc)
:lp=:\ (indicaria o dispositivo da impressora local, mas como é uma impressora remota não é necessário indicar o dispositivo. Também poderia ou seria interessante colocar essa linha :lp=/dev/null:\ )
:rm=nome_servidor:\ (nome do servidor de impressão na rede)
:rp=nome_impressora:\ (quando for executado o comando "lpr" na máquina remota, o lprng enviará a impressão para a impressora chamada "nome_impressora". Aqui se poderia colocar algo como rp=hp ou rp=hplaserjet)
:sd=/var/spool/lpd/remote:\ (especifica onde fica o diretório do spool de impressão. Note que esse spool fica na máquina local)
:mx#0:\ (tamanho máximo do arquivo a ser impresso. Se o valor for "0" significa que não tem limite)
:sh: (indica que não se deve imprimir a página de banner/rosto que tem o nome da máquina e de usuário. Os dois pontos ":" dizem que a configuração dessa impressora acaba aqui)
Obs1: sempre que modificar o "/etc/printcap" é necessário restatar o serviço com o comando "/etc/init.d/lpd". Também, poderia usar o comando "lpc restart lp". Esse comando restarta a impressora "lp" com as novas configurações. Em vez do "lp" poderia colocar "all" para restartar todas as impressoras.
Obs2: existe também a opção para filtros que é iniciada com "if". Exemplo: ":if=/usr/local/bin/meu_filtro:\". É recomendado estudar e saber sobre filtros, PostScript e GhostScript para que tudo ocorra bem durante as impressões.
Removendo os Filtros
# lpr -l texto.txt (especifica que o arquivo que vai ser impresso ja esta formatado e deve ser enviado para o destino sem filtros. Isso e importante quando se quer fazer um bypass nas configuracoes de filtros que estao dentro de "/etc/printcap")
# lpr -o raw texto.txt (idem)
Transformando uma máquina num servidor de impressão
# apt-get install lprng (é o "lpr" next generation. Contém funcionalidade avançadas em relação ao "lpr")
# vi /etc/lprng/lpd.perms (deve colocar aqui os nomes dos equipamentos que podem imprimir na impressora local)
ACCEPT HOST=workstation01.local SERVICE=X,R,P,Q,M,C (essa linha diz que o host chamado "workstation.local" poderá imprimir e aceitará os serviços (SERVICE) de conexão remoto (X), lpr (R), impressão de trabalhos (P), lpq (Q), lprm (M) e lpc (C) de tal máquina)
Obs1: sempre que modificar o "/etc/lprng/lpd.perms" é necessário restatar o serviço com o comando "/etc/init.d/lpd restart" e o "/etc/init.d/lprng restart"
Obs2: sempre que é instalado o "lprng" um novo arquivo "printcap" vai ser criado dentro de "/etc/lprng/printcap".
Obs3: dentro do arquivo de configuração do samba (smb.conf) existem várias entradas para o "printcap".
Também é possível imprimir numa impressora compartilhada no Windows
# vi /etc/printcap
# EPSON LX300
epson:\
:sd=/var/spool/lpd/epson:\
:mx#0:\
:sh:\
:if=/var/spool/lpd/epson/filter:\
:lp=/dev/null:
Salve e Saia
# /etc/init.d/lpd restart
# vi /var/spool/lpd/epson/.config
share='\\meriadoc\epsonLX'
hostip=192.168.1.49
Salve e Saia
# lpc up epson (levanta a impressora epson)
# lpc enable epson (habilita para aceitar jobs)
# lpr -Pepson file.txt (teste)