Nästa Föregående Innehållsförteckning

11. Hur man skriver ut på en skrivare över nätverket

En av finesserna med lpd är att den stöder utskrift över nätverket till skrivare fysiskt anslutna till en annan maskin. Med en noggran kombination av filter scripts och tillhörande program kan du använda lpd till att på ett raktframt sätt skriva ut på skrivare anslutna till alla sorters nätverk.

11.1 Till en Unix/lpd värd

För att låta andra maskiner skriva till din skrivare måste du lista dem i /etc/hosts.equiv eller /etc/hosts.lpd. (Observera att hosts.equiv medför andra effekter, var säker på att du vet vad du gör innan du listar någon maskin där). Du kan tillåta bara vissa anvndare på andra maskiner att skriva till din skrivare genom att använda rs attributet; läs lpd manualsidan för information om detta.

Med lpd

För att skriva ut till en annan maskin skapar du en /etc/printcap post som denna:

# REMOTE djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :rm=machine.out.there.com:\
        :rp=printername:\
        :lp=/dev/null:\
        :sh:
Observera att det fortfarande finns en spoolkatalog på den lokala maskinen som hanteras av lpd. Om den andra maskinen är upptagen eller offline kommer utskriftsjobben att vänta i spoolkatalogen tills de kan sändas.

Med rlpr

Du kan också använda rlpr för att skicka ett utskriftsjob direkt till en kö på en annan maskin utan att behöva gå igenom krånglet med att konfigurera lpd för att fixa det. Detta är användbart framför allt då du skriver till olika skrivare bara någon enstaka gång. Från introduktionen av rlpr:

Rlpr använder TCP/IP för att skicka utskriftsjobb till lpd servrar var som helst i ett nätverk.

Till skillnad från lpr kräver rlpr *inte* att den andra skrivaren är känd för maskinen som du vill skriva från (t.ex. genom /etc/printcap) och kan därför anses vara mer flexibel och kräver mindre administration.

rlpr kan användas överallt där traditionell lpr kan användas och är bakåtkompatibel med traditionell BSD lpr.

Den största styrkan med rlpr är förmågan att skriva ut på fjärrenheter *från var-som-helst till var-som-helst* utan att bry sig om hur det andra systemet du vill skriva ut från är konfigurerat. Kan användas som ett filter precis som traditionell lpr så att klienter som körs på en avlägsen maskin som netscape, xemacs, etc, etc kan skriva ut till din maskin med små ansträngningar.

Rlpr finns tillgängligt från SunSite.

11.2 Till en Win95, WinNT, LanManager, eller Samba skrivare

Det finns en Print to Windows mini-HOWTO där ute som innehåller mer info om detta än vad som finns här.

Det är möjligt att leda en lpd kö genom smbclient programmet (en del av samba-sviten) till en TCP/IP baserad SMB print service. Samba inkluderar ett script för detta som kallas smbprint. Kortfattat går det till så att du lägger en konfigurationsfil för skrivaren i fråga i spool katalogen och installerar smbprint scriptet som if.

/etc/printcap posten ser ut så här:

lp|remote-smbprinter:\
    :lp=/dev/null:sh:\
    :sd=/var/spool/lpd/lp:\
    :if=/usr/local/sbin/smbprint:

Du skall läsa dokumentationen i smbprint scriptet för ytterligare information om hur du konfigurerar detta.

Du kan också använda smbclient för att sända en fil direkt till ett SMB printing system utan att blanda in lpd. Se manualsidan.

11.3 Till en NetWare Printer

ncpfs sviten inkluderar en funktion som kallas nprint som tillhandahåller samma funktion som smbprint fast for NetWare. Du kan skaffa ncpfs från SunSite. Utdrag ur LSM posten för 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.

För att få nprint att fungera via lpd måste du skriva ett litet script som skriver stdin på NetWare skrivaren och installera detta som if till en lpd skrivarkö. Du får något som liknar:

sub2|remote-NWprinter:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/sub2:\
        :if=/var/spool/lpd/nprint-script:
nprint-scriptet borde se ut ungefär så här:
#! /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 -

11.4 Till en EtherTalk (Apple) skrivare

Netatalk paketet innehåller någonting som liknar nprint och smbclient. Andra har dokumenterat proceduren för att skriva till och från ett Apple nätverk mycket bättre än vad jag någonsin kommer att göra, se Linux Netatalk-HOWTO.

11.5 Till en HP eller annan ethernet skrivare

HP och några andra skrivare levereras med ett ethernet interface som du kan skriva till direkt med lpd. Du skall följa instruktionerna som följer skrivaren eller dess nätverskadapter. Generellt sett "kör" dessa skrivare lpd och har en eller flera köer till vilka du kan skriva. En HP, till exempel, borde fungera med en printcap post som:

lj-5|remote-hplj:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/lj-5:\
        :rm=printer.name.com:rp=raw:

HP Laserjet skrivare med Jet Direct interfaces har vanligtvis två stycken inbyggda lpd köer - "raw" som accepterar PCL (och möjligtvis PostScript) och "text" som accepterar ren ascii (och hanterar automatiskt trappstegseffekten). Om du har en JetDirect Plus3 tre-portsburk, heter köerna "raw1", "text2", o.s.v.

I en storskalig miljö, framför allt där inte alla skrivare stöder PostScript, kan det vara lämpligt att utse en speciell skrivarserver till vilken alla maskiner skriver och på vilken alla ghostscript jobb körs.

Detta låter också din Linuxburk att agera som en spool server till skrivaren så att dina nätverksanvändare snabbt kan avsluta sina utskriftsjobb och forsätta med annat utan att vänta på att skrivaren skall skriva ut något som någon annan har skickat.

För att åstadkomma detta, sätt upp en kö på din Linuxburk som pekar på den ethernetutrustade HP LJ (som ovan). Sen konfigurerar du alla klienter på ditt LAN att skriva till denna kö (ex. lj-5 i exemplet ovan).

Till en del HP nätverksskrivare behöver troligen inte försättsbladsinställningen skickas av klienterna, du kan stänga av deras internt genererade försättsblad genom att 'telnetta' till printern, trycka retur två gånger, skriva "banner: 0" följt av "quit". Det finns flera inställningar som du kan ändra på detta vis, skriv "?" för att se en lista.

Till äldre HPs

En del skrivare (och skrivarrutiner i nätverk som "black boxes") stöder bara ett dåligt litet icke-protokoll med rena TCP anslutningar. Att märka i denna kategori är tidiga JetDirect (inkluderande en del JetDirectEx) kort. Kortfattat, för att skriva till skrivaren måste du öppna en TCP anslutning till skrivaren på en speciell port (vanligtvis 9100 eller 9100, 9101, 9102 för tre-ports) och stoppa in ditt utskriftsjobb i skrivaren. Detta kan, bland annat, implementeras med 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;
}

11.6 Köra ett if för fjärrskrivare

En underlighet men lpd är att if inte körs för fjärranslutna skrivare. Om du finner att du behöver köra ett if, så kan du göra detta genom att konfigurera en dubbel kö och köa om jobbet. Som ett exempel studera följande printcap:

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:
belyst av detta filter-lj-5 script:
#!/bin/sh
gs <options> -q -dSAFER -sOutputFile=- - | \
        lpr -Plj-5-remote -U$5

Argumentet -U till lpr fungerar bara om lpr körs som en daemon och sätter begärarens namn för jobbet i den andra kön på rätt sätt. Du bör använda en mer rubust metod för att få användarnamnet eftersom det i vissa fall inte är argument 5. Se manualsidan för printcap.

11.7 Från Windows.

Att skriva från en Windows (eller förmodligen OS/2) klient till en Linuxserver är direkt stödd över SMB genom användande av SAMBA paketet, som dessutom stöder fildening av ditt Linux filsystem till Windowsklienter.

Samba inkluderar en ganska komplett dokumentation, och det finns en bra Samba FAQ som också täcker det. Du kan antingen konfigurera ett magic filter på Linuxburken och skriva PostScript till detta eller springa runt och installera skrivarspecifica drivrutiner på alla Windowmaskiner och ha en kö för dem utan något filter. Att förlita sig på Windows drivrutiner kan i en del fall leda till bättre utskrifter, men ar mer administrativt krävande om det är många Windowsmaskiner. Du bör testa PostScript först.

11.8 Från en Apple.

Netatalk stöder utskrift från Apple klienter över EtherTalk. Se Netatalk HOWTO Page för mer information.

11.9 Från Netware.

ncpfs paketet inkluderar en daemon som heter pserver som kan användas till att serva en NetWare skrivarkö. Vad jag har förstått kräver ett sådant system "Bindery-Based NetWare" d.v.s. 2.x, 3.x eller 4,x med "bindery access" aktiverad.

För ytterligare information om ncpfs och dess pserver progam, se the ncpfs FTP site.


Nästa Föregående Innehållsförteckning