麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > FreeBSD > 正文

FreeBSD handbook中文版 11 打印 (2)高級打印機設置 B.Header

2024-07-26 00:29:04
字體:
來源:轉載
供稿:網友
=============================================================
11.4 高級打印機設置
=============================================================

11.4.2 Header Pages 
如果你有很多使用者使用不同的打印機,那么你也許會覺得需要打印header pages。
Header pages,也稱做banner 或burst pages,是用來辨認打出來的工作是屬于誰的。通
常header pages 以粗體的大字,可能再加上外框打出來的,如此,使用者才能快速的在一堆
打出的結果找到屬于自己的部分。不過header page 的缺點就是每個工作都會多使用一張紙
來打印header page。它的功用可能不會超過一分鐘,而最后的下場都是丟進資源回收箱或是
垃圾筒。(不過header pages 是一份工作一張,而不是一個文件一張,所以紙張的浪費可能沒
有你想象的那么嚴重)。
如果你的打印機可以直接打印純文本的話,那么LPD 可以自動為你的輸出加上header 
pages。如果你的打印機是PostScript 的,那么你將會需要額外的程序來產生header page;請
閱讀在PostScript 打印機上打印Header Pages 這一節。
11.4.2.1 啟用header pages 
在簡單的打印機設置這節里,我們在/etc/PRintcap 文件里利用設置sh 以不打印header 
page (sh 即“suppress header”的意思)。如果某一臺打印機要打印header pages 的話,那么只
要將sh 關鍵詞刪除就行了。
看起來是不是很簡單? 
沒錯。你也許需要提供一個輸出用過濾程序將初始化句柄送給打印機。下面是一個適用
于Hewlett Packard PCL 兼容打印機使用的輸出用過濾程序: 
#!/bin/sh 

# hpof - Output filter for Hewlett Packard PCL-compatible printers 
# Installed in /usr/local/libexec/hpof 
printf “/033&k2G” || exit 2 
第39 頁FreeBSD 使用手冊
exec /usr/libexec/lpr/lpf 
我們用of 關鍵詞來指定輸出用過濾程序的路徑。請閱讀輸出用的過濾程序這一節以
取得更多的信息。
下面是一個為我們先前提到的打印機teak 在teak 文件里設置要打印header pages 及輸
出用過濾程序的例子: 

# /etc/printcap for host orchid 

teak|hp|laserjet|Hewlett Packard LaserJet 3Si:/ 
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:/ 
:if=/usr/local/libexec/hpif:/ 
:vf=/usr/local/libexec/hpvf:/ 
:of=/usr/local/libexec/hpof: 
現在,當使用者用teak 打印時,它們每個工作都會有一張header page。如果使用者們
愿意花時間自己找出自己打出的東西,那么它們可以用lpr -h 命令設置不打出header pages; 
請閱讀Header Page 參數以得知更多lpr 的參數。
注意: LPD 打完header page 后會送出form feed 字符。如果你的打印機送出紙張的命令
不是用這個字符,你可以在/etc/printcap 文件中用ff 關鍵詞指定。
11.4.2.2 控制header pages 
如果選擇要打印header pages,LPD 將會產生出long header,這將使用者、機器以及工
作名稱以大字打印在一整頁上。這里有一個例子(kelly 從rose 這臺印機打印outline 這個工
作): 
k ll ll 
k l l 
k l l 
k k eeee l l y y 
k k e e l l y y 
k k eeeeee l l y y 
kk k e l l y y 
第40 頁ll 
FreeBSD 使用手冊
k k e e l l y yy 
k k eeee lll lll yyy y 

y y 
yyyy 
t l i 
t l 
oooo u u ttttt l ii n nnn eeee 
· o u u t l i nn n e e 
· o u u t l i n n eeeeee 
· o u u t l i n n e 
· o u uu t t l i n n e e 
oooo uuu u tt lll iii n n eeee 
r rrr oooo ssss eeee 
rr r o o s s e e 
r o o ss eeeeee 
r o o ss e 
r o o s s e e 
r oooo ssss eeee 
Job: outline 
Date: Sun Sep 17 11:04:58 1995 
LPD 在打印完這些后會送出form feed 字符,使得真正的打印工作會以新的一頁開始打
印(除非你在/etc/printcap 文件為指定的打印機設置了sf (supress form feeds))。
第41 頁FreeBSD 使用手冊
如果你希望LPD 打印short header,那么在/etc/printcap 文件里使用sb (short banner) 
即可。這樣打出來的header page 看起來會像下面這個樣子: 
rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995 
LPD 的默認值是先打印header page 再打印工作。如果你想要調換順序,那么在
/etc/printcap 里使用hl (header last) 即可。
11.4.2.3 統計打印
如果我們打印LPD 內建的header pages,那么在做統計時可能會遇到一個問題:header 
pages 得免費提供。為什么?因為只有控制打印header page 的輸出用過濾程序可以在打印
header pages 時做打印統計,但是這個過濾程序卻沒有使用者及機器的資料或是一個統計資
料文件,所以無法向使用者收錢。我們也不能在文字過濾程序或是轉換用過濾程序(這些過
濾程序可以直接取得使用者及機的資料)將統計結果都“多加上一頁”,因為使用者可以用
lpr -h 命令設置不要打印header page,而你可能就向這些使用者多收了打印header page 的
費用?;旧?,lpr -h 是許多較環保的使用者喜好的參數,你無法鼓勵別人不去使用它。
而修改每個過濾程序使它們都可以打出header page 也是不可行的(雖然這么做就可以正
確的計費)。因為LPD 并不會把使用者有沒有使用-h 的信息傳給過濾程序,這么一來,即
使使用者下了lpr -h 的命令要求不打印header page,它仍然會因為得到一張header page 而
多收取了這個費用。
那么,有什么好辦法呢? 
你可以: 
1. 接收LPD 的缺點,不收取打印header page 的費用。
2. 安裝可以取代LPD 的程序,比如說LPRng 或是PLP。請參考標準Spooler 之外的選擇
這一節所介紹其它可以替代LPD 的程序。
3. 撰寫一個聰明的輸出用過濾程序。在打印header page 及純文本時,如果沒有文字(輸入
用)過濾程序,那么一般的輸出用過濾程序只做初始化打印機以及一些簡單的字符轉換
工作。如果有設置文字過濾程序,那么LPD 只會用輸出用過濾程序來做打印header page 
的工作。事實上,輸出用過濾程序可以根據從LPD 產生的header page 資料來判斷打印
工作的使用者及機器而加以收費。唯一的問題就是輸出用過濾程序會無法取得記錄使用
情況的記錄文件(由af 關鍵詞所指用的記錄文件不會被傳入),但是如果你的記錄文件
是固定的,你可以這個文件直接設置在輸出用過濾程序里。如果你考慮要用這種方式來
第42 頁FreeBSD 使用手冊
處理的話,那么在/etc/printcap 文件使用sh (short header) 關鍵詞使判斷的工作較容
易。上述的做法其實可能是很麻煩的,比較起來,使用者應該會較感謝讓打印header page 
免費的管理者。
# Check arguments 

11.4.2.4 在postscript 打印機上打印header pages 
前面提到LPD 可以為打印機產生合適的純文本header page,當然,因為PostScript 不
能直接打印純文本,所以LPD 產生header page 的工能在PostScript 打印機上是用不到的— 
或是幾乎用不到。
一個直接產生header page 的方法是讓所有的轉換用過濾程序及文字過濾程序產生
header page。過濾程序可以讓使用者及機器的參數產生合適的header page。這個方法的缺點
就是即使使用者以lpr -h 的方式送出工作,它們仍然會得到header pages。
讓我們來試試這個方法。下面的script 可以接收三個參數(使用者名稱、機器名稱以及
工作名稱)并產生PostScript 打印機能打印的header page: 
#!/bin/sh 

# make-ps-header - make a PostScript header page on stdout 
# Installed in /usr/local/libexec/make-ps-header 


# These are PostScript units (72 to the inch). Modify for A4 or 
# whatever size paper you are using: 

page_width=612 
page_height=792 
border=72 

第43 頁if [ $# -ne 3 ]; then 
exit 1 
fi 


user=$1 
host=$2 
job=$3 
date=‘date‘ 


exec cat <<EOF 
%!PS 


save 


$border $border moveto 
FreeBSD 使用手冊
echo “Usage: ‘basename $0‘ <user> <host> <job>” 1>&2 
# Save these, mostly for readability in the PostScript, below. 
# Send the PostScript code to stdout. 
% Make sure we do not interfere with user’s job that will follow 
% Make a thick, unpleasant border around the edge of the paper. 
$page_width $border 2 mul sub 0 rlineto 
0 $page_height $border 2 mul sub rlineto 
第44 頁% 

($user) show 


/y 200 def 
[ (Job:) (Host:) (Date:) ] { 
forall 
/y 200 def 
[ ($job) ($host) ($date) ] { 
FreeBSD 使用手冊
currentscreen 3 -1 roll pop 100 3 1 roll setscreen 
$border 2 mul $page_width sub 0 rlineto closepath 
0.8 setgray 10 setlinewidth stroke 0 setgray 
% Display user’s login name, nice and large and prominent 
/Helvetica-Bold findfont 64 scalefont setfont 
$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto 
% Now show the boring particulars 
/Helvetica findfont 14 scalefont setfont 
200 y moveto show /y y 18 sub def } 
/Helvetica-Bold findfont 14 scalefont setfont 
270 y moveto show /y y 18 sub def 
} forall 

% That is it 

restore 
第45 頁showpage 
EOF 
現在,每個轉換用過濾程序以及文字過濾程序可以在打印前先呼叫這個script 打印出
FreeBSD 使用手冊
header page 然后再打印工作的內容。我們修改之前提過的DVI 轉換用過濾程序使它可以打
印header page: 
#!/bin/sh 

# PSDf - DVI to PostScript printer filter 
# Installed in /usr/local/libexec/psdf 

# Invoked by lpd when user runs lpr -d 

orig_args=”$@” 
fail() { 
echo “$@” 1>&2 
exit 2 

while getopts “x:y:n:h:” option; do 
case $option in 
x|y) ;; # Ignore 
n) login=$OPTARG ;; 
h) host=$OPTARG ;; 
*) echo “LPD started ‘basename $0‘ wrong.” 1>&2 
exit 2 
;; 
esac 
done 
[ “$login” ] || fail “No login name” 
第46 頁FreeBSD 使用手冊
[ “$host” ] || fail “No host name” 
( /usr/local/libexec/make-ps-header $login $host “DVI File” 
/usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args 
注意這個過濾程序如何從參數中取出使用者名稱及機器名稱。雖然這個過濾程序使用了
一些不同的參數(請閱讀過濾程序的運作方式這一節),不過同樣的技巧也可以應用在其它
不同的過濾程序上。
不過就如我們前面所提到的,這個方式雖然很簡單,但是卻讓lpr 命令無法“不打印
header page”(即-h 參數無效)。如果使用者想要少花些錢(如果打印header pages 要收費的
話),那么它們將無法做到。因為每個過濾程序都會為每個工作打印header page。
如果要允許使用者可以自己選擇是否打印header pager,你得使用統計打印Header 
Pages 這里介紹的技巧:寫一個可以判斷由LPD 產生的header page 的輸出用過濾程序,并
由它輸出PostScript 打印機可以處理的資料。這么一來,如果使用者以lpr -h 送出工作, 
LPD 將不會產生header page,且你的輸出用過濾程序也不會。否則,你的輸出用過濾程序
將要根據LPD 送出的資料然后以適當PostScript 碼將header page 送給打印機處理。
如果你的PostScript 打印機是接在串行端口上,那么你可以使用lprps 里提供的輸出用
過濾程序,psof,這個過濾程序會做上述的動作。注意, psof 這個過濾程序將不會為header 
pages 計費。
11.4.3 網絡打印
FreeBSD 支持網絡打?。簩⒐ぷ魉徒o遠程的打印機處理。網絡打印有兩大類型: 
1. 訪問遠程機器所安裝的打印機。你在某一臺機器上的串口或并口上接了一臺打印機,然
后你設置LPD 使該臺打印機可以接收網絡上其它機器來使用。安裝遠程機器上的打印
機這一節將告訴你如何設置。
2. 使用直接接在網絡上的打印機。這種打印機通常有一個額外的網絡接口,以及(或是取
代掉原本的)傳統的串口或并口。這種打印機可能有下列的工作方式: 
a) 它可能可以使用LPD 通訊協議直接接收從其它機器送來的工作。在這種情況下, 
就和一般的機器上面運行LPD 沒什么不同。只要照著安裝遠程機器上的打印機
這一節里的設置即可。
第47 頁FreeBSD 使用手冊
b) 它可能支持網絡數據傳輸接口。這種情況下,你得將打印機“連接”到網絡上的某
一臺機器上,然后讓該機器負責接收工作以及在打印機間傳送資料。請閱讀使用
網絡數據傳輸接口的打印機里關于這類打印機安裝的建議。
11.4.3.1 安裝遠程機器上的打印機
LPD spooling 系統內建有將工作送給網絡上其它執行LPD (或與LPD 兼容)程序的機器
打印的功能。這個功能讓你可以將打印機安裝在一臺機器上,并讓網絡上其它的機器可以使
用。這功能也可以直接配合支持LPD 通訊協議的網絡接口打印機使用。
要使用遠程打印,首先,我們要先按照簡單的打印機設置在打印機服務器上將打印機設
置好。然后也參考高級打印機設置設置你所需要的參數,確定你的打印機可以和LPD 配合
運作。最后要確定本機有在LPD 的已授權使用遠程機器列表里(請閱讀限制來自遠程打印機
的工作這一節)。
如果你是使用兼容于LPD 通訊協議的網絡接口打印機,那么下面討論的打印機服務器
就是這臺打印機,而打印機名稱則是你為打印機設置的名稱。請查閱隨打印機或網絡接口附
的手冊來設置。
在其它要訪問這些網絡打印機的機器上,它們的/etc/printcap 設置文件得這么設置: 
1. 為你的網絡打印機取個名字,為了簡單起見,你可能會把打印機的名稱及別名和打
印機服務器取一樣的名字。
2. 明確地將lp 關鍵詞設置為空(:lp=:)。
3. 建立一個spooling 目錄同時將其位置以sd 關鍵詞指定。LPD 在將工作送給打印機服
務器之前,會將這此工作放在這個目錄下。
4. 將打印機服務器的名稱以rm 關鍵詞指定。
5. 將打印機服務器上的打印機名稱用rp 關鍵詞指定。
這些就足夠了,你不需要在/etc/printcap 文件里將轉換用的過濾程序列出,或是指定
紙張的大小。
下面是一個例子。rose 這臺機器有兩臺打印機, 分別為bamboo 及rattan。我們要讓
orchid 這臺機器上的使用者可以使用這兩臺打印機。下面是orchid 這臺機器上的
/etc/printcap 設置文件(回想要求打印Header Pages 這一節),這個文件里面已經設置teak 
這臺打印機了,我們將要再加入兩臺連接在rose 這臺機器上的網絡打印機: 
第48 頁# 



:if=/usr/local/libexec/ifhp:/ 
:vf=/usr/local/libexec/vfhp:/ 
:of=/usr/local/libexec/ofhp: 




FreeBSD 使用手冊
# /etc/printcap for host orchid - added (remote) printers on rose 
# teak is local; it is connected directly to orchid: 
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:/ 
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:/ 
# rattan is connected to rose; send jobs for rattan to rose: 
rattan|line|diablo|lp|Diablo 630 Line Printer:/ 
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan: 
# bamboo is connected to rose as well: 
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:/ 
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo: 
然后,我們只要在orchid 建立spooling 目錄: 
# mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo 
# chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo 
# chown daemon.daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo 
現在,orchid 上的使用者可以將資料交由rattan 及bamboo 打印。舉例來說,orchid 
上的使用者可以輸入
第49 頁FreeBSD 使用手冊
% lpr -P bamboo -d sushi-review.dvi 
require ‘sys/socket.ph’; 
而orchid 上的LPD 系統將會將工作拷貝到/var/spool/lpd/bamboo spooling 目錄下并
注明它是要打印DVI 的工作。當rose 這臺機器上給bamboo 用的spooling 目錄有空間時, 
這兩個LPD 就會開始溝通將文件傳給rose。然后這工作便進入rose 的隊列直到它被打出為
止。而將DVI 轉換成PostScript(因為bamboo 是PostScript 打印機)的工作將會在rose 這
臺機器上執行。
11.4.3.2 使用網絡數據傳輸接口的打印機
如果你為你的打印機安裝了一塊網卡接口,通常有兩種情況:這個接口具有spooler 的
能力(較貴),或是只是拿來取代串口或并口(較便宜)。這一節要討論的是如何使用較便宜的
那種方式。如果你是選用較貴的接口,請參考前一節:安裝遠程機器上的打印機。
/etc/printcap 設置文件里允許你指定使用串口或是并口,以及(如果你使用串行端口) 
使用什么傳輸速率、哪一種流量控制、是否需要延長轉換換行字符等等。但是,卻沒有一種
方法可以指定以TCP/IP 或是其它的網絡連接端口與打印機連接。
如果要將資料送給這種網絡打印機,你需要一種可以被文字及轉換用過濾過程調用的數
據傳輸程序。這里有一個例子:netprint 這個script 可以讀取標準輸入的資料并將這些資料
送到用網絡連接的打印機。我們在netprint 命令的第一個參數傳入該打印機的機器名稱, 
并使用第二個參數傳送通訊端口的號碼。注意,這個程序只支持單向的傳輸(即從FreeBSD 
到打印機),而很多網絡打印機都支持雙向傳輸,而你可能會想要使用這些功能(如取得打印
機狀態、統計打印情況等)。
#!/usr/bin/perl 

# netprint - Text filter for printer attached to network 
# Installed in /usr/local/libexec/netprint 

$#ARGV eq 1 || die “Usage: $0 <printer-hostname> <port-number>”; 
$printer_host = $ARGV[0]; 
$printer_port = $ARGV[1]; 
第50 頁FreeBSD 使用手冊
($ignore, $ignore, $protocol) = getprotobyname(‘tcp’); 
($ignore, $ignore, $ignore, $ignore, $address) 
= gethostbyname($printer_host); 
$sockaddr = pack(‘S n a4 x8’, &AF_INET, $printer_port, $address); 
socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol) 
|| die “Can’t create TCP/IP stream socket: $!”; 
connect(PRINTER, $sockaddr) || die “Can’t contact $printer_host: $!”; 
while (<STDIN>) { print PRINTER; } 
exit 0; 
然后我們可以在不同的過濾程序里使用這個script。假設我們有一臺連接在網絡上的
Diablo 750-N 行式打印機。這臺打印機用通訊端口5100 接收資料。這臺打印機的名字叫做
scrivener。以下是給這打印機使用的文字過濾程序: 
#!/bin/sh 

# diablo-if-net - Text filter for Diablo printer ‘scrivener’ listening 
# on port 5100. Installed in /usr/local/libexec/diablo-if-net 

exec /usr/libexec/lpr/lpf “$@” | /usr/local/libexec/netprint scrivener 5100 
11.4.4 限制打印機的使用
這一節討論如何限制打印機的使用。LPD 系統可以限制本機及遠程使用打印機的使用
者,設置它們是否可以打印多份、打印工作大小的限制以及打印機隊列的上限。
11.4.4.1 限制打印多份
LPD 系統讓使用者可以很容易地將一個文件打印多份。舉例來說,使用者只要以lpr -#5 
命令就可以將這個工作里的每個文件都打印5 份。不論這些文件里是什么東西。
如果你覺得打印多份會造成打印機的損壞,你可以在/etc/printcap 設置文件里以sc 
關鍵詞關閉lpr 命令的-# 參數。如此,當使用者嘗試以-# 參數送出工作時,它們將看到: 
lpr: multiple copies are not allowed 
注意,如果你允許從遠程使用你的打印機(請閱讀安裝遠程機器上的打印機這一節),那
第51 頁FreeBSD 使用手冊
么你得在遠程機器上的/etc/printcap 文件里也設置sc 關鍵詞,否則使用者仍然可以從遠
程的機器上要求打印多份。
這里有一個例子。這是rose 這臺機器的/etc/printcap 設置文件。rattan 這臺打印機
十分強大,所以我們允許在它上面打印多份,但是bamboo 這臺激光打印機有點弱小,因此
我們在它上面設置了sc 關鍵詞,不允許打印多份: 

# /etc/printcap for host rose - restrict multiple copies on bamboo 

rattan|line|diablo|lp|Diablo 630 Line Printer:/ 
:sh:sd=/var/spool/lpd/rattan:/ 
:lp=/dev/lpt0:/ 
:if=/usr/local/libexec/if-simple: 
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:/ 
:sh:sd=/var/spool/lpd/bamboo:sc:/ 
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:/ 
:if=/usr/local/libexec/psif:/ 
:df=/usr/local/libexec/psdf: 
然后,我們也需要在orchid 這臺機器上的/etc/printcap 設置文件里為網絡打印機加
上sc 關鍵詞(同時,我們也不允許使用者用teak 這臺打印機來做打印多份的工作): 

# /etc/printcap for host orchid - no multiple copies for local 
# printer teak or remote printer bamboo 
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:/ 
:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:/ 
:if=/usr/local/libexec/ifhp:/ 
:vf=/usr/local/libexec/vfhp:/ 
:of=/usr/local/libexec/ofhp: 
rattan|line|diablo|lp|Diablo 630 Line Printer:/ 
第52 頁FreeBSD 使用手冊
:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan: 
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:/ 
:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc: 
使用sc 關鍵詞之后,我們可以防止使用者使用lpr -#,但是無法防止使用者執行多次
lpr,或是在一個工作里將同樣的文件送好幾次,像這樣: 
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:/ 
:if=/usr/local/libexec/psif:/ 
% lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign 
有很多方式可以防止這個濫用(包括忽略它),你可以自己嘗試看看。
11.4.4.2 限制訪問打印機
你可以使用UNIX 下群組的機制及/etc/printcap 設置文件的rg 關鍵詞來控制誰可以
使用哪臺打印機。只要將允許訪問打印機的使用者放在某一個群組中,然后用rg 關鍵詞指
定這個群組名稱即可。
在這個群組之外的使用者(包括root)將會看到“lpr: Not a member of the restricted 
group” 如果它們嘗試使用被限制使用的打印機。和sc (禁止打印多份)一樣,如果你覺得
需要限制遠程使用者使用你的打印機,你也得在遠程機器上的設置文件里設置rg 關鍵詞。
(請閱讀安裝遠程機器上的打印機這一節)。
我們將讓所有人都可以使用rattan 這臺打印機,但是只有在artists 群組里的人可以
使用bamboo 這臺打印機。下面是rose 這臺機器的/etc/printcap 設置文件: 

# /etc/printcap for host rose - restricted group for bamboo 

rattan|line|diablo|lp|Diablo 630 Line Printer:/ 
:sh:sd=/var/spool/lpd/rattan:/ 
:lp=/dev/lpt0:/ 
:if=/usr/local/libexec/if-simple: 
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:/ 
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:/ 
第53 頁FreeBSD 使用手冊
:df=/usr/local/libexec/psdf: 
我們在這里不修改其它的/etc/printcap 設置文件(比如說orchid 機器上的)。這么一來, 
所有orchid 機器上的使用者都可以用bamboo 來打印。通常這種情況是因為orchid 上的使
用者不多且希望它們都可以訪問打印機。
注意: 每個打印機只能使用一個群組名稱來做限制。
11.4.4.3 限制提交工作的大小
如果你有很多使用者在使用打印機,你也許會想要設置使用者能傳過來打印的文件大小
限制。畢竟,在我們spooling 目錄所在的文件系統空間有限,而你得確保有足夠的空間給其
它的使用者在打印時用。
LPD 讓你可以用mx 關鍵詞限制一個打印工作中的文件大小,以BUFSIZ 區塊為單位, 
每一塊大小為1024 字節。如果你將值設置為0,那么表示對文件大小沒有限制。如果沒有
使用mx 關鍵詞的話,那么默認的大小是1000 個區塊。
注意: 這些限制將會套用在打印工作中的文件,而不是整個打印工作的大小。
LPD 不會拒絕接收一個文件大小超過你為打印機設置上限的文件。而會盡量將該文件
小于上限的資料放入緩存并打出,而超出上限的資料則取消。這是不是一個正確的處理方式
還有待爭議。
讓我們為我們舉例的打印機rattan 和bamboo 設置上限。既然這些藝術家的PostScript 
文件都蠻大的,我們將上限設置為5 MB。而我們在純文本行式打印機上不做任何限制: 

# /etc/printcap for host rose 


# No limit on job size: 

rattan|line|diablo|lp|Diablo 630 Line Printer:/ 
:sh:mx#0:sd=/var/spool/lpd/rattan:/ 
:lp=/dev/lpt0:/ 
:if=/usr/local/libexec/if-simple: 
第54 頁FreeBSD 使用手冊

# Limit of five megabytes: 

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:/ 
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:/ 
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:/ 
:if=/usr/local/libexec/psif:/ 
:df=/usr/local/libexec/psdf: 
同樣的,這些限制僅對本機使用者有效。如果有人通過網絡使用這些打印機,那么這些
設置是不會產生效用的。你得在遠程的/etc/printcap 設置文件里也設置mx 關鍵詞才行。
請閱讀安裝遠程機器上的打印機這一節以取得更多關于遠程打印的信息。
有另一種更好的方法來限定遠程打印機傳送過來的打印工作大小。請閱讀限制來自遠
程打印機的工作這一節的說明。
11.4.4.4 限制遠程打印機的工作
LPD spooling 系統提供好幾種方法來限制從遠程傳過來的打印工作: 
限制機器來源
你可以用/etc/hosts.equiv 和/etc/hosts.lpd 這兩個文件來限制LPD 接收哪些遠
程機器的要求。LPD 會檢查傳出要求的機器是否列在這些文件中。如果沒有的話, 
那么LPD 會拒絕這些要求。
這兩個文件的格式很簡單: 一行寫一臺機器名稱即可。不過你得注意
/etc/hosts.equiv 這個文件也被ruserok 通訊協議所使用,因此會影響到像rsh 和rcp 
等程序,所以你得小心的設置。
舉例來說,rose 的/etc/hosts.lpd 設置文件是下面這樣的: 
orchid 
violet 
madrigal.fishbaum.de 
意思就是rose 這臺機器將會接收從orchid、violet、以及madrigal.fishbaum.de 
這三臺機器送過來的要求。如果其它的機器想要來使用rose 這機器的LPD,那么
第55 頁FreeBSD 使用手冊
LPD 將會拒絕它們。
限制大小
你可以控制有多少空間得保留在spooling 目錄所在的文件系統上。只要在本機打印
機的spooling 目錄上建立一個叫做minfree 的文件就行了。而這個文件的內容是一
個數字記錄。當文件系統至少還有多少磁盤區塊(512 字節)的剩余空間時,才接收遠
程傳來的打印工作。
這可以確保遠程的使用者不會將你的文件系統空間用完。而這塊空間可以給本機使
用者一些保障:它們在文件系統剩余空間小于minfree 文件里所指定的大小時,還
是可以將打印工作送進打印隊列。
舉例來說,我們如果想要為bamboo 設置minfree 文件。我們得先查看/etc/printcap 
文件以找出這臺打印機spooling 目錄的位置。下面是關于bamboo 的設置: 
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:/ 
:sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:/ 
:lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:mx#5000:/ 
:if=/usr/local/libexec/psif:/ 
:df=/usr/local/libexec/psdf: 
Spooling 的目錄是以sd 關鍵詞設置。我們可以設置當那個文件系統的剩余空間在3 
MB(即6144 個磁盤區塊)以上時,就接收遠程來的打印工作: 
# echo 6144 > /var/spool/lpd/bamboo/minfree 
限制使用者
你可以在/etc/printcap 里用rs 關鍵詞設置哪些遠程使用者可以使用本機的打印
機。當你為本機的打印機使用了rs 之后,LPD 只有在遠程的使用者名稱在本機上
也有同樣的使用者名稱時,才會接收這個打印工作。否則LPD 會拒絕接收該工作。
這個功能(舉例來說)在不同部門共享打印機時,另一個部門的某些使用者需要用到
打印機。你只要在你的機器上為這些使用者建立帳戶,那么它們就可以在它們的部
門里使用你的打印機。如果你只想要讓它們使用你的打印機而不能使用你機器上的
其它資源的話,那么你只要為它們建立“token”帳戶,即沒有home 目錄也沒有可
用的shell 像/usr/bin/false 這樣子即可。
11.4.5 統計打印機的使用情況
第56 頁FreeBSD 使用手冊
紙張及墨水都是要錢的,管理也是需要花錢的—打印機常常因為運轉負荷過重而發生故
障,為何不向使用者收取打印的費用呢?如果你打算收錢,你必需檢查你的打印機、制定使
用方式、以及制定打印一張紙(一英尺、一公尺,等等)要收多少錢。那么你要如何統計打
印了多少呢? 
不幸的是,LPD spooling 系統在這方面的幫助并不大。統計的方法與你所使用的打印機、
打印的格式,以及其它你想收費的項目有關。
如果要統計這個功能,你得修改打印機的文字過濾程序(以對打印純文本收費) 或轉換
用過濾程序(以對列其它的格式收費),以計算打印的張數或是如果無法計算的話,則向打印
機查詢打出的張數。你沒有辦法用輸出用的過濾程序來做統計的工作。請閱讀過濾程序這
一節的說明。
一般來說,有兩種統計的方式: 
1. 定期統計是較常見的方式,也許是因為它比較容易。當有人打印工作時,過濾程序將使
用者名稱、機器以及打印的張數記錄到一個記錄文件里。每個月、每個學期、每年或是
任何一段時間,你可以根據這些不同打印機的記錄文件來結算每個使用者所需的費用, 
并向它們收費。然后你就可以刪除這些記錄再重新開始計算。
2. 實時統計是較少用的方式,也許是因為它比較難設置。這個方式讓過濾程序馬上計算出
使用者打印的數目并向它們收費。就像磁盤配額一樣,這個統計是馬上生效的。你可以
提供一種方式供使用者檢查或調整它們的“打印配額”,以防止某些使用者打印過量。
但是這種方法需要一些維護數據庫的程序代碼以記錄使用者使用的配額。
LPD spooling 系統可以很容易地支持上述兩種情況:因為(大部分的時候)你得提供你的
過濾程序以及計算的程序。這有一個好處就是你可以很有彈性地調整計算的方法。舉例來說, 
不管你是使用定期統計還是實時統計,你可以選擇要記錄哪些信息:使用者名稱、機器名稱、
工作型態、打印的張數、紙張的大小、打印工作所花的時間等等。而你只要調整你的過濾程
序就可以了。
11.4.5.1 快速設置打印機的使用統計
FreeBSD 提供兩個程序讓你可以快速設置好定期統計。它們是在文字過濾程序:lpf 那
節所提到的lpf 以及pac,一個可以從打印機打印記錄文件讀取并統計資料的程序。
在前幾節(過濾程序的運作方式),我們曾提到LPD 會將記錄文件名以參數的方式傳給文字
第57 頁FreeBSD 使用手冊
過濾程序和轉換用過濾程序。如此過濾程序就知道可以將計算結果記錄到哪個文件里。這個
文件名在/etc/printcap 文件里是以af 關鍵詞指定,如果不是以絕對路徑來指定的話,那
么這個文件將會放在相對應于spooling 目錄的位置下。
LPD 會將紙張的寬度及高度傳給lpf 命令(由pw 及pl 關鍵詞所指定)。lpf 使用這些參
數來計算將會用到多少張紙。而將文件送給打印機打印后,它會將這些結果記錄在記錄文件
里。這些結果看起來是像這個樣子的: 
2.00 rose:andy 
3.00 rose:kelly 
3.00 orchid:mary 
5.00 orchid:mary 
2.00 orchid:zhang 
由于lpf 沒有使用文件鎖定的相關操作,因此每臺打印機都要有獨立的統計記錄文件, 
否則兩個lpf 同時對同一個文件做寫入的動作可能會使彼此的記錄都不正確。而最簡單的解
決方式就是讓不同的打印機在/etc/printcap 設置文件里以af=acct 關鍵詞指定不同的統計
記錄文件。這些acct 文件將會分別放置在不同的spooling 目錄下。
當你準備要向使用者收錢時,執行pac 這個程序。只要將目錄切換到你想收錢的打印機
spooling 目錄下,然后打pac。你將會得到一份像下列的收費摘要: 
Login pages/feet runs price 
orchid:kelly 5.00 1 $ 0.10 
orchid:mary 31.00 3 $ 0.62 
orchid:zhang 9.00 1 $ 0.18 
rose:andy 2.00 1 $ 0.04 
rose:kelly 177.00 104 $ 3.54 
rose:mary 87.00 32 $ 1.74 
rose:root 26.00 12 $ 0.52 
total 337.00 154 $ 6.74 
pac 有下列參數可以使用: 
1. Pprinter 
指定要處理哪一臺printer 的統計資料。這個參數只有在/etc/printcap 文件里
第58 頁FreeBSD 使用手冊
的af 關鍵詞是使用絕對路徑時才有用。
2. c 
將輸出的結果以費用排序,而不是以使用者的名字排序。
3. m 
忽略記錄文件里的機器名稱。如果使用這個參數,那么alpha 機器上的使用者smith 
和gamma 機器上的使用者smith 將會被視為同一個使用者。否則,它們會被視為不
同的使用者。
5. r 
6. s 
4. pprice 
計算時以每一頁收取price 元計算,而不是使用/etc/printcap 里的pc 所指定的
費率或2 分美金(默認的費率)計算。你可以用浮點數來指定price 這個參數。
顛倒排列的順序。
將計算的結果寫到一個摘要文件里,同時清除統計記錄文件的內容。
name ... 
只為指定的使用者names 做統計。
在pac 默認的輸出里,你可以看到不同機器上不同使用者所打印的張數。如果你不在乎
使用者使用的機器(比如說使用者可以用任何機器),那么你可以用pac -m 產生下列的摘要
輸出: 
Login pages/feet runs price 
andy 2.00 1 $ 0.04 
kelly 182.00 105 $ 3.64 
mary 118.00 35 $ 2.36 
root 26.00 12 $ 0.52 
zhang 9.00 1 $ 0.18 
total 337.00 154 $ 6.74 
pac 計算應繳納的金額時,會使用/etc/printcap 文件里pc 關鍵詞所指定的費率(默認
值為2 美分)。即每一頁或是每一英尺你想要收多少錢就是在這里指定。你可以在執行pac 
第59 頁FreeBSD 使用手冊
時以參數-p 改變這個費率。不過-p 的單位是元,而不是分,舉例來說, 
# pac -p1.50 
將使打印每一頁以1 元5 分計算。你可以用這個參數調整你所收取的費用。
最后,如果你使用pac -s 將會把這些摘要信息存在一個文件里,這個文件的名稱會和
統計記錄文件相同,不過文件名后面會再加上_sum。然后它會將統計記錄文件清空。如果你
再執行一次pac 命令,那么它會先讀取之前統計的結果,然后再加上從統計記錄文件里所計
算出來的結果。
11.4.5.2 如何統計有幾頁被打印? 
為了要能精確統計打印的情況,你必須要能得知每個工作用了幾張紙。這是打印機使用
情況統計最基本的問題。
對于純文本的工作,這個問題并不難解決:你只要統計這個工作里有幾行并知道你的打
印機一張紙可以印幾行就行了。別忘了考慮倒退字符以及因為同一行字符過多而換行的情
況。
lpf 文字過濾程序(在文字過濾程序:lpf 這一節里介紹的)在做統計時會將這些情況都
考慮進去。如果你要自己撰寫有統計功能的文字過濾程序,你可以參考lpf 的原始碼。
那么要如何統計其它格式的文件呢? 
對于DVI 轉成LaserJet 或DVI 轉成PostScript,你可以讓你的過濾程序處理由dvilj 或
dvips 的輸出以判斷一共轉換了幾頁。你也許可以用類似的方式來處理其它的文件格式以轉
換程序。
但是這樣的方法所計算出來的和打印機實際打出來的可能不大相同,舉例來說,打印機
可能會卡紙、用完色帶碳粉或墨水、或是其它的故障—而這些使用者仍然需要付費。
那么,我該怎么辦? 
只有一種方式肯定是可以做出精確的統計。買一臺可以告訴你一共打出多少紙張的打印
機,同時將它接在串行端口或是以網絡連接。幾乎所有的PostScript 打印機都支持這個功能。
當然其它種類的打印機也有支持的(如網絡Imagen 激光打印機)。為這些打印機修改你的過
濾程序,使得過濾程序在打印完成后可以從打印機取得這些信息,同時也只根據這些記錄來
做統計。不需要做行數統計或是其它可能發生錯誤的計算方式。當然,你也可以大方的讓所
有的紙張打印輸出都免費。
第60 頁FreeBSD 使用手冊


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中文字幕涩涩久久乱小说 | 久久精品视频在线免费观看 | 日韩一级免费 | 亚洲综合视频网 | 欧美视频黄色 | 欧美人与牲禽动交精品一区 | 男人久久天堂 | 九九热视频在线免费观看 | 日韩黄色精品视频 | videos高潮| 黄网站在线免费看 | 精品黑人一区二区三区国语馆 | 久久成人免费网 | 精品黑人一区二区三区国语馆 | 黄网站色成年大片免费高 | 精品国产一区二区三区久久久蜜月 | 国产无遮挡一级毛片 | 黄色毛片a级 | 久久国产精品久久久久久 | 国产亚洲精品久久久久久久久 | av手机免费在线观看 | 日日鲁一鲁视频 | h视频在线播放 | 欧美a在线观看 | 成年免费视频黄网站在线观看 | 91午夜视频 | av免费不卡国产观看 | 精品呦女 | 精品一区二区久久久久久久网精 | 中文字幕欧美在线 | 欧美aaa| 黄色网址免费在线播放 | 精品成人免费一区二区在线播放 | 久久凹凸 | 在线观看免费污视频 | 亚洲成人第一区 | 成年人视频免费 | 国产激情网 | 日韩一级网站 | 日韩精品a在线观看 | 99在线热视频 |