Como posso imprimir em um servidor de impressão LPD remoto, sem instalar localmente o servidor CUPS

2

Eu tenho uma máquina Linux (Fedora 22) e duas impressoras térmicas com um servidor de impressão Digitus conectado a cada uma. Todos estão na mesma LAN. Todos os servidores de impressão Digitus estão executando o daemon LPD e cada um deles está configurado para oferecer apenas uma fila: lpd://192.168.1.2/queue e lpd://192.168.1.3/queue

Eu só quero poder lprar um arquivo do Fedora para um servidor LPD usando apenas um cliente LPR (sem instalação completa do CUPS). Eu tentei cups-client (dnf install cups-client), que instala o binário lpr e adicionei os servidores de impressão remotos ao meu / etc / printcap, mas recebo Bad file descriptor error sempre que executo o lpr.

Alguma idéia?

    
por Paralife 25.01.2016 / 17:49

4 respostas

1

Eu encontrei uma solução muito boa: rlpr. ( Aqui é um link para qualquer pessoa interessada. Vá até o final da página para rlpr, apesar de todas as entradas são velhas jóias)

O rlpr faz exatamente o que eu preciso: Ele fala o protocolo LPR diretamente com os daemons LPD remotos sem ter que declarar as impressoras remotas localmente (por exemplo, / etc / printcap):

rlpr --printer=queue@remotehost file_to_print

Eu baixei o tar.gz, configurei, criei e usei apenas o binário (eu nem instalei).

    
por 25.01.2016 / 22:48
3

Uma coisa a ser lembrada ao usar uma função somente cliente como o rlpr é que se for um processo em lote não interativo ou algo similar gerando a solicitação de impressão, há uma interrupção de rede entre o sistema cliente e a impressora / spooler melhor a listagem será perdida e, na pior das hipóteses, o trabalho em lote falhará.

Esta é uma das razões para funções do daemon local, como o CUPS / LPRng / classic LPD, em que o cliente lpr realmente conversa com um daemon local ouvindo 127.0.0.1:515 ou: 631, e faz proxy da requisição através desse daemon: o daemon fornece store-and-forward.

Nenhuma interrupção de rede ou falha pode levar esse processo. O cliente submete a solicitação de impressão com êxito, ela é aceita por esse daemon local e, em seguida, o daemon lpd / whatever continua tentando encaminhar a listagem para seu destino final até obter sucesso. A listagem não é perdida e, enquanto isso, o job em lote / o que quer que continue continua com sucesso.

Considerando que, com o rlpr, se a rede falha - você está sem sorte.

Também é um problema se você usa o cliente lpr.cups, mas aponta diretamente para um spooler / impressora de impressão remota usando -H. A falha não é recuperável.

Não é um problema com o uso interativo, mas algo para lembrar com processos automatizados.

    
por 30.07.2018 / 23:17
1

O Fedora usa o CUPS como servidor de impressão, lidando com impressoras locais e remotas. Tanto quanto eu sei, não há pacotes nativos que falam os protocolos LP ou LPR (legados, preteridos), e não existem há algum tempo. O CUPS é o padrão de impressão de hoje em dia. Pesquise OpenPrinting para sugestões sobre como lidar com sua fera em particular.

Você pode ter sorte e pegar fontes para os clientes e servidores relevantes e executá-los. Provavelmente não vale a pena, mas ei, é a sua hora.

Apenas certifique-se de adicionar suas experiências sobre o sucesso (ou não) como uma resposta aqui.

    
por 25.01.2016 / 19:05
1

A RFC 1179 não é tão difícil de escrever para um cliente, com a maior parte do trabalho sendo verificação de erro e obtendo os formatos de entrada certos.

#!/usr/bin/perl # Lobs PostScript at a LPD printer (see RFC 1179). Poorly. Use at own risk, use strict; use warnings; use IO::Socket::INET; use Sys::Hostname qw(hostname); my $printer_addr = shift or die "Usage: $0 host [file.ps|-]\n"; my $file = shift; my $queue = "queue"; # may not be needed? my $client_host = substr hostname(), 0, 31; my $user = substr $ENV{USER}, 0, 31; my $jobnum = sprintf "%03d", rand 1000; my $sock = IO::Socket::INET->new( # if server mandates this, client will need to be run as root, # or Linux capabilities delved into # LocalPort => 721, # RFC 1179 sec 3.1 PeerAddr => $printer_addr, PeerPort => 515, Proto => 'tcp', ReuseAddr => 1, ) or die "$0: could not connect to $printer_addr: $@\n"; # o - Postscript # f - ASCII # l - ASCII, leaving control chars my $control_file = <<"END_CONTROL_FILE"; H$client_host P$user odfA$jobnum$client_host UdfA$jobnum$client_host END_CONTROL_FILE my $control_file_size = length $control_file; my ($data_file_size, $fh); if (defined $file and $file ne '-') { open $fh, '<', $file or die "$0: could not open '$file': $!\n"; $data_file_size = -s $file; } else { $fh = \*STDIN; $data_file_size = 0; } sendcmd(sprintf "%c%s\n", 0x02, $queue); sendcmd(sprintf "%c%u %s\n", 0x02, $control_file_size, "cfA$jobnum$client_host"); $control_file .= "#!/usr/bin/perl # Lobs PostScript at a LPD printer (see RFC 1179). Poorly. Use at own risk, use strict; use warnings; use IO::Socket::INET; use Sys::Hostname qw(hostname); my $printer_addr = shift or die "Usage: $0 host [file.ps|-]\n"; my $file = shift; my $queue = "queue"; # may not be needed? my $client_host = substr hostname(), 0, 31; my $user = substr $ENV{USER}, 0, 31; my $jobnum = sprintf "%03d", rand 1000; my $sock = IO::Socket::INET->new( # if server mandates this, client will need to be run as root, # or Linux capabilities delved into # LocalPort => 721, # RFC 1179 sec 3.1 PeerAddr => $printer_addr, PeerPort => 515, Proto => 'tcp', ReuseAddr => 1, ) or die "$0: could not connect to $printer_addr: $@\n"; # o - Postscript # f - ASCII # l - ASCII, leaving control chars my $control_file = <<"END_CONTROL_FILE"; H$client_host P$user odfA$jobnum$client_host UdfA$jobnum$client_host END_CONTROL_FILE my $control_file_size = length $control_file; my ($data_file_size, $fh); if (defined $file and $file ne '-') { open $fh, '<', $file or die "$0: could not open '$file': $!\n"; $data_file_size = -s $file; } else { $fh = \*STDIN; $data_file_size = 0; } sendcmd(sprintf "%c%s\n", 0x02, $queue); sendcmd(sprintf "%c%u %s\n", 0x02, $control_file_size, "cfA$jobnum$client_host"); $control_file .= "%pre%"; # must pad message sendcmd($control_file); sendcmd(sprintf "%c%u %s\n", 0x03, $data_file_size, "dfA$jobnum$client_host"); binmode $fh; my $buf; while (1) { my $buflen = sysread $fh, $buf, 4096; die "sysread() failed: $!\n" if !defined $buflen; last if $buflen == 0; # EOF syswrite $sock, $buf, $buflen; } syswrite $sock, 0x00, 1 if $data_file_size == 0; # meh, blocks program when input from STDIN #my $resp; #sysread $sock, $resp, 1; # #syswrite $sock, 0x00, 1; sub sendcmd { my $cmd = shift; my $response; syswrite $sock, $cmd, length $cmd; sysread $sock, $response, 1; chomp $cmd; die "$0: unexpected lack of response to '$cmd'\n" if !defined $response; die sprintf "$0: not-zero response to '$cmd': %vx\n", $response if $response ne "%pre%"; } "; # must pad message sendcmd($control_file); sendcmd(sprintf "%c%u %s\n", 0x03, $data_file_size, "dfA$jobnum$client_host"); binmode $fh; my $buf; while (1) { my $buflen = sysread $fh, $buf, 4096; die "sysread() failed: $!\n" if !defined $buflen; last if $buflen == 0; # EOF syswrite $sock, $buf, $buflen; } syswrite $sock, 0x00, 1 if $data_file_size == 0; # meh, blocks program when input from STDIN #my $resp; #sysread $sock, $resp, 1; # #syswrite $sock, 0x00, 1; sub sendcmd { my $cmd = shift; my $response; syswrite $sock, $cmd, length $cmd; sysread $sock, $response, 1; chomp $cmd; die "$0: unexpected lack of response to '$cmd'\n" if !defined $response; die sprintf "$0: not-zero response to '$cmd': %vx\n", $response if $response ne "%pre%"; }     
por 25.01.2016 / 23:48

Tags