Avanti Indietro Indice

9. Come stampare su una stampante attraverso la rete.

Una delle capacita' di lpd e' che supporta la stampa attraverso la rete su stampanti fisicamente connesse ad altre macchine. Con una attenta combinazione di filtri e utility assortite, si puo' far stampare lpd su stampanti connesse a qualsiasi tipo di rete, in modo del tutto trasparente.

9.1 Su un host Unix/lpd

Per abilitare una macchina remota a stampare sulla vostra stampante, dovete elencare tale macchina in /etc/hosts.equiv o /etc/hosts.lpd (notate che mettere una macchina in hosts.equiv ha molti altri effetti; assicuratevi di sapere cosa state facendo prima di mettere una macchina qui). Potete anche abilitare solo certi utenti della macchina remota a stampare sulla vostra stampante utilizzando l'attributo rs; leggete la man page di lpd per informazioni.

9.2 Con lpd

Per stampare su un'altra macchina, dovete aggiungere ad /etc/printcap una voce di questo tipo:

     # REMOTE djet500
       lp|dj|deskjet:\
               :sd=/var/spool/lpd/dj:\
               :rm=machine.out.there.com:\
               :rp=printername:\
               :lp=/dev/null:\
               :sh:
               

Notate che c'e' ancora la coda di stampa sulla macchina locale, gestita da lpd, in modo che se la macchina remota e' occupata o offline, i lavori di stampa possono essere accodati nell'area di spool fino a che possono essere inviati.

9.3 Con rlpr

Si puo' anche usare rplr per mandare un lavoro di stampa direttamente in una coda su una macchina remota, senza doversi preoccupare di configurare lpd per supportare la stampa remota. Cio' e' piu' utile quando stampate su un gran numero di stampanti solo occasionalmente. Dall'annuncio di rlpr:

Rlpr usa il TCP/IP per mandare lavori di stampa a server lpd ovunque su una rete.

Diversamente da lpr, non necessita che la stampante remota sia esplicitamente conosciuta alla macchina da cui si vuole stampare (ad esempio tramite /etc/printcap) e pertanto e' molto piu' flessibile e richiede meno amministrazione.

Rlpr puo' essere usato ovunque si puo' usare un normale lpr, ed ' compatibile all'indietro con l'lpr BSD.

Il maggior vantaggio che si ottiene con rlpr e' la capacita' di stampare remotamente da qualsiasi macchina a qualsiasi macchina, senza preoccuparsi per come e' configurato il sistema su cui si desidera stampare. Inoltre puo' lavorare come un filtro, in modo che applicazioni cliente in esecuzione su una macchina remota, come Netscape, xemacs, etc, possono stampare sulla macchina locale senza sforzo.

Rlpr e' disponibile presso SunSite.

9.4 Su una stampante Win95, WinNT, LanManager o Samba.

E' possibile dirigere una coda di stampa di lpd, attraverso il programma smbclient (della suite samba), ad un servizio di stampa SMB basato su TCP/IP. Samba comprende uno script chiamato smbprint per fare questo. In breve, inserite un file di configurazione per la stampante in questione nella directory di spool, e installate smbprint come if.

In /etc/printcap ci sara' qualcosa del genere:

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

Dovete leggere la documentazione all'interno dello script smbprint per ulteriori informazioni su come configurarlo.

E' anche possibile usare smbclient per passare un file direttamente al servizio di stampa SMB senza coinvolgere lpd. Controllate la man page.

9.5 Ad una stampante NetWare

La suite ncpfs comprende una utility chiamata nprint che fornisce le stesse funzionalita' di smbprint, ma per NetWare. Potete ottenere ncpfs da ftp://linux01.gwdg.de/pub/ncpfs/. Dalla LSM per ncpfs versione 0.16:

Con ncpfs potete montare volumi del vostro server NetWare sotto Linux. Inoltre potete stampare verso code di stampa NetWare e fare lo spool di code di stampa NetWare verso sistemi Linux. Avete bisogno del kernel 1.2.x, o 1.3.54 o superiori. ncpfs non funziona con kernel della serie 1.3.x inferiori alla 1.3.54.

Per far funzionare nprint attraverso lpd, serve un piccolo script della shell che stampa lo stdin sulla stampante NetWare, e che va installato come if per una coda di stampa di lpd. Dovreste avere qualcosa del tipo

     sub2|remote-NWprinter:\
               :lp=/dev/null:sh:\
               :sd=/var/spool/lpd/sub2:\
               :if=/var/spool/lpd/nprint-script:
mentre lo script per nprint sara' qualcosa del genere
      #! /bin/sh
       |/usr/local/bin/nprint -S net -U name -P passwd -q printq-q -

9.6 Ad una stampante EtherTalk (Apple)

Il package netatalk comprende qualcosa sul genere di nprint e smbclient. Werner Eugster ha documentato la procedura per stampare da e verso una rete Apple molto meglio di quanto io potrei mai fare; date un'occhiata alla sua web page.

Problema misterioso della settimana: Netatalk non funziona con una scheda SMP Etherpower PCI dotata di chip DEC tulip.

9.7 Ad una stampante HP o altre stampanti ethernet.

Le HP ed alcune altre stampanti sono dotate di un'interfaccia ethernet verso la quale si puo' stampare direttamente usando lpd. Dovete seguire le istruzioni allegate alla stampante, o all'interfaccia di rete, ma in generale tali stampanti "eseguono" lpd, e forniscono una o piu' code su cui stampare. Una HP, per esempio, dovrebbe funzionare con un printcap del tipo

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

In una installazione su larga scala, specialmente in un ambito in cui alcune stampanti non supportano il PostScript, puo' essere conveniente configurare un server di stampa dedicato, verso il quale stampano tutte le macchine, e che esegue le varie istanze di ghostscript.

Sulle vecchie HP

Alcune stampanti (e stampanti messe in rete come "scatole nere") supportano solo una specie di non-protocollo basato su connessioni TCP. In questa categoria rientrano le prime schede JetDirect (comprese alcune JetDirecEx). Fondamentalmente, per stampare su stampanti di questo tipo, si deve aprire una connessione TCP su una porta specifica (di solito 9100) e trasmetterci il documento da stampare. Cio' puo' essere fatto, tra gli altri modi, in 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;
  }

9.8 Esecuzione di if per una stampante remota

Un difetto di lpd e' che l'if non e' eseguito per le stampanti remote. Se avete bisogno di eseguire un if, potete farlo configurando una coda di stampa doppia, e riaccodando il lavoro di stampa. Come esempio prendiamo questo 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:
alla luce di questo script di filtraggio filter-lj-5:
       #!/bin/sh
       gs <options> -q -dSAFER -sOutputFile=- - | \
               lpr -Plj-5-remote -U$5

L'opzione -U di lpr funziona solamente se lpr e' esguito come demone, e pone il nome d'utente corretto nella seconda coda di stampa. Probabilmente e' meglio usare un metodo piu' robusto per determinare il nome dell'utente, perche' in alcuni casi non e' il quinto argomento. Verificate la man page di printcap.


Avanti Indietro Indice