다음 이전 차례

11. 네트웍으로 연결된 프린터를 이용하여 출력하기

(How to print to a printer over the network) lpd는 네트웍으로 연결된 다른 기계에 연결된 프린터를 통해서 출력하는 것을 지원한다. 필터 및 적절한 유틸리티를 이용한다면 모든 네트웍 환경에서 lpr을 이용해서 쉽게 출력할 수 있다.

11.1 유닉스/lpd 호스트로 출력 (To a Unix/lpd host)

원격지의 기계가 당신의 리눅스 박스에 연결된 프린터로 출력하는 것을 허가하려면 /etc/hosts.equiv나 /etc/hosts.lpd에 해당기계(의 주소나 이름)를 등록해야 한다.

(hosts.equiv에는 다른 역할을 하는 호스트의 이름도 담고 있다. 임의의 기계를 등록한다면 신중하게 하라) /etc/printcap의 "rs" 특성을 이용하여 다른 기계의 특정 사용자만 당신의 프린터에 접근할 수 있도록 지정할 수 있다; 여기에 대한 자세한 것은 lpd의 맨페이지를 참고하라.

11.2 lpd를 이용하자 (With lpd)

다른 기계로 출력하려면 /etc/printcap에 다음과 같이 정의해야 한다.

# REMOTE djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:rm=machine.out.there.com:\
:rp=printername:\
:lp=/dev/null:\
:sh:
remote machine으로 출력하는 경우에도 lpd가 돌아가는 local machine (자신의 리눅스 박스)에 스풀디렉토리가 존재한다는 점에 주목하라. 만약 remote machine이 다른 작업때문에 바쁘거나 전원이 꺼진 상태라면 local machine에서 지시한 프린트 작업은 스풀 영역(예. 스풀디렉토리)에 대기하고 있다가 출력이 가능해지만 다시 전송된다.

11.3 rlpr을 이용하자(With rlpr)

lpd의 환경을 설정하는 골치아픈 과정을 거칠 필요 없이 rlpr을 이용한다면 각각의 프린트 작업을 곧바로(directly) remote machine의 프린트 큐로 전송 한다.아주 가끔씩 여러 종류의 프린터를 사용하는 환경에서 유용하다 . rlpr 발표문에서 인용하면: rlpr은 TCP/IP 를 이용하여 프린트 작업을 네트웍 상의 위치에 제약받지 않고 lpd 서버로 전송할 수 있다. lpr과는 달리 작업을 전송하는 측의 기계에게(local machine) 원격지의 기계(remote machine)가 등록될(예를 들어 /etc/printcap) 필요가 없다. 따라서, rlpr은 좀 더 유연하고 (상대적으로) 관리가 편하다. rlpr은 lpr이 사용되는 모든 환경에서 사용가능하며, 전통적인 BSD lpr과 하위호환성(backwares compatible)을 가진다. rlpr의 훌륭한 점은 특정 시스템에 대해서 고려 할 필요없이 모든 곳에서 전송/출력이 가능하다는 것이다. 또한 전통적인 lpr처럼 필터로 작동하여 원격지의 기계에서 실행되는 netscape, xemacs 등의 클라이언트 프로그램에서 local machine으로 쉽게 출력할 수 있다. rlpr은 선사이트(SunSite)에서 구할 수 있다. < sunsite.unc.edu/pub/Linux/system/Printing/>.

11.4 윈도 95/NT, LanManager, Samba로 연결된 프린터로 출력

lpd 큐에 들어있는 프린트 작업의 내용을 smbclient (samba패키지중 일부) 를 이용해서 TCP/IP기반의 SMB 프린트 서버로 직접 전송이 가능하다.samba 패키지의 smbprint라는 스크립트 파일을 이용하면 된다. 간단히 설명하면, 스풀 디렉토리에 특정 프린터용 설정 파일을 집어 넣고, smbprint 스크립트 를 /etc/printcap의 "if"로 설치하면 된다. /etc/printcap의 내용은 다음과 비슷할 것이다.

lp|remote-smbprinter:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lp:\
:if=/usr/local/sbin/smbprint:
smbprint 스크립트에 포함된 문서를 반드시 읽어 볼 것을 권장한다. lpd를 필요로 하지 않고 smbclinet를 이용하여 SMB printing 서버로 파일을 직접 전송하는 방법도 가능하다. 자세한 것은 맨페이지를 참고하라.

11.5 네트웨어 프린터 사용(To a NetWare Printer)

"ncpfs" 패키지에 포함된 nprint는 NetWare 환경에서 smbprint와 동일한 기능을 수행한다. ncpfs는 < linux01.gwdg.de/pub/ncpfs/> 에서 구할 수 있다. 다음은 LSM의 내용이다.

version 0.16:
With ncpfs you can mount volumes of your netware server under
Linux. You can also print to netware print queues and spool netware
print queues to the Linux printing system. You need kernel 1.2.x or
1.3.54 and above. ncpfs does NOT work with any 1.3.x kernel below
1.3.54.   
lpd를 통하여 nprint가 작동하기 위해서는 NetWare(로 연결된)프린터로 (표준)출력을 넘기는 작은 쉘 스크립트를 작성하여 이것을 lpd 프린터 큐 의 "if"로 설치해야 한다. 다음의 내용과 비슷할 것이다.
sub2|remote-NWprinter:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/sub2:\
:if=/var/spool/lpd/nprint-script:
nprint-script의 내용은 다음과 같다.
#! /bin/sh
/usr/local/bin/nprint -S net -U name -P passwd -q printq-q
-

11.6 EtherTalk (애플) 프린터로 출력(To an EtherTalk (Apple) printer)

netatalk 패키지에는 nprint나 smbclient와 비슷한 역할을 하는 프로그램이 있다. Werner Eugster의 문서에서 애플 네트웍에서의 프린터 출력 과정에 대해 자세히 설명하고 있다. 그의 홈페이지를 참고하라. < garnet.berkeley.edu/~weugster/appleprint.html> 확실하지 못한 소문 : Netatalk는 DEC tulip 칩을 장착한 SMC Etherpower PCI카드에서는 작동하지 않는다고 한다.

11.7 HP 및 기타 네트웍 프린터로 출력(To an HP or other ethernet printer)

HP및 일부 프린터에 있는 ethernet 인터페이스를 이용하면 lpd를 이용해서 자료를 직접 전송/출력할 수 있다. 프린터나 이더넷 어댑터에 포함된 매뉴얼 을 자세히 읽고 그 지시대로 따르면 된다. 보통 이들 프린터는 lpd를 실행 하면서 하나 이상의 논리적 프린터 큐를 제공한다. HP 제품은 다음과 같이 /etc/printcap에 설정될 수 있다.

lj-5|remote-hplj:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lj-5:\
:rm=printer.name.com:rp=raw:
규모가 큰 곳에서, 특히 몇몇 프린터가 PS를 지원하지 못할 만큼 크다면, 전용의 print server를 구축하고 그 서버로 모든 프린터 작업을 전송하여 그 서버에서 Ghostscript 작업이 수행되어 처리되는 것이 바람직하다.

오래된 HP 제품(To older HPs)

일부 프린터(또는 "블랙박스"로 칭하는 네트웍 제품들)는 순수한 TCP 접속과정의 표준이 아닌 방법만을 지원한다. 이러한 범주에 속하는 제품에는 JetDirect 초기 모델(일부 JetDirectEx 제품 포함)이 있다. 기본적으로, 이들 프린터로 출력하려면 특정 포트로 (주로 9100) tcp 접속을 하여 프린터 작업 자료를 전송하면 된다. 이것을 구현하는 방법 은 여러가지가 있으나, 다음에서는 Perl을 이용햇다.


#!/usr/bin/perl
# Thanks to Dan McLaughlin for writing the original version
of this
# script (And to Jim W. Jones for sitting next to Dan when
writing me
# for help ;)
$fileName = @ARGV[0];
open(IN,"$fileName") || die "Can't open file
$fileName";
$dpi300 = "\x1B*t300R";
$dosCr = "\x1B&amp;k3G";
$ends = "\x0A";
$port = 9100 unless $port;
$them = "bach.sr.hp.com" unless $them;
$AF_INET = 2;
$SOCK_STREAM = 1;
$SIG{'INT'} = 'dokill';
$sockaddr = 'S n a4 x8';
chop($hostname = `hostname`);
($name,$aliases,$proto) = getprotobyname('tcp');
($name,$aliases,$port) = getservbyname($port,'tcp')
unless $port =~ /^\d+$/;;
($name,$aliases,$type,$len,$thisaddr) =
gethostbyname($hostname);
($name,$aliases,$type,$len,$thataddr) = gethostbyname($them);
$this = pack($sockaddr, $AF_INET, 0, $thisaddr);
$that = pack($sockaddr, $AF_INET, $port, $thataddr);
if (socket(S, $AF_INET, $SOCK_STREAM, $proto)) {
# print "socket ok\n";
}
else {
die $!;
}
# Give the socket an address.
if (bind(S, $this)) {
# print "bind ok\n";
}
else {
die $!;
}
# Call up the server.
if (connect(S,$that)) {
# print "connect ok\n";
}
else {
die $!;
}
# Set socket to be command buffered.
select(S); $| = 1; select(STDOUT);
# print S "@PJL ECHO Hi $hostname! $ends";
# print S "@PJL OPMSG DISPLAY=\"Job $whoami\"
$ends";
# print S $dpi300;
# Avoid deadlock by forking.
if($child = fork) {
print S $dosCr;
print S $TimesNewR;
while (<IN>) {
print S;
}
sleep 3;
do dokill();
} else {
while(<S>) {
print;
}
}
sub dokill {
kill 9,$child if $child;
}

11.8 remote printer용 if 실행 (Running an if for remote printers)

lpd의 특징은 원격지의 프린터(remote printer)용 "if"는 실행되지 않는다는 것이다. "if"를 실행하기 위해서 두개의 프린터를 정의하고 프린터 작업을 한번 더 처리한다. 그러한 예로 다음의 printcap을 참고하라.


lj-5:remote-hplj:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lj-5:\
:if=/usr/lib/lpd/filter-lj-5:
lj-5-remote:lp=/dev/null:sh:rm=printer.name.com:\
:rp=raw:sd=/var/spool/lpd/lj-5-raw:
filter-lj-5 script의 내용은 다음과 같다.
#!/bin/sh
gs <options> -q -dSAFER -sOutputFile=- - | \
lpr -Plj-5-remote -U$5

-U 옵션으로 lpr은 (복사본인)lpr이 대몬(daemon)으로 실행되고 있다면 처음 출력 명령을 지시한 사람의 이름이 다시 처리되는 프린터 작업에 동일 하게 지정된다. username을 받는 방법으로 좀 더 나은(robust)방법을 사용해 야 할 것이다. 왜냐하면 특별한 경우 $5(argument 5)가 아닐수도 있다. printcap의 맨페이지를 참고하라.
다음 이전 차례