SMB-Howto Autor:David Wood, dwood@plugged.net.au v1.0, 10 August 1996 WWeerrssjjaa ppoollsskkiieeaa:: BBaarrttoosszz MMaarruusszzeewwsskkii BB..MMaarruusszzeewwsskkii@@zzssmmeeiiee..ttoorruunn..ppll v1.12, 26 Lipca 1997 Jest to dokument z serii HOWTO (Jak To Zrobić). Opisuje on jak używać Session Message Protocol, zwanego też NetBIOS lub LanManager z Linux- em. Dokument ten został napisany w standardzie ISO-8859-2. Oryginał można znaleźć pod adresem ftp.icm.edu.pl w katalogu /pub/Linux/sun­ site/docs/HOWTO. ______________________________________________________________________ Table of Contents: 1. Wprowadzenie. 1.1. Dalsze informacje. 2. Instalacja. 3. Uruchamianie demonów. 4. Ogólna konfiguracja. (/etc/smb.conf) 5. Udostępnianie dysku Linux-owego komputerom z Windows. 6. Udostępnianie dysku spod Windows maszynom z Linux-em. 7. Udostępnianie drukarki Linux-owej komputerom z Windows. 8. Udostępnianie drukarki spod Windows komputerom z Linux-em. 9. Prawa autorskie i Zakończenie. 9.1. Prawa autorskie. 9.2. Podziękowania. 9.3. Od tłumacza. ______________________________________________________________________ 11.. WWpprroowwaaddzzeenniiee.. Jest to dokument z serii HOWTO (Jak To Zrobić). Opisuje on jak używać z Linuxem Session Message Protocol, zwanego też NetBIOS lub LanManager. Dokument ten jest prowadzony przez Davida Wooda dwood@plugged.net.au. Wszelkie dodatki, modyfikacje lub poprawki mogą być przesłane do mnie, aby je później umieścić w następnej wersji. Protokół SMB używany jest przez Microsoft Windows 3.11, NT i 95 aby współdzielić zasoby dyskowe i drukarki. Maszyny Unix-owe (w tym także Linux) mogą korzystać z tych zasobów używając narzędzi stworzonych przez Andrew Tridgella. Są cztery rzeczy, które można zrobić Sambą: 1. Udostępniać dysk Linux-owy dla komputerów z Windows. 2. Udostępniać dysk Windows-owy dla komputerów z Linux-em. 3. Udostępniać drukarkę pod Linux-em dla Windows. 4. Udostępniać drukarkę pod Windows dla Linux-a. Wszystko to zostało opisane w tym dokumencie. Disclaimer. Procedury i skrypty albo działały u autora, albo zostały opisane jako działające przez tych, którzy je napisali. Różne konfiguracje mogą nie działać z podanymi tutaj informacjami. Jeśli odkryjesz taką sytuację możesz napisać do autora list z sugestią na ulepszenie tego dokumentu, ale autor nic nie gwarantuje. A czego się spodziewałeś ? W końcu autor jest tyklo konsultantem. 11..11.. DDaallsszzee iinnffoorrmmaaccjjee.. Dokument ten jest próbą opisania jak skonfigurować na Linux-ie podstawowe serwisy SMB związane z plikami i drukarkami. Samba jest bardzo złożonym i kompletnym pakietem. Nie ma sensu, żeby kopiować tutaj wszystko to co jest zawarte w dokumentacji dla tego pakietu. Dalszych informacji możesz szukać w: ˇ Dokumentacji do Samby, która jest częścią dystrybucji. Dystrybucja jest dostępna pod adresem: ftp.icm.edu.pl ˇ HOWTO dotyczącym drukowania (Printing HOWTO) ˇ oraz w mini-HOWTO Print2Win. 22.. IInnssttaallaaccjjaa.. Najświeższe źródła Samby dostępne są pod adresem ftp.icm.edu.pl w katalogu /pub/samba. Jeśli instalowałeś dystrybucję Red Hat mogłeś wybrać instalację Samby jako jedną z opcji. Niektóre inne dystrybycje też oferują binaria Samby. Następujące demony są wymagane do pracy z Sambą. Zwykle znajdują się one w katalogu /usr/sbin i są uruchamiane w momencie startu systemu albo przez demon inetd. Przykładowe skrypt znajdują się w sekcji ``Uruchamianie demonów.'' ______________________________________________________________________ smbd (Demon SMB) i nmbd (Świadczy usługi nameservera NetBIOS-u) ______________________________________________________________________ Zwykle w systemie instalowane są następujące binaraia w katalogu /usr/bin: ______________________________________________________________________ smbclient (Klient dla maszyn Unix-owych), smbprint (skrypt do drukowania na drukarce przyłączonej do hosta SMB), smbprint.sysv (To samo co wcześniej, ale dla systemu UNIX SVR4), smbstatus (Wyświetla bieżące połączenia SMB na lokalnym hoście), smbrun (Główny skrypt do uruchamiania aplikacji na hoście SMB) ______________________________________________________________________ Dodatkowo zawarty jest w tym dokumencie skrypt o nazwie "print", który jest pożytecznym dokończeniem skryptu smbprint. Pakiet Samba jest prosty w instalacji. Ściągnij go z podanego wcześniej miejsca i przeczytaj plik README znajdujący się w dystrybucji. Jest jeszcze plik docs/INSTALL.txt, który podaje krok po kroku co należy zrobić, aby zainstalować Sambę. Postępując wraz z instalacją, umieść demony w /usr/sbin i binaria w /usr/bin. Zainstaluj strony do podręcznika systemowego "man" w /usr/local/man. Kiedy będziesz instalował pakiet Samba, będziesz musiał podać miejsce, gdzie ma się znajdować plik konfiguracyjny smb.conf. Z reguły jest to katalog /etc, ale możesz go umieścić, gdzie ci się podoba. Dla dalszych instrukcji założymy, że plik konfiguracyjny umieściłeś w /etc, plik logujący to /var/log/samba-log.%m i katalog blokujący to /var/lock/samba. Zainstaluj plik konfiguracyjny smb.conf. Przejdź do katalogu, gdzie została skompilowana Samba. Zajrzyj do katalogu examples/simple i przeczytaj plik README. Skopiuj znaleziony tam plik smb.conf do /etc. OOSSTTRROOŻŻNNIIEE !!!!!! Jeśli masz dystrybucję Linux-a, która miała Sambę i zainstalowałeś ją to pewnie masz już plik smb.conf w katalogu /etc i lepiej zacznij od tego pliku. Jeśli nie chcesz umieszczać pliku konfiguracyjnego w /etc, to umieść go tam, gdzie chcesz i zrób symboliczne dołączenie: ______________________________________________________________________ ln -s /gdzie/jest/smb.conf /etc/smb.conf ______________________________________________________________________ 33.. UUrruucchhaammiiaanniiee ddeemmoonnóóww.. Dwoma demonami SMB są: /usr/sbin/smbd i /usr/sbin/nmbd. Możesz je uruchomić przez demona inetd lub jako osobne procesy. Jeśli konfigurujesz na stałe serwer plikowy, to powinny one być uruchamiane przez inetd po to, żeby je ponownie uruchomić jeśli z jakiegoś powodu przestaną działać. Jeśli chcesz korzystać z Samby tylko czasami, to możesz je uruchomić z któregoś ze skryptów startowych w katalogu /etc/rc.d albo po prostu od ręki wtedy kiedy je potrzebujesz. Aby uruchomić demony przez inetd umieść następujące linie w pliku /etc/inetd.conf: ______________________________________________________________________ Serwis NetBIOS dla Samby # netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd ______________________________________________________________________ Następnie wyślij sygnał HUP do procesu nr 1: ______________________________________________________________________ kill -HUP 1 ______________________________________________________________________ Dla użytkowników dystrybucji Red Hat. Aby uruchomić te demony ze skryptów startowych, umieść następujący skrypt w katalogu /etc/rc.d/init.d/smb i dołącz je symbolicznie do plików podanych w komentarzu: ______________________________________________________________________ #!bin/sh # # /etc/rc.d/init.d/smb - startuje i zatrzymuje serwis SMB # # Następujące pliki powinny być symbolicznymi dołączeniami do # tego pliku: # /etc/rc.d/rc1.d/K35smb (Zatrzymuje serwis SMB podczas # zamknięcia systemu. # /etc/rc.d/rc3.d/S91smb (Startuje serwis SMB w trybie # wieloużytkownikowym # /etc/rc.d/rc6.d/K35smb (zatrzymuje serwis SMB podczas resetu) # # Biblioteka funkcji etc/rc.d/init.d/functions # Konfiguracja sieci etc/sysconfig/network # Sprawdź czy jesteśmy w sieci [ ${NETWORKING} = "no" ] && exit 0 # Zobacz jak zostaliśmy wywołani case "$1" in start) echo -n "Starting SMB services: " daemon smbd -D daemon nmbd -D echo touch /var/lock/subsys/smb ;; stop) echo -n "Shutting down SMB services: " killproc smbd killproc nmbd rm -f /var/lock/subsys/smb echo "" ;; *) echo "Usage: smb {start|stop}" exit 1 esac ______________________________________________________________________ Od tłumacza: Jeśli używasz dystrybucji Slackware. Umieść poniższy fragment w skrypcie startowym /etc/rc.d/rc.local: ______________________________________________________________________ # czy jesteśmy w sieci [ ${NETWORKING} = "no" ] && exit 0 # Uruchmon demony Samby /usr/sbin/smbd -D /usr/sbin/nmbd -D ______________________________________________________________________ 44.. OOggóóllnnaa kkoonnffiigguurraaccjjaa.. ((//eettcc//ssmmbb..ccoonnff)) Konfiguracja Samby na Unix-ie jest kontrolowana jednym plikiem: /etc/smb.conf. W pliku tym umieszczasz zasoby jakie chcesz udostępnić dla świata i jakie restrykcje chcesz wprowadzić. Ponieważ ta sekcja opisuje udostępnianie dysków i drukarek Linux-owych Windowsom, plik smb.conf będzie najprostszym z możliwych. Nie martw się o szczegóły. Późniejsze sekcje wprowadzą ogólny koncept. Każda sekcja pliku zaczyna się od nazwy jak np.: global, homes, printers itp. Sekcja global definiuje kilka ogólnych zmiennych, które będą się odnosić do wszystkich udostępnianych zasobów. Sekcja homes pozwala użytkownikom na dostęp do ich (i tyklo ich) katalogów domowych na lokalnej maszynie Linux-owej. Jeśli jakiś użytkownik Windows będzie chciał skorzystać z udostępnianych zasobów, to zostanie podłączony do swojego katalogu domowego. Zauważ, że aby to zrobić użytkownik musi mieć swoje konto na maszynie Linux-owej. Poniższy przykładowy plik smb.conf pozwala użytkownikom na dostęp do swoich katalogów domowych i na zapis do katalogu tymczasowego. Aby użytkownik Windows zobaczył udostępniane zasoby, Linux musi być w tej samej sieci lokalnej. Użytkownik Windows po prostu dołącza dysk sieciowy z Menedżera Plików lub Eksploratora Windows. W następnych sekcjach będą dodawane kolejne linie do tego pliku, aby umożliwić dostęp do większej ilości zasobów. ______________________________________________________________________ etc/smb.conf ; ; Po wprowadzeniu zmian do tego pliku zrestartuj demony Samby ; kill -9 `pidof smbd`; kill -9 `pidof nmbd` ; /usr/sbin/smbd; /usr/sbin/nmbd [global] Umieść to w pliku jeśli chcesz konto anonimowe guest account = nobody log file = /var/log/samba-log.%m lock directory = /var/lock/samba share modes = yes [homes] comment = Katalogi Domowe browseable = no read only = no create mode = 0750 [tmp] comment = Miejsce na pliki tymczasowe path = /tmp read only = no public = yes ______________________________________________________________________ 55.. UUddoossttęęppnniiaanniiee ddyysskkuu LLiinnuuxx--oowweeggoo kkoommppuutteerroomm zz WWiinnddoowwss.. Jak widać na powyższym przykładzie udostępnianie dysków Linux-owych użytkownikom Windows jest proste. Dostęp do zasobów udostępnianych poprzez Sambę można w bardzo dużym stopniu kontrolować. Aby udostępnić wszystkim jakieś zasoby, dodaj poniższe linie do smb.conf: ______________________________________________________________________ [public] comment = Public Stuff path = /home/public public = yes writable = yes printable = yes ______________________________________________________________________ Aby umożliwić zapis do tego katalogu tylko dla członków grupy staff, zmodyfikuj te linie w następujący sposób: ______________________________________________________________________ [public] comment = Public Stuff path = /home/public public = yes writable = yes printable = no write list = @staff ______________________________________________________________________ Więcej informacji na temat różnych sposobów udostępniania zasobów znajdziesz w dokumentacji do Samby. 66.. UUddoossttęęppnniiaanniiee ddyysskkuu ssppoodd WWiinnddoowwss mmaasszzyynnoomm zz LLiinnuuxx--eemm.. Wraz z dystrybucją Samby otrzymujemy klienta dla Unix-ów. Jego interfejs poleceń jest podobny do ftp. Możesz go używać, aby przenosić pliki między Windowsowym "serwerem" a klientem Linux-owym. Aby zobaczyć jakie zasoby sa udostępnione na danym hoście napisz: ______________________________________________________________________ /usr/sbin/smbclient -L host ______________________________________________________________________ gdzie host jest nazwą maszyny, której zasoby chcesz zobaczyć. Polecenie to zwróci listę nazw serwisów - to znaczy nazw dysków lub drukarek, które może udostępnić. Serwer Samby będzie cię pytał o hasło, o ile nie ma skonfigurowanego bezpiecznego dostępu. Np. ______________________________________________________________________ smbclient -L zimmermann ______________________________________________________________________ Polecenie to powinno wyświetlić coś na kształt: ______________________________________________________________________ Server time is Sat Aug 10 15:58:27 1996 Timezone is UTC+10.0 Password: Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51] Server=[ZIMMERMAN] User=[] Workgroup=[WORKGROUP] Domain=[] Sharename Type Comment --------- ---- ------- ADMIN$ Disk Remote Admin public Disk Public C$ Disk Default share IPC$ IPC Remote IPC OReilly Printer OReilly print$ Disk Printer Drivers This machine has a browse list: Server Comment --------- ------- HOPPER Samba 1.9.15p8 KERNIGAN Samba 1.9.15p8 LOVELACE Samba 1.9.15p8 RITCHIE Samba 1.9.15p8 ZIMMERMAN ______________________________________________________________________ Browse list pokazuje inne serwery SMB udostępniające zasoby w sieci. Aby użyć klienta napisz: ______________________________________________________________________ /usr/sbin/smbclient serwis ______________________________________________________________________ gdzie serwis jest nazwą maszyny i zasobu. Na przykład jeśli próbujesz dostać się do katalogu, który jest udostępniany jako public na maszynie o nazwie zimmermann, serwisem byłoby: \zimmermanublic. Chociaż z powodu powłoki w Linux-ie będziesz musiał oznaczyć znaki specjalnie i polecenie ostatecznie wygląda tak: ______________________________________________________________________ usr/sbin/smbclient \\\\zimmerman\\public hasło ______________________________________________________________________ gdzie hasło jest łańcuchem znaków będącym twoim hasłem. Pojawi się wtedy znak zachęty klienta Samby: ______________________________________________________________________ Server time is Sat Aug 10 15:58:44 1996 Timezone is UTC+10.0 Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51] smb: \> ______________________________________________________________________ Napisz 'h', aby uzyskać pomoc: ______________________________________________________________________ smb: \> h ls dir lcd cd pwd get mget put mput rename more mask del rm mkdir md rmdir rd prompt recurse translate lowercase print printmode queue cancel stat quit q exit newer archive tar blocksize tarmode setmode help ? ! smb: \> ______________________________________________________________________ Jeśli umiesz używać ftp, to nie powinieneś potrzebować czytać podręcznika systemowego na temat smbclient. 77.. UUddoossttęęppnniiaanniiee ddrruukkaarrkkii LLiinnuuxx--oowweejj kkoommppuutteerroomm zz WWiinnddoowwss.. Aby udostepnić drukarkę Linux-ową Windowsom musisz się upewnić, że drukarka działa dobrze pod Linux-em. Jeśli możesz drukować spod Linux- a to ustawienie serwera SMB dla drukarki jest bardzo proste. Przeczytaj Priniting-HOWTO na temat ustawienia drukarki pod Linux-em. Ponieważ autor używa drukarki połączonej z Windows NT, sekcja ta nie powinna być brana za definicję, ale bardziej jako sugestia. Jeśli ktokolwiek ma ochotę się podzielić szczegółami na temat innych konfiguracji proszę o kontakt, aby ta sekcja mogła zostać skończona: dwood@plugged.net.au. Dodaj konfigurację na temat drukowania do 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 = Wszystkie drukarki 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 ______________________________________________________________________ Upewnij się, że ścieżka do drukarki (w tym wypadku w sekcji ]ljet[) jest taka sama jak katalog zadań w etc/printcap. UWAGA: Są pewne problemy przy udostępnianiu drukarki Unixowej przez Sambę komputerom z Windows NT. Jeden problem to taki, żeby NT widziało poprawnie drukarkę. Aby go zlikwidować przeczytaj plik docs/WinNT.txt, który jest dostarczany wraz z dystrybucją. Drugi problem to hasła. Przeczytaj ten sam plik, aby rozwiązać ten problem. 88.. UUddoossttęęppnniiaanniiee ddrruukkaarrkkii ssppoodd WWiinnddoowwss kkoommppuutteerroomm zz LLiinnuuxx--eemm.. Aby udostępnić drukarkę spod Windows-ów musisz zrobić następujące rzeczy: a) Musisz mieć poprawne pola w /etc/printcap i muszą one odpowiadać lokalnej strukturze katalogów (katalog dla drukarki itp.) b) 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. c) 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. d) 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. 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 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] -a drukuje jako ASCII; c drukuje sformatowane jako źródło; -code p drukuje 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] -a drukuje jako ASCII c drukuje sformatowany jako źródło -code p drukuje 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() { $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() { 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() { push(@newlines,$_); } close(FILE); } ______________________________________________________________________ 99.. PPrraawwaa aauuttoorrsskkiiee ii ZZaakkoońńcczzeenniiee.. 99..11.. PPrraawwaa aauuttoorrsskkiiee.. Dokument ten jest chroniony prawami autorskimi Davida Wooda 1996. Może on być reprodukowany w każdej formie i dystrybuowany bez ograniczeń tak długo jak nie zmieni się jego zawartość i zawarte jest w nim to stwierdzenie. 99..22.. PPooddzziięękkoowwaanniiaa.. Jeśli tylko przyślesz mi jakieś sugestie, umieszczę cię tutaj w następnej wersji. 99..33.. OOdd ttłłuummaacczzaa.. Tłumaczenie to jest chronione prawami autorskimi Š Bartosza Maruszewskiego. Dozwolone jest rozprowadzanie i dystrybucja na prawach takich samych jak dokument oryginalny. Jeśli znalazłeś jakieś rażące błędy ortograficzne, gramatyczne, składniowe, techniczne to pisz do mnie: B.Maruszewski@zsmeie.torun.pl Oficjalną stroną tłumaczeń HOWTO jest http://www.jtz.org.pl/ Aktualne wersje przetłumaczonych dokumentów znajdują się na tejże stronie. Dostępne są także poprzez anonimowe ftp pod adresem ftp.ippt.gov.pl w katalogu /pub/Linux/JTZ/. Przetłumaczone przeze mnie dokumenty znajdują się także na mojej stronie WWW. Są tam też odwołania do Polskiej Strony Tłumaczeniowej. Kontakt z naszą grupą, grupą tłumaczy możesz uzyskać poprzez listę dyskusyjną jtz@ippt.gov.pl. Jeśli chcesz sie na nią zapisać, to wyślij list o treści subscribe jtz Imię Nazwisko na adres listproc@ippt.gov.pl