Next
Previous
Contents
Одним из свойств lpd является то что он поддерживает печать по
сети на принтер, физически подключенный к другой машине. С помощью
правильной комбинации фильтров и разнообразных утилит, вы можете
сделать печать через lpr прозрачно на принтера во всех видах сетей.
Для того чтобы разрешить удаленным машинам печатать на ваш
принтер, вы должны перечислить эти машины в файле
/etc/hosts.equiv или /etc/hosts.lpd. (Заметим,
что hosts.equiv имеет список машин несколько с другим
эффектом; будьте уверены что вы знаете что вы делаете если
перечисляете машины в этом файле). Вы можете разрешить только
определенным пользователям на других машинах печатать на ваш
принтер используя атрибут rs; читайте справочную страницу
lpd
для
более детальной информации об этом.
С помощью lpd
Для того чтобы печатать на другую машину вы должны сделать
примерно такую запись в /etc/printcap:
# Удаленный djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:rm=machine.out.there.com:\
:rp=printername:\
:lp=/dev/null:\
:sh:
Заметим что все равно есть директория очереди на локальной машине
обслуживаемая lpd
. Если удаленная машина занята или отключена,
то задание с локальной машины будет находиться в очереди до тех пор
пока оно не сможет быть послано.
С помощью rlpr
Вы также можете использовать rlpr для послания задания
печати прямо в очередь удаленной машины без мороки с настройкой lpd
для выполнения этой задачи. Это в большинстве случаев полезно в
ситуациях когда вы печатаете на множество принтеров только время от
времени. Из анонса rlpr:
Rlpr использует TCP/IP для посылки заданий печати на сервера с
lpd находящимися где угодно в сети.
В отличии от lpr, он не требует чтобы удаленный принтер
был явно известен машине с которой вы хотите печатать, (например в
/etc/printcap) и таким образом является значительно белее
гибким и требующим меньше администрирования.
rlpr может использоваться везде где мог бы использоваться
традиционный lpr, и он является совместимым с традиционным
BSD lpr.
Основная мощь rlpr заключается в удаленной печати откуда
угодно куда угодно без учета как система на которую вы хотите
печатать была настроена. Он может работать как фильтр как и
традиционный lpr, так что клиенты выполняемые на удаленной машине
такие как netscape, xemacs, и т.п., могут печатать на вашу
локальную машину с небольшими усилиями.
Rlpr доступен с
SunSite
.
Существует "Printing to Windows mini-HOWTO" в котором находится
больше информации чем здесь.
Возможно перенаправить очередь lpd через программу
smbclient
(часть набора Samba) на основанный на TCP/IP сервис печати SMB.
Samba включает скрипт называемый smbprint
. Вкратце, вы
помещаете конфигурационный файл для нужного принтера в его
директорию спула, и устанавливаете для него скрипт smbprint
как if-фильтр.
Запись в /etc/printcap выглядит примерно так:
lp|remote-smbprinter:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lp:\
:if=/usr/local/sbin/smbprint:
Вы должны прочитать документацию внутри скрипта smbprint
для более детальной информации о настройке
Вы также можете использовать программу smbclient
для
посылки файла прямо на сервис печати SMB без вовлечения в этот
процесс lpd
. Смотрите справочные страницы.
Набор программ ncpfs включает утилиту названую nprint
,
которая обеспечивает те же самые возможности как и smbprint
,
но для NetWare. Вы можете получить ncpfs с
SunSite.
Информация из записи в LSM для пакета версии 0.16:
С помощью ncpfs вы можете монтировать тома вашего сервера netware
под Linux. Вы также можете печатать в очереди печати netware и
перенаправлять очереди печати netware на систему печати Linux. Вам
необходимо ядро версии 1.2.x или 1.3.54 и выше. ncpfs НЕ работает с
любыми ядрами 1.3.x ниже 1.3.54.
Для того чтобы заставить nprint
работать через lpd, вам
нужно написать маленький скрипт для печати потока стандартного
ввода на принтер NetWare, и установить его как if-фильтр для
очереди печати lpd. Вы получите что-то подобное этому:
sub2|remote-NWprinter:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/sub2:\
:if=/var/spool/lpd/nprint-script:
nprint-script
может выглядеть примерно так:
#! /bin/sh
# Вы должны сначала попробовать вход как guest без пароля!
/usr/local/bin/nprint -S net -U name -P passwd -q printq-name -
Пакет netatalk включает что-то подобное nprint
и
smbclient
. Другие имеют документированные процедуры для печати
на и с сетей Apple много лучше чем я представлял; Смотрите
Linux Netatalk-HOWTO.
Принтеры HP и некоторые другие принтера идут с интерфейсом на
который вы можете печатать прямо, используя lpd. Вы должны
следовать инструкциям, которые идут с вашим принтером или его
сетевым адаптером, но в главном такие принтера являются
"работающим" lpd., и обеспечивают одну или более очередь на которые
вы можете печатать. Например HP может работать с printcap подобным:
lj-5|remote-hplj:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lj-5:\
:rm=printer.name.com:rp=raw:
Принтера HP Laserjet с интерфейсами Jet Direct iв общем
поддерживают две встроенных очереди lpd -- "raw", которая
принимает PCL (и возможно Postscript) и "text", которая принимает
чистый ascii (и автоматически справляется с лестничным эффектом).
Если у вас JetDirect Plus3 трех-портовый принтер, то очереди
называются "raw1", "text2", и так далее.
В средах большого масштаба, особенно в больших средах где
некоторые принтера не поддерживают PostScript, может быть полезно
создать выделенный сервер печати на который все машины будут
печатать и на котором все задания ghostscript будут запущены.
Это также позволяет вашей машине с Linux выступать как сервер
печати для принтера, так что ваши пользователи сети смогут
выполнять свои задания печати быстро и справляться с работой не
ожидая пока принтер печатает какое-то другое задание посланное
кем-то другим.
Чтобы сделать это, установить очередь на вашей машине, которая
указывает на оборудованный ethernet принтер HP LJ (как показано
выше). Затем укажите для всех клиентов вашей LAN, чтобы они
печатали на очередь печати Linux (например lj-5 как в
вышеприведенном примере).
Некоторые сетевые принтера HP по всей видимости не нуждаются в
установке страницы заголовка (banner page) посылаемой клиентом; вы
можете отключить внутренне генерируемую страницу заголовка зайдя на
принтер с помощью telnet, нажав два раза return, набрав "banner: 0"
и затем "quit". Существуют другие настройки, которые вы можете
изменить тем же способом; наберите "?" для просмотра списка
установок.
На старые принтера HP
Некотрые принтера (и печатающие сетевые "черные ящики")
поддерживают только никуда не годные маленькие непротокольные
соединения включая чистые TCP соединения. Примечательными в этой категории являются
ранние модели карт JetDirect (включая некоторые карты JetDirectEx).
В основном для печати на принтер вы должны открыть соединение TCP
на принтер на указанный порт (обычно 9100 или 9100, 9101 и 9102
для трех-портовых принтеров) и запихнуть свое задание
печати в принтер. Это может быть выполнено на 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&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;
}
Одна странность lpd в том что 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
будет выглядеть так:
#!/bin/sh
gs <options> -q -dSAFER -sOutputFile=- - | \
lpr -Plj-5-remote -U$5
Опция -U lpr работает только если lpr запущен как демон, и
она правильно устанавливает имя имя автора задания при его
перенаправлении. Вы должны вероятно использовать более надежный
метод получения имени пользователя, так как в некоторых случаях оно
не является пятым аргументом. Смотрите справочную станицу
printcap.
Печать из под клиента Windows (или OS/2) на сервер Linux прямо
поддерживается через SMB используя пакет SAMBA, который также
поддерживает разделение вашей файловой системы Linux с клиентами
Windows.
Samba включает в себя довольно полную документацию. Вы можете
либо настроить magic-фильтр на машине с Linux и печатать на нее в
формате PostScript или установить специфичные для принтера драйвера
на всех машинах с Windows и обрабатывать очередь без фильтрации.
Полагаясь на драйвера Windows вы можете в некоторых случаях
получить более качественный вывод, но это дает больше
административной нервотрепки если у вас много машин с Windows. Так
что сначала попробуйте PostScript.
Netatalk поддерживает печать с клиентов Apple через EtherTalk.
Смотрите
Страницу Netatalk HOWTO для более детальной
информации.
Пакет ncpfs включает демона называемого pserver, который может быть
использован для обеспечения сервиса очередей печати NetWare. Как я
понял эта система требует основанную на Bindery систему NetWare,
т.е. 2.x, 3.x, или 4.x с разрешенным доступом к bindery.
Для более детальной информации о ncpfs и ее программе pserver смотрите
FTP сервер ncpfs FTP.
Next
Previous
Contents