?? printing-howto-11.html
字號(hào):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
<TITLE>The Linux Printing HOWTO 中文版: 如何列印到網(wǎng)路印表機(jī)</TITLE>
<LINK HREF="Printing-HOWTO-12.html" REL=next>
<LINK HREF="Printing-HOWTO-10.html" REL=previous>
<LINK HREF="Printing-HOWTO.html#toc11" REL=contents>
</HEAD>
<BODY>
<A HREF="Printing-HOWTO-12.html">Next</A>
<A HREF="Printing-HOWTO-10.html">Previous</A>
<A HREF="Printing-HOWTO.html#toc11">Contents</A>
<HR>
<H2><A NAME="s11">11. 如何列印到網(wǎng)路印表機(jī)</A></H2>
<P>Lpd 的一個(gè)特性便是可以透過網(wǎng)路將報(bào)表列印到實(shí)體連接在其它機(jī)器上的印表機(jī).
只要仔細(xì)地組合 filter 命令稿和相關(guān)的工具程式, 你就可以讓 lpr 得以透通地
(transparently) 列印到各種網(wǎng)路上的印表機(jī).
<P>
<H2><A NAME="ss11.1">11.1 列印至 Unix/lpd</A>
</H2>
<P>要讓遠(yuǎn)端的機(jī)器能夠使用你的印表機(jī)列印, 你必須將遠(yuǎn)端機(jī)器列名在
<EM>/etc/hosts.equiv</EM> 或是 <EM>/etc/hosts.lpd</EM> 檔案之中.
(要注意 <EM>hosts.equiv</EM> 還有其它很多作用; 如果你要將一部機(jī)器列在這兒,
請(qǐng)確定你知道你在做什麼). 你也可以利用 <EM>rs</EM>
屬性來限定其它機(jī)器上的某些特定使用者才能使用你的印表機(jī). 請(qǐng)看 <CODE>
<A HREF="http://www.picante.com/~gtaylor/pht/man/lpd.8.html">lpd</A></CODE> 的線上手□以取得這方面的訊息.
<P>
<H3>用 <CODE>lpd</CODE></H3>
<P>要列印到另一部機(jī)器, 你要在 <EM>/etc/printcap</EM> 中加上這樣的記錄,
<BLOCKQUOTE><CODE>
<PRE>
# REMOTE djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:rm=machine.out.there.com:\
:rp=printername:\
:lp=/dev/null:\
:sh:
</PRE>
</CODE></BLOCKQUOTE>
請(qǐng)注意在本地的機(jī)器還是要有一個(gè)由 <CODE>lpd</CODE> 管理的列印暫存器目錄.
如果遠(yuǎn)端的機(jī)器離線或是忙不過來,
列印工作會(huì)留在本地的暫存區(qū)中直到送出去為止.
<P>
<H3>用 <CODE>rlpr</CODE></H3>
<P>你也可以用 <EM>rlpr</EM> 將列印工作直接送到遠(yuǎn)端機(jī)器的佇列中,
省下設(shè)定 lpd 的麻煩. 假如你偶爾才要列印到其它不同的印表機(jī),
這個(gè)方法就最有用. 引一段 <EM>rlpr</EM> 的聲明:
<P>
<P>rlpr 利用 TCP/IP 將列印工作送到網(wǎng)路上任何位置的 lpd 伺服器.
<P>
<P>與 lpr 不同的是, 你列印來源端的機(jī)器 *不需要* 明確地知道遠(yuǎn)端的印表機(jī),
(例如透過 <EM>/etc/printcap</EM>) 因此有相當(dāng)大的彈性,
管理的負(fù)擔(dān)也比較輕.
<P>
<P>
<P>rlpr 可以用在任何使用傳統(tǒng) lpr 的地方, 而且和傳統(tǒng)的 BSD lpr 相容.
<P>
<P>rlpr 最大的好處在於可以 *從任何地方列印到任何地方*
而不用管列印來源端的系統(tǒng)設(shè)定. 它可以像傳統(tǒng)的 lpr 做為一個(gè) filter,
而讓在遠(yuǎn)端機(jī)器上執(zhí)行的客戶端像 netscape, xemacs
等能夠輕易地列印報(bào)表到你本地的機(jī)器.
<P>
<P>你可以在 <CODE>
<A HREF="ftp://sunsite.unc.edu/pub/Linux/system/printing/">SunSite</A></CODE> 找到 rlpr.
<P>
<H2><A NAME="ss11.2">11.2 列印到 Win95, WinNT, LanManager, 或 Samba 上的印表機(jī)</A>
</H2>
<P>在 Printing to Windows mini-HOWTO 中有比這兒更多的資訊.
<P>透過 <CODE>
<A HREF="http://www.picante.com/~gtaylor/pht/man/smbclient.1.html">smbclient</A></CODE>
這個(gè)程式 (samba 套件的一部份) 可以將 lpd 佇列導(dǎo)向到架構(gòu)在 TCP/IP
之上的 SMB 列印服務(wù). Samba 包含了一個(gè)命令稿 <CODE>smbprint</CODE> 來做這件事.
簡(jiǎn)單地說, 替這樣的印表機(jī)在列印暫存器工作目錄 (spool directory) 中加上設(shè)定檔,
然後將 <EM>if</EM> 設(shè)為 <CODE>smbprint</CODE> 命令稿.
<P>在 <EM>/etc/printcap</EM> 中的記錄看起來應(yīng)該像這個(gè)樣子:
<BLOCKQUOTE><CODE>
<PRE>
lp|remote-smbprinter:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lp:\
:if=/usr/local/sbin/smbprint:
</PRE>
</CODE></BLOCKQUOTE>
<P>你應(yīng)該閱讀一下 <CODE>smbprint</CODE> 命令稿中的說明以得到更多相關(guān)的訊息.
<P>你也可以不管 <CODE>lpd</CODE>, 直接用 <CODE>smbclient</CODE> 將檔案送到 SMB
列印服務(wù). 請(qǐng)參照線上手□.
<P>
<H2><A NAME="ss11.3">11.3 列印到 NetWare 上的印表機(jī)</A>
</H2>
<P>ncpfs 套件中包含了一個(gè)名為 <CODE>nprint</CODE> 的工具程式, 它提供如同 <CODE>smbprint</CODE>
一般的功能, 只不過適用的對(duì)象是 Netware. 你可以在
<A HREF="ftp://sunsite.unc.edu/pub/Linux/system/filesystems/ncpfs/">SunSite</A> 取得 ncpfs.
下面是從 0.16 版的 LSM 中節(jié)錄出來的:
<BLOCKQUOTE>
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.
<P>利用 ncpfs, 你可以在 Linux 下掛上你的 netware 伺服器上的目錄.
你也可以列印到 netware 的列印佇列以及將 netware 的列印佇列排存(spool)
到 Linux 的列印系統(tǒng). 你需要 1.2.x 或 1.3.54 以上(含 1.3.54) 的核心. ncpfs
無法在 1.3.54 以前的任何一版 1.3.x 核心下運(yùn)作.
</BLOCKQUOTE>
<P>
<P>要使 <CODE>nprint</CODE> 透過 lpd 運(yùn)作, 你要寫個(gè)小小的 shell script 將 stdin
列印到 Netware 上的印表機(jī), 并設(shè)成 lpd 列印佇列的 <EM>if</EM>. 你可能會(huì)有:
<BLOCKQUOTE><CODE>
<PRE>
sub2|remote-NWprinter:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/sub2:\
:if=/var/spool/lpd/nprint-script:
</PRE>
</CODE></BLOCKQUOTE>
<CODE>nprint-script</CODE> 看起來可能大致上像:
<BLOCKQUOTE><CODE>
<PRE>
#! /bin/sh
# You should try the guest account with no password first!
/usr/local/bin/nprint -S net -U name -P passwd -q printq-name -
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H2><A NAME="ss11.4">11.4 列印到 EtherTalk (Apple) 上的印表機(jī)</A>
</H2>
<P>netatalk 套件包含了像 <CODE>nprint</CODE> 和 <CODE>smbclient</CODE> 的東西.
其他人已經(jīng)寫下了使用 Apple 網(wǎng)路列印的程序, 遠(yuǎn)比我所能寫的好得多; 請(qǐng)參閱
<A HREF="http://thehamptons.com/anders/netatalk/">Linux Netatalk-HOWTO</A>.
<P>
<H2><A NAME="ss11.5">11.5 列印到 HP 或其它的以太網(wǎng)路(ethernet) 印表機(jī)</A>
</H2>
<P>有些 HP 和其它廠牌的印表機(jī)提供了可以直接用 lpd 列印的以太網(wǎng)路介面.
你應(yīng)該遵照印表機(jī)或其網(wǎng)路介面所附的指示, 但是通常這種印表機(jī)上 "跑" 的是 lpd,
而且提供一到多個(gè)你可以使用的佇列. 舉例來說, 一部 HP 可能可以用這樣的 printcap:
<BLOCKQUOTE><CODE>
<PRE>
lj-5|remote-hplj:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lj-5:\
:rm=printer.name.com:rp=raw:
</PRE>
</CODE></BLOCKQUOTE>
<P>具有 Jet Direct 介面的 HP Laserjet 印表機(jī)通常支援兩個(gè)內(nèi)建的 lpd 佇列 - "raw"
接受 PCL (可能也接受 Postscript), 以及 "text" 接受單純的 ascii
(而且會(huì)自動(dòng)地克服階梯效應(yīng)). 如果你有的是 JetDirect Plus3 三埠的介面,
佇列的名稱則為 "raw1", "text2" 等等.
<P>在一個(gè)大型的環(huán)境, 特別是個(gè)有些印表機(jī)不支援 PostScript 的大型環(huán)境中,
架設(shè)一部專門的列印伺服器, 讓所有的機(jī)器都列印到這部伺服器并讓所有的 ghostscript
工作都在這部伺服器上面執(zhí)行可能會(huì)有用.
<P>這樣子也可以讓你的 Linux 做為印表機(jī)的排存伺服器(spool server),
如此一來你的網(wǎng)路使用者便可以快一點(diǎn)完成他們的列印工作然後繼續(xù)手邊的事情,
而不必等待印表機(jī)印完先前別人所送出的報(bào)表.
<P>要這樣做, 先在你的 linux 機(jī)器上設(shè)定一個(gè)列印佇列指到配有以太網(wǎng)路介面 HP LJ
(如前所述). 現(xiàn)在將所有在你區(qū)域網(wǎng)路上的客戶端設(shè)定指到這個(gè) Linux 佇列
(如前面□例中的 lj-5).
<P>有些 HP 網(wǎng)路印表機(jī)似乎不理會(huì)客戶端送出的標(biāo)題頁(banner page) 設(shè)定.
你可以關(guān)掉它們內(nèi)部自行產(chǎn)生的標(biāo)題頁, 用 telnet 連接到印表機(jī), 按兩下 return 鍵,
打入 "banner: 0", 接著打入 "quit". 還有其它可以調(diào)整的設(shè)定也是用這個(gè)方式; 打入
"?" 可以看到它們的表列.
<P>
<H3>列印到比較舊的 HP 印表機(jī)</H3>
<P>有些印表機(jī) (或是將印表機(jī)連上網(wǎng)路的裝置) 只支援很陽春的 TCP 連線.
在這一類中值得注意的是早期的 JetDirect (包括一些 JetDirectEx) 介面卡. 基本上,
要列印到這類的印表機(jī), 你必須建立到某個(gè)特定埠 (典型是在 9100,
或是三埠機(jī)種的 9100, 9101 和 9102) 的 TCP 連接, 然後將你的報(bào)表送進(jìn)去. 這可以用
Perl 來實(shí)做, 或是用其它的方式:
<P>
<BLOCKQUOTE><CODE>
<PRE>
#!/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&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;
}
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H2><A NAME="ss11.6">11.6 替遠(yuǎn)端印表機(jī)執(zhí)行 <EM>if</EM></A>
</H2>
<P>lpd 一個(gè)不尋常的地方在於如果是遠(yuǎn)端印表機(jī), <EM>if</EM> 不會(huì)被執(zhí)行.
如果你發(fā)現(xiàn)你需要執(zhí)行 <EM>if</EM>, 你可以設(shè)定雙重佇列(double queue) 并重新佇列報(bào)表.
舉個(gè)例子, 看一下這個(gè) <EM>printcap</EM>:
<BLOCKQUOTE><CODE>
<PRE>
lj-5:\
: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:
</PRE>
</CODE></BLOCKQUOTE>
和相關(guān)的 <CODE>filter-lj-5</CODE> 命令稿(script):
<BLOCKQUOTE><CODE>
<PRE>
#!/bin/sh
gs <options> -q -dSAFER -sOutputFile=- - | \
lpr -Plj-5-remote -U$5
</PRE>
</CODE></BLOCKQUOTE>
<P>只有在 lpr 以監(jiān)控程式(daemon) 模式執(zhí)行的時(shí)候, <EM>-U</EM> 選項(xiàng)才有作用,
這個(gè)選項(xiàng)會(huì)正確地設(shè)定第二重佇列中的送件人姓名.
你可能應(yīng)該用更可靠的方法取得送件人姓名, 因?yàn)橛行r(shí)候它并不是第五個(gè)參數(shù).
請(qǐng)參照 <EM>
<A HREF="http://www.picante.com/~gtaylor/pht/man/printcap.5.html">printcap</A></EM>
的線上手□.
<P>
<H2><A NAME="ss11.7">11.7 從 Windows 列印</A>
</H2>
<P>利用 SAMBA 套件可以直接支援以 SMB 協(xié)定從 Windows (或許 OS/2) 客戶端列印到 Linux
伺服器, 這個(gè)套件同時(shí)也支援將你的 Linux 檔案系統(tǒng)分享給 Windows 客戶端.
<P>Samba 包含了相當(dāng)完整的文件, 也有一份很不錯(cuò)的 Samba FAQ 涵蓋到這方面的內(nèi)容.
你可以在 Linux 上設(shè)置 magic filter 然後以 PostScript 列印, 或是在每一部 Windows
機(jī)器上安裝印表機(jī)專用的驅(qū)動(dòng)程式然後為他們?cè)O(shè)定一個(gè)不用任何 filter 的佇列. 使用
Windows 驅(qū)動(dòng)程式有些時(shí)候會(huì)有比較好的輸出, 但是如果有很多部 Windows 機(jī)器,
管理者就比較麻煩. 所以先試試看 PostScript 吧!
<P>
<H2><A NAME="ss11.8">11.8 從 Apple 列印</A>
</H2>
<P>Netatalk 支援由 Apple 客戶端透過 EtherTalk 列印. 請(qǐng)參照
<A HREF="http://thehamptons.com/anders/netatalk/">Netatalk HOWTO Page</A>
以取得更進(jìn)一步的資訊.
<P>
<H2><A NAME="ss11.9">11.9 從 Netware 列印</A>
</H2>
<P>ncpfs 套件含有一個(gè)叫作 pserver 的監(jiān)控程式(daemon) 可以提供服務(wù)給 NetWare
的列印佇列. 據(jù)我所了解, 這個(gè)系統(tǒng)必須搭配 Bindery-based 的 NetWare, 像是
2.x, 3.x, 或是使用 bindery 存取的 4.x 版本.
<P>要取得更進(jìn)一步關(guān)於 ncpfs 和其 pserver 程式的資訊, 請(qǐng)參照
<A HREF="ftp://ftp.gwdg.de/pub/linux/misc/ncpfs/">ncpfs 的 FTP 站</A>.
<P>
<HR>
<A HREF="Printing-HOWTO-12.html">Next</A>
<A HREF="Printing-HOWTO-10.html">Previous</A>
<A HREF="Printing-HOWTO.html#toc11">Contents</A>
</BODY>
</HTML>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -