要与 Windows 机器共享 Linux 打印机,您需要确保您的打印机已设置为在 Linux 下工作。如果您可以从 Linux 打印,那么设置打印机的 SMB 共享非常简单。
请注意,Windows 用户必须在 Linux/Samba 服务器上拥有帐户才能打印。Windows 95/98 将尝试使用登录 Windows 计算机时使用的用户名和密码向打印服务器进行身份验证。这意味着如果您在登录 Windows 时单击了“取消”,您将无法打印(或连接到其他 SMB 服务)!Windows NT 允许在连接到打印机时显式提供用户名和密码。
请参阅 Printing HOWTO 以设置本地打印。
将打印配置添加到您的 smb.conf
[global]
printing = bsd
printcap name = /etc/printcap
load printers = yes
log file = /var/log/samba-log.%m
lock directory = /var/lock/samba
[printers]
comment = All Printers
security = server
path = /var/spool/lpd/lp
browseable = no
printable = yes
public = yes
writable = no
create mode = 0700
[ljet]
security = server
path = /var/spool/lpd/lp
printer name = lp
writable = yes
public = yes
printable = yes
print command = lpr -r -h -P %p %s
确保打印机路径(在本例中在 [ljet] 下)与 /etc/printcap 中的 spool 目录匹配!
以下行
printcap name = /etc/printcap load printers = yes
控制是否默认加载 /etc/printcap 中的所有打印机。如果您这样做,则无需单独设置打印机。[printers] 部分指定您希望显式定义的打印机的选项。如果您使用的打印子系统不以这种方式工作 (BSD),您需要设置一个伪造的 printcap 文件(或使用“print command”技术,见下文)。有关 printcap 系统的更多信息,请参阅 Printing HOWTO。
测试网络连接的一个有用技巧是将打印命令更改为
print command = cp %S /tmp/print.%P.%S
然后可以分析生成的文件。
注意:使用 Samba 在 UNIX 机器上与 Windows NT 机器共享打印机时存在一些问题。一个问题是 NT 是否正确识别共享打印机。要解决此问题,请参阅 Samba 发行版中 docs/WinNT.txt 文件中的注释。另一个问题涉及密码问题。请参阅同一文件中的注释,以了解令人恼火的理解和未能解决问题。
Oleg L. Machulskiy ( machulsk@shade.msu.ru) 建议在上面的示例中使用更好的打印命令:
print command = smb2ps %s | lpr -r -h -P %p
其中 'smb2ps' 是一个脚本,它将从 Windows 收到的 spool 文件转换为常用的 Postscript 文件。它必须删除前 3 行和后 2 行,因为这些行包含一些 PJL 或 PCL 代码。
仅当您的 Windows 机器打印 PCL 而不是真正的 Postscript 时才需要这种方法。我发现 Windows 95/98/NT 本身没有通用的 Postscript 驱动程序,但“Digital turbo Printserver 20”驱动程序可以作为大多数设置的良好通用 Postscript 驱动程序。我也听说“Apple LaserWriter II NTX”驱动程序也适用于此目的。
如果您要创建打印机 spool 目录而不是使用 Linux 发行版安装实用程序创建的目录,请注意权限!Neil Fraser ( neilf@necon.co.za) 建议将 spool 目录(在他的例子中是 /var/spool/lpd/lpr)的权限设置为 4755(注意 suid 位)。当目录的所有者为 'root' 且组为 'lp' 时,这对他有效。
Jeff Stern ( jstern@eclectic.ss.uci.edu) 报告说,他必须将他的 spool 目录的权限设置为 777,以便非特权用户可以打印,尽管他指出他也可以将用户添加到 'lp' 组。这是本地系统管理员的决定;如果打印安全性是一个问题,那么就锁定它。在家庭环境中,您可能希望每个人都能够打印。
Michael Langner 博士 ( langner@fiz-chemie.de) 指出,通过使用类似 "path = /tmp" 和 "print command = lpr -r -P%p %s" 的方法,可以避免 /var/spool/lpd/ 树上的写入权限问题。
有时,从 Windows 机器进行 Postscript 打印时会发生 Postscript 解析错误,这会导致每个打印作业的末尾打印一个额外的页面。最后一页的顶部始终带有 "%%[ Lastpage ]%%"。这似乎只发生在 Windows 95 和 98 中,并且是因为 Postscript 格式错误。
一种处理方法是使用脚本从 spool 作业中删除错误的 Postscript 位。另一种方法是尝试找到更好的 Windows Postscript 驱动程序。可能最好的方法是使用 LPRng 而不是 Postscript 打印到 Samba 服务器。
Erik Ratcliffe ( erik@caldera.com) Caldera 告诉我,使用 LPRng 意味着可以从 Windows 机器使用任何打印机驱动程序。在 Samba 服务器上,他们使用了 /etc/printcap 条目,如下所示
raw:\
:rw:sh:
:lp=/dev/lp1
:sd=/var/spool/lpd/raw
:fx=flp
LPRng 不需要每行末尾都有 :\。仍然需要在 /etc/smb.conf 中为物理打印机创建一个打印机条目。打印命令行需要使用 /etc/printcap 中的“raw”条目,并且数据必须以二进制形式发送到打印机。尝试类似这样的打印命令行
print command = lpr -b -Praw %s
您可能还需要在 Windows95 端将 spool 设置为直接打印到打印机而不是 spooling。
如果您经常从 Windows 客户端获得在打印作业末尾打印额外页面的情况,请尝试在 /etc/printcap 中添加 "sf" 指令。这将抑制分隔作业的换页符,但不会影响文档内的换页符。