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
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 1 (2)
SMB HOWTO pl 7 (2)
SMB HOWTO pl (3)
SMB HOWTO pl 11 (2)
SMB HOWTO pl 9 (2)
bootdisk howto pl 8
PPP HOWTO pl 6 (2)
NIS HOWTO pl 1 (2)
cdrom howto pl 1
więcej podobnych podstron