私はLinux(Fedora 22)システムと2つの熱転写プリンタを持ち、それぞれDigitusプリントサーバーに接続しています。すべて同じLANにあります。各DigitusプリントサーバーはLPDデーモンを実行し、それぞれ1つのキューのみを提供するように構成されています lpd://192.168.1.2/queue
。lpd://192.168.1.3/queue
LPRクライアントのみを使用して(フルCUPSをインストールせずに)FedoraからLPDサーバーにlprファイルを転送できるようにしたいです。 lprバイナリをインストールしてリモートプリントサーバーを/ etc / printcapに追加するcup-client(dnf install cup-client)を試しましたが、Bad file descriptor
lprを実行するたびにエラーが発生します。
どんなアイデアがありますか?
答え1
私は非常によい解決を見つけました: rlpr。 (ここ興味のある方のためにリンクをお届けします。すべてのアイテムは古いgemですが、rlprページの一番下までスクロールしてください.)
rlprは私にとって必須です。これは、リモートプリンタをローカルで宣言せずに(たとえば/ etc / printcap)、LPRプロトコルを介してリモートLPDデーモンと直接通信します。
rlpr --printer=queue@remotehost file_to_print
tar.gzをダウンロードし、バイナリを設定して作成しました(インストールもしませんでした)。
答え2
rlprなどのクライアント専用機能を使用するときに留意すべき1つは、印刷要求を生成する非対話型バッチプロセスまたは同様のプロセスであり、クライアントシステムとプリンタ/スプーラの間にギャップがある場合です。ネットワークの中断が発生すると、最良の場合はリストが失われ、最悪の場合はバッチ操作が失敗します。
これは、CUPS/LPRng/classic LPDなどのローカルデーモン機能が必要な理由の1つです。ここで、lpr クライアントは実際に 127.0.0.1:515 または :631 を受信するローカルデーモンと通信し、そのデーモンを介して要求をプロキシします。デーモンはリポジトリを提供します。これから。
ネットワークの中断や障害によってこのプロセスが中断される可能性はありません。クライアントは印刷要求を正常に送信し、ローカルデーモンは要求を受け入れ、lpd /whateverデーモンは成功するまでリストを最終宛先に転送し続けます。リストは失われず、バッチジョブ/何でも正常に続行されます。
rlprを使用すると、ネットワークがダウンすると運が悪くなります。
これは、lpr.cupsクライアントを使用しますが、-Hを使用してリモート印刷スプーラ/プリンタを直接指す場合でも問題になります。失敗は回復できません。
これはインタラクティブな使用では問題ではありませんが、自動化されたプロセスでは心に留めておくべきことです。
答え3
RFC 1179それ以外の場合、クライアントの作成は難しくありません。ほとんどのタスクはエラーを確認し、入力を正しくフォーマットすることです。
#!/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 .= "\0"; # 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 "\0";
}
答え4
Fedora は、CUPS をプリントサーバーとして使用して、ローカルおよびリモートプリンタを処理します。私が知っている限り、(レガシー、廃止)LPまたはLPRプロトコルを使用する基本パッケージはなく、しばらくありませんでした。 CUPSは今日の事実上の印刷標準です。探す公開印刷特定の獣を扱う方法についてのアドバイスを得る。
あなた可能幸運な場合は、関連するクライアントとサーバーのソースコードを取得して実行できます。おそらくそれほど価値はありません。しかし、今あなたの時間です。
ここに成功(または失敗)の経験を回答として追加します。