SMB HOWTO pl 9 (2)


SMB-Howto: Udostępnianie drukarki spod Windows komputerom z Linux-em. Następna strona Poprzednia strona Spis treści 9. Udostępnianie drukarki spod Windows komputerom z Linux-em. Aby udostępnić drukarkę spod Windows-ów musisz zrobić następujące rzeczy: Musisz mieć poprawne pola w /etc/printcap i muszą one odpowiadać lokalnej strukturze katalogów (katalog dla drukarki itp.) Musisz mieć skrypt /usr/bin/smbprint. Skrypt ten znajduje się w źródłach Samby, ale nie w każdym pakiecie binarnym. Poniżej znajduje się trochę zmodyfikowana wersja tego skryptu. Jeśli chcesz zamieniać pliki ASCII na PostScript, musisz mieć nenscript albo jego ekwiwalent. nenscript jest konwerterem PostScript-owym i jest z reguły instalowany w /usr/bin. Możesz ułatwić drukowanie poprzez Sambę pisząc skrypt. Poniżej podany jest prosty skrypt w Perl-u obsługujący pliki ASCII, PostScript i stworzony PostScript. Mógłbys też użyć MagicFilter do powyższych zadań. Szczegóły na temat konfiguracji tego filtru są podane za skryptem w perlu. Zaletą tego filtru jest znajomość wielu formatów plików i umiejętność ich konwersji. Poniższe pola w /etc/printcap są dla drukarki HP 5MP dołączonej do komputera z Windows NT. cm - komentarz; lp - urządzenie, na które ma być wysłany wydruk; sd - katalog zadań dla drukarki (na lokalnym komputerze); af - katalog accounting; mx - maksymalny rozmiar pliku (0 - bez ograniczenia); if - nazwa filtru wejściowego (skryptu). Więcej informacji znajdziesz w Printing-HOWTO lub w podręczniku systemowym dla "printcap". etc/printcap # # //zimmerman/oreilly przez smbprint # lp:\ cm=HP 5MP Postscript OReilly na zimmerman:\ lp=/dev/lp1:\ :sd=/var/spool/lpd/lp:\ af=/var/spool/lpd/lp/acct:\ mx#0:\ :if=/usr/bin/smbprint: Upewnij się, że katalogi zadań i zliczania (accounting) istnieją i są zapisywalne oraz że if ma poprawną ścieżkę do scryptu smbprint (patrz poniżej) i że lp wskazuje poprawne urządzenie (plik specjalny w katalogu /dev) Następnym krokiem jest skrypt smbprint. Zwykle znajduje się on w /usr/bin i jest przypisywany Andrew Tridgellowi - osobie, która stworzyła Sambę o ile wiem. Przychodzi on wraz z dystrybucją źródeł Samby, ale nie ma go w dystrybucji binariów, więc go tutaj stworzyłem. Możesz przejrzeć go dokładniej. Przerobiłem go trochę, ponieważ przeróbki wydawały mi się użyteczne. #!/bin/sh # Skrypt ten jest filtrem wejściowym do drukowania na drukarce # dołączonej do Unix-a. Używa programu smbclient do drukowania # pliku. Na przykład twój printcap mógłby wyglądać nastepująco: # # # smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint # # # Stworzyłby on drukarkę o nazwie smb, która drukowałaby poprzez # ten skrypt. Musiałbyś stworzyć katalog zadań /usr/spool/smb z # odpowiednimi dla twojego systemu prawami dostępu i właścicielem. # # Ustaw następujące rzeczy na serwer i serwis przez, który chcesz # drukować. W tym przykładzie mam PC-ta z WfWg o nazwie "lapland", # który ma drukarkę o nazwie printer bez hasła. # # # W dalszej części skrypt został przerobiony przez hamilton@ecnz.co.nz # (Michael Hamilton, tak aby serwer, serwis i hasło mogły być # przeczytane z pliku /usr/var/spool/lpd/PRINTNAME/.config # # Aby to działało /etc/printcap musi mieć pole af: # # cdcolour:\ cm=CD IBM Colorjet on 6th:\ sd=/var/spool/lpd/cdcolour:\ # :af=/var/spool/lpd/cdcolour/acct:\ if=/usr/local/etc/smbprint:\ # :mx=0:\ lp=/dev/null: # # Plik /usr/var/spool/lpd/PRINTNAME/.config powinien zawierać: # server=PC_SERVER service=PR_SHARENAME password="password" # # Np. server=PAULS_PC service=CJET_371 password="" # # Plik, do którego mają byc zapisywane wiadomości ze śledzenia; # możesz zmienić na /dev/null jeśli chcesz: # logfile=/tmp/smb-print.log logfile=/dev/null # # Ostatnim parametrem do filtra jest nazwa pliku accounting. # spool_dir=/var/spool/lpd/lp config_file=$spool_dir/.config # Powinien czytać te zmienne z pliku konfiguracyjnego: serwer # serwis hasło użytkownik eval `cat $config_file` # Trcohę pomocy, zmień >> na > jeśli chcesz zachować trochę # miejsca na dysku. # echo "server $server, service $service" >> $logfile (UWAGA Możesz dodać linię `echo translate' jesli chcesz # automatycznego tłumaczenia CR/LF podczas drukowania. echo translate echo "print -" cat ) | /usr/bin/smbclient "\\\\$server\\$service" $password -U $user -N -P >> $logfile Większość dystrybucji Linux-owych posiada nenscript do zamiany dokumentów ASCII na PostScript. Następujący skrypt w Perl-u ułatwia życie stwarzając prosty interfejs dla drukowania w Linux-ie przez smbprint. Stosowanie: print [-a|c|p] <nazwa_pliku> -a drukuje <nazwa_pliku> jako ASCII; c drukuje <nazwa_pliku> sformatowane jako źródło; -code p drukuje <nazwa_pliku> jako PostScript. Jeśli nie ma żadnej opcji, print próbuje odgadnąć typ pliku i odpowiednio go wydrukować. Użycie smbprint do drukowania plików ASCII powoduje obcinanie długich linii. Ten skrypt dzieli długie linie w miejscu spacji (zamiast w środku słowa) jeśli jest to możliwe. Formatowanie źródła odbywa sie przy pomocy programu nenscript. Bierze on plik ASCII i formatuje go w dwie kolumny z dodatkowym nagłówkiem (data, nazwa pliku, itp.) Zlicza także ilość linii. Wzorując się na tym przykładzie możesz zrobić inne typy formatowania. Dokumenty PostScript-owe są już sformatowane więc przechodzą bezpośrednio do drukarki. usr/bin/perl # Skrypt: print Autorzy: Brad Marshall, David Wood # Plugged In Communications Date: 960808 # # Skrypt do drukowania na drukarce oreilly, która jest dołączona do # komputera zimmerman. Opis działania: Jako argumenty przyjmuje pliki # różnych typów i wysyła je odpowiednio do skryptu drukujacego Samby # # Obecnie obsługiwane typy plików: # # ASCII - Upewnij się, że linie dłuższe niż $line_length zostały # podzielone w miejscu spacji. # PostScript - Nie robi nic. # Code - Formatuje na PostScript używając "nenscript", aby wszystko # było odpowiednio wyświetlone (ułożenie, czcionki, itd.) # # # Ustaw maksymalną ilość znaków w linii dla plików ASCII. line_length $= 76; # Ustaw ścieżkę i nazwę skryptu drukującego Samby print_prog = $"/usr/bin/smbprint"; # Ustaw ścieżkę i nazwę "nenscript-u" (zamiana ASCII-->PostScript) $nenscript = "/usr/bin/nenscript"; unless ( -f $print_prog ) { die "Can't find $print_prog!"; } unless ( -f $nenscript ) { die "Can't find $nenscript!"; } &ParseCmdLine(@ARGV); # DBG print "filetype is $filetype\n"; if ($filetype eq "ASCII") { ero;wrap($line_length); elsif ($filetype eq &"code") { } ero;codeformat; elsif ($filetype eq "ps") { &createarray; else { } print "Sorry..no known &file type.\n"; exit } 0; } # Wyślij tablcę do smbprint open(PRINTER, "|$print_prog") || die "Can't open $print_prog: $!\n"; foreach $line (@newlines) { print PRINTER $line; } # Wyślij dodatkowy znak LF jeśli plik ma niekompletną ostatnią linię. print PRINTER "\n"; close(PRINTER); print "Completed\n"; exit 0; # --------------------------------------------------- # # Wszystko poniżej jest procedurą # # --------------------------------------------------- # sub ParseCmdLine { Interpretuje wiersz poleceń, szukając jakiego typu jest # plik # Gets $arg and $file to be the arguments (if they exists) and the # filename if ($#_ < 0) { ero;usage; } # DBG foreach $element (@_) { print "*$element* \n"; # } $arg = shift(@_); if ($arg =~ /\-./) { cmd = $arg; DBG print "\$cmd found.\n"; $file = shift(@_); else { file = $arg; } # Definiowanie typu pliku dopóki ($cmd) { Nie mamy argumentów if ($file =~ /\.ps$/) { filetype = "ps"; elsif ($file =~ $/\.java$|\.c$|\.h$|\.pl$|\.sh$|\.csh$|\.m4$|\.inc$|\.html$|\.htm$/) ${ filetype = "code"; else { filetype = "ASCII"; } # Przerób $file odpowiednio do jego typu i zwróć $filetype } else { Mamy typ pliku w $arg if ($cmd =~ /^-p$/) { filetype = "ps"; elsif ($cmd =~ $/^-c$/) { filetype } = "code"; elsif ($cmd =~ $/^-a$/) { } filetype = "ASCII" } } } sub usage { print " Stosowanie: print [-a|c|p] <plik> -a drukuje <plik> jako ASCII c drukuje <plik> sformatowany jako źródło -code p drukuje <plik> jako PostScript Jeśli nie ma żadnej opcji, print próbuje odgadnąć typ pliku i odpowiednio go wydrukować.\n "; exit(0); } sub wrap { Stwórz tablicę linii w pliku, gdzie każda linia jest krótsza od # podanej ilości znaków i jest podzielona tylko w miejscach spacji # Pobierz ilość znaków jaka może być w linii. limit = $pop(@_); # DBG print "Entering subroutine wrap\n"; print "The line length #limit is $limit\n"; # Wczytaj plik, sformatuj i umieść w tablicy. open(FILE, "<$file") || die "Can't open $file: $!\n"; while(<FILE>) { $line = $_; # DBG print "The line is:\n$line\n"; # Podziel linię jeśli jest dłuższa niż podana ilość znaków. while ( length($line) > $limit ) { # DBG print "Wrapping..."; # Pobierz pierwsze $limit+1 znaków. part = $substr($line,0,$limit +1); # DBG print "The partial line is:\n$part\n"; # Sprawdź czy ostatni znak jest spacją. $last_char = substr($part,-1, 1); if ( " " eq $last_char ) { Jeśli tak, wydrukuj resztę. # DBG print "The last character was a space\n"; substr($line,0,$limit + 1) = ""; substr($part,-1,1) = ""; push(@newlines,"$part\n"); } else { Jeśli nie, znajdź ostatnią spację w # pod-linii i drukuj do niej # DBG print "The last character was not a #space\n"; # Usuń znaki dalsze niż $limit substr($part,-1,1) = ""; Odwróć linię # aby ułatwić odnajdywanie ostatniej spacji $revpart = reverse($part); $index = index($revpart," "); if ( $index > 0 ) { substr($line,0,$limit-$index) = ""; push(@newlines,substr($part,0,$limit-$index) . "\n"); else { Nie było spacji w linii } więc # wydrukuj do $limit. substr($line,0,$limit) = ""; push(@newlines,substr($part,0,$limit) . "\n"); } } } push(@newlines,$line); } close(FILE); } sub codeformat { Wywołaj procedurę wrap i przefiltruj przez nenscript &wrap($line_length); # Przepuść wynik przez nenscript, aby utworzyć plik PostScript, # który pasuje do jakiegoś przyzwoitego formatu źródeł do drukowania # (ułożenie, czcionki Courier, ilość linii). Najpierw wydrukuj to do # pliku tymczasowego. $tmpfile = "/tmp/nenscript$$"; open(FILE, "|$nenscript -2G -i$file -N -p$tmpfile -r") || die "Can't open nenscript: $!\n"; foreach $line (@newlines) { print FILE $line; } close(FILE); # Wczytaj plik tymczasowy spowrotem do tablicy, tak aby mógł być # wysłany do skryptu print Samby. @newlines = (""); open(FILE, "<$tmpfile") || die "Can't open $file: $!\n"; while(<FILE>) { push(@newlines,$_); } close(FILE); system("rm $tmpfile"); } sub createarray { Stwórz tablicę dla PostScript-u open(FILE, "<$file") || # die "Can't open $file: $!\n"; while(<FILE>) { push(@newlines,$_); } close(FILE); } Teraz sposób z MagicFilter. Dziękuję za tę informację Alberto Menegazzi ( flash.egon@iol.it). Alberto pisze: --------------------------%<---------------------------------- 1) Zainstaluj MagicFilter dla odpowiednich drukarek w /usr/bin/local/, ale nie umieszczaj w /etc/printcap tego co sugeruje dokumentacja do tego filtru. 2) Utwórz plik /etc/printcap na podobieństwo tego poniżej (to jest konfiguracja dla mojej drukarki LaserJet 4L): lp|ljet4l:\ :cm=HP LaserJet 4L:\ :lp=/dev/null:\ # or /dev/lp1 :sd=/var/spool/lpd/ljet4l:\ :af=/var/spool/lpd/ljet4l/acct:\ :sh:mx#0:\ :if=/usr/local/bin/main-filter: Powinieneś wiedzieć, że lp=/dev/... otwierane jest z lokowaniem, tak więc powinny być używane virtualne urządzenia; jedno dla każdej odległej drukarki. Np. stworzone przez 'touch /dev/ljet4l'. 3) Stwórz filtr /usr/local/bin/main-filter jak poniżej: #! /bin/sh logfile=/var/log/smb-print.log spool_dir=/var/spool/lpd/ljet4l ( echo "print -" /usr/local/bin/ljet4l-filter ) | /usr/bin/smbclient "\\\\SHIR\\HPLJ4" -N -P >> $logfile P.S. Oto cytat z mini-HOWTO Print2Win na temat lokowania i po co tworzyć wirtaulne drukarki. ---Początek cytatu Wskazówka od Ricka Bresslera: Dobra rada. Ja używam czegoś bardzo podobnego. Jedna pomocna wskazówka, to poniżej nie jest dobrym pomysłem: :lp=/dev/null:\ lpr otwiera plik podany w ustawieniu lp= na wyłączność. Robi tak, żeby zapobiec zapisywaniu przez wiele procesów do tej samej drukarki w tym samym czasie. Ubocznym efektem tego jest, że w twoim przypadku 'eng' i 'colour' nie mogą drukować w tym samym czasie (zwykle mniej lub bardziej przezroczyste, ponieważ będą raczej drukowały szybko no i jest też kolejka. Tak że nie powinieneś niczego zauważyć). Ale każdy inny proces, który spróbuje zapisać do /dev/null przerwie działanie. W systemie jednoużytkownikowym nie jest to problem. Ja mam system z 50. drukarkami - i tam byłby to problem. Rozwiązaniem jest stworzenie fałszywej drukarki dla każdej. Np. 'touch /dev/eng'. Zmodyfikowałem pola w pliku /etc/printcap powyżej i wziąłem pod uwagę sugestie Ricka. Wykonałem te dwa polecenia: #touch /dev/eng #touch /dev/colour ---Koniec cytatu --------------------------%<---------------------------------- Następna strona Poprzednia strona Spis treści

Wyszukiwarka

Podobne podstrony:
SMB HOWTO pl 2 (2)
SMB HOWTO pl 6 (2)
SMB HOWTO pl 10 (2)
SMB HOWTO pl 5 (2)
SMB HOWTO pl 12 (2)
SMB HOWTO pl 3 (2)
SMB HOWTO pl 8 (2)
SMB HOWTO pl 4 (2)
SMB HOWTO pl 4 (2)
SMB HOWTO pl
SMB HOWTO pl 1 (2)
SMB HOWTO pl 7 (2)
SMB HOWTO pl (3)
SMB HOWTO pl 11 (2)
bootdisk howto pl 8
PPP HOWTO pl 6 (2)
NIS HOWTO pl 1 (2)
cdrom howto pl 1

więcej podobnych podstron