|
Jest to dokument z serii HOWTO (Jak To Zrobić). Opisuje on jak używać w Linuksie Server Message Protocol, zwanego też Session Message Block, NetBIOS lub LanManager. Dokument ten skupia się na Linuksie, jednak Samba działa na większości systemów uniksowych.
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.
O wiele więcej dokumentacji znajduje się na stronie WWW Samby pod adresem www.samba.org. Możesz także korzystać z grupy dyskusyjnej comp.protocols.smb lub polskojęzycznej pl.comp.os.linux.sieci.
Protokół SMB używany jest przez Microsoft Windows 3.11, NT i 95/98 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. Przy pomocy narzędzi smbfs autorstwa Paal-Kr. Engstad (pke@engstad.ingok.hitos.no), Volker Lendecke (lendecke@namu01.gwdg.de) maszyny uniksowe mogą montować zasoby udostępniane z Windows.
Są cztery rzeczy, które można zrobić Sambą:
Wszystko to zostało opisane w tym dokumencie.
Zrzeczenie. 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.
Aby maszyny z systemami Windows 3.x mogły korzystać z SMB muszą mieć zainstalowany stos TCP/IP i DLL Win32. Oba te pakiety są dostępne na stronie WWW Microsoftu ( www.microsoft.com).
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:
Po pierwsz, aby używać Samby wszystkie twoje maszyny muszą byc w jednym segmencie sieci lokalnej i korzystać z protokołu TCP/IP. Samba nie będzie działać na innych protokołach. Jest to łatwe do osiągnięcia ponieważ Linux i Windows 95/98/NT są dostarczane z tym protokołem. Jednak jeśli używasz Windows 3.x, to będziesz musiał dodać obsługę tego protokołu.
Z usług SMB nie można korzystać poprzez routery. Jeśli chcesz takie coś zrobić, to musisz ustawić tunel IP, co jest poza tematyką tego HOWTO.
Najświeższe źródła Samby dostępne są pod adresem
ftp.icm.edu.pl w katalogu /pub/samba
. Oryginalny
adres to
ftp.samba.org.
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)
Zauważ, że serwis nazw oferowany przez demona nmbd różni się od tego oferowanego przez DNS (serwis nazw domen). Serwis nazw NetBIOS, to serwis nazw w stylu Windows używany do SMB. Innymi słowy, to że masz DNS nie oznacza, że Samba będzie umiała odczytywać nazwy komputerów.
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)
Binaria do obsługi systemu plików (smbfs) omówione są w dalszej części dokumentu.
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. OSTROŻNIE !!!
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
Dwoma demonami SMB są: /usr/sbin/smbd i /usr/sbin/nmbd
.
Możesz je uruchomić przez demona inetd
lub jako osobne
procesy. Samba będzie odpowiadać trochę szybciej jeśli jest
uruchomiona jako osobny demon niż z inetd.
W obu przypadkach powinieneś sprawdzić czy w pliku
/etc/services
znajdują się takie linie:
netbios-ns 137/tcp nbns netbios-ns 137/udp nbns netbios-dgm 138/tcp nbdgm netbios-dgm 138/udp nbdgm netbios-ssn 139/tcp nbssn
Upewnij się, że wszystkie są odkomentowane. W zależności od dystrybucji, możliwe, że będziesz musiał je dodać. Samba nie będzie w stanie dowiązać się do odpowiednich portów jeśli w tym pliku nie znajdą się powyższe linie.
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 `cat /var/run/inetd.pid`
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
Jeśli podczas startu Samby pojawi się błąd mówiący coś o niemożności dowiązania się do portu 139, to prawdpodobnie jest inny proces Samby jeszcz działąjący. Sprawdź listę procesów (poleceniem 'ps auxww | grep mbd'), żeby zobaczyć czy to prawda.
Konfiguracja Samby na Uniksie 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
Po stworzeniu nowego pliku smb.conf
dobrze jest zweryfikować
czy jest poprawny. Można to zrobić przy pomocy programu
testparm (informacje o nim znajdziesz na stronie podręcznika
systemowego). Jeśli program ten nie zgłosi żadnych błędów, to smbd
poprawnie załaduje ten plik.
Oto pewien trick: Jeśli twój serwer Samba ma więcej niż jeden interfejs ethernetowy, smbd może dołączyć się do złego. Jeśli tak się stanie, to możesz zmusić smbd do dowiązania się do dobrego przez dodanie do sekcji [global] poniższej linii:
interfaces = 192.168.1.1/24
Uwaga: Liczba po znaku '/' odnosi się do maski podsieci. "24" to wartość jaką należy użyć dla niepodzielonej klasy C. Więcej informacji okalkulacjach dotyczących podsieci znajdziesz pod adresem www.ziplink.net/~ralphb/IPSubnet/index.html.
Dostępne jest graficzne narzędzie konfiguracyjne do Samby: GtkSamba. Zerknij pod adres www.open-systems.com/gtksamba.html.
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 = no
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
Kiedyś było to bardzo proste: po prostu startowałeś Sambę i zasoby można było przeglądać z Windows na PC. Jednak Microsoft ostatnio trochę utrudnił życie korzystającym z Samby. Systemy Windows 98, Windows NT (z service pack 3 i nowszym) i ostatnie Windows 95 używają teraz standardowo kodowanych haseł. Samba natomiast korzysta domyślnie z niekodowanych haseł. Nie można przeglądać zasobów jeśli albo klient albo serwer używa kodowanych haseł ponieważ nie można połączyć się anonimowo.
Jeśli taki właśnie konflikt występuje u ciebie, to podczas próby połączenia się z zasobem powinieneś zobaczyć okienko z komunikatem: "You are not authorized to access that account from this machine".
Możesz skonfigurować albo Sambę do używania zakodowanych haseł, albo Windows do używani niekodowanych haseł.
Konfigurowanie Windows do używania kodowanych haseł Samby:
Windows 95/98
Używając edytora rejestrów (regedit) stwórz takie ustawienie: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VNETSUP dodaj nową wartość DWORD: Value name: EnablePlainTextPassword Data: 0x01.
Windows NT
Używając edytora rejestrów (regedit) stwórz takie ustawienie: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rdr\Parameters, dodaj nową wartość DWORD: Value Name: EnablePlainTextPassword Data: 0x01.
Kiedy te zmiany zostaną zrobione, zresetuj komputer z Windows i spróbuj podłączyć się do jakiegoś zasobu z Samby. Powinno to działać o ile serwere Samby używa niekodowanych haseł
Konfigurowanie Samby do używania haseł kodowanych:
W sekcji [global] w pliku /etc/smb.conf
dodaj
następujące linie:
encrypt passwords = yes smb passwd file = /etc/smbpasswd
Zanim to zrobisz zachęcam mocno do przeczytania plików
ENCRYPTION.txt
, Win95.txt
i WinNT.txt
w dokumentacji
do Samby.
Jeśli twoi klienci i serwer używają kodowanych haseł nie będziesz
mógł przeglądać zasobów serwera zanim nie zostanie zainicjowane
pierwsze połączenie z poprawną autentykacją. Aby to uczynić wpisz
ręcznie nazwę zasobu w Menedżerze Plików lub Eksplorerze w postaci
\\<nazwa serwera>\<nazwa zasobu>
. Zaloguj się z
poprawnym loginem i hasłem na tym serwerze.
Jeśli podejrzewasz, że serwis nazwa NetBIOS jest źle skonfigurowany
(może dlatego, że pojawiają się błędy "host not found"
podczas połączenia), to spróbuj użyć tylko adresu IP serwera
\\<IP serwera>\<nazwa zasobu>
.
Żeby nazwy plików pojawiały się poprawnie możliwe, że musisz dodać kilka ustawień do odpowiedniej sekcji zasobu. Poniższe działa poprawnie dla Windows 95/98/NT, ale możliwe, że trzeba te ustawienia zmodyfikować w przypadku Windows 3.x:
; Mangle case = yes zdaje się podawać poprawne nazwy ; dla Win 95/98 mangle case = yes ; Czy rozróżniać duże i małe litery case sensitive = no ; Domyślna wielkość liter przy tworzeniu plików default case = lower ; Zachowaj ustawienia dot. liter dla wszystkich plików preserve case = yes ; Zachowaj ustawienia dor. liter dla nazwa dos-owych (8.3) short preserve case = no
Więcej informacji na temat różnych sposobów udostępniania zasobów znajdziesz w dokumentacji do Samby. Możliwości konfiguracji Samby są o wiele większe niż pokazane tutaj. Na początek jednak wystarczy. Jeśli chcesz zrobić coś bardziej zaawansowanego, to zajrzyj na wspomnianą wcześniej stronę WWW Samby.
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 <hasło>
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: \\zimmerman\public. 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.
smbclient może być dobry do testowania jednak szybko może się znudzić w codziennej pracy. Będziesz pewnie chciał używać pakietu smbfs. Zawarte są tam dwa proste narzędzia: smbmount i smbumount. Działają dokładnie tak samo jak linuksowe polecenia mount i umount z tym, że operują na zasobach SMB.
Pakiet smbfs jest zawarty w większości dystrybucji Linuksa. Jedna ważna uwaga: Musisz mieć wkompilowaną w jądro obsługę systemu plików SMB (smbfs), aby móc używać tych narzędzi!
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 (bardzo dawno temu - zanim nasza sieć została całkiem przeniesiona na Linuksa), 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
.
Linie:
printcap name = /etc/printcap load printers = yes
decydują czy wszystkie drukarki zdefiniowane w
/etc/printcap
powinny być załadowane. Jeśli to zrobisz, to
nie ma sensu konfigurować drukarek indywidualnie. Sekcja
[printers] określa ustawienia dla drukarek, które chcesz
wyraźnie zdefiniować. Jeśli twój system drukowania nie działa w ten
sposób (BSD), to musisz skonfigurować fałszywy plik konfiguracyjny
dla drukarek (albo użyć techniki z poleceniem 'print'; zobacz
dalej). Więcej informacji na temat drukowania znajdziesz w
Printing-HOWTO.
Pożyteczną techniką testowania połączenia sieciowego jest zmiana polecenia print na:
print command = cp %S /tmp/print.%P.%S
Można potem przeanalizować plik wynikowy.
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.
Oleg L. Machulskiy (machulsk@shade.msu.ru) proponuje, że lepszym poleceniem byłoby:
print command = smb2ps %s | lpr -r -h -P %p
gdzie smb2ps to skrypt zamieniający plik otrzymany z Windows na bardziej użyteczny PostScript. Musi on odciąć pierwsze 3 linie i ostatnie dwie ponieważ te linie zawierają pewne kody PJL lub PCL.
Takie podejście jest potrzbne tylko wtedy jeśli Windows u ciebie drukuje PCL a nie prawdziwy PostScript. Dowiedziałem się, że Windows 95/98/NT nie posiadają same z siebie sterownika do PostScriptu, ale sterownik "Digital turbo Printserver 20" jest dobrym zamiennikiem takiego w większości przypadków. Słyszałem także, że sterownik "Apple LaserWriter II NTX" działa dobrze.
Jeff Stern (jstern@eclectic.ss.uci.edu) zgłosił coś takiego, co może niektórym z was pomóc:
--------------------------%<----------------------------------
Mój problem polegał na tym, że mogłem drukować na drukarce z samego
Linuksa, ale nie mogłem drukować na niej z Windows 95. Kiedy
próbowałem polecenia smbclient \\eclectic\belen -P i potem
próbowałem wydrukować plik pojawiały się komunikaty o braku
dostępu (access denied). Tak więc ustawiłem dla katalogu
/var/spool/lpd/lp1
atrybuty 777. Przykro mi, ale musiałem
to zrobić. Mogłem też wszystkich użytkowików zapisać do grupy 'lp'
i ustawić takie prawa dla tej grupy, albo zmienić właściciela
grupowego katalogu na 'users' ... . Ale jak na razie to działa z
prawami root:lp 777.
Inną rzeczą jaką administratorzy muszą wiedzieć, to fakt, że nazwa konta,z którego użytkownik próbuje drukować z Windows, musi istnieć także na Linuksie. I tak: jeśli na Windows jest użytkownik 'joe', ti na Linuksie musi być też użytkownik 'joe'. Hasło logowania użytkownika 'joe' będzie hasłem dostępu do drukarki na Linuksie. Użytkownik będzie zapytano o to hasło podczas dodawania drukarki sieciowej do swojego komputera.
Myślałem, że to nie będzie problemem u mnie, bo ustawiłem swoją
drukarkę jako 'public' (ogólnie dostępną) w /etc/smb.conf
.
Ale jednak wciąż jest pytanie o hasło. Windows nie daje niestety
możliwości podania innego loginu dla drukarki zdalnej. Używa po
prostu tego, którym zalogowałeś się do Windows.
--------------------------%<----------------------------------
Dr. Michael Langner (langner@fiz-chemie.de) wskazuje, że problemu z
prawami dostępu dla katalogu /var/spool/lpd/
można uniknąć
przez użycie takich ustawień:
path = /tmp print command = lpr -r -P%p %s
Czasami pojawi się błąd podczas przetwarzania PostScriptu z Windows, który powoduje wydrukowanie dodatkowej strony na końcu każdego zadania. Na początku każdej takiej strony znajduje się ''"%%[ Lastpage ]%%". Zdarza się to tylko w Windows 95/98 i spowodowane jest błędami w PostScripcie.
Jednym ze sposobów, aby sobie z tym poradzić jest użycie skryptu usuwającego ten kawałek złego PostScriptu z zadania wydruku. Innym sposobem jest znalezienie lepszego sterownika do PostScriptu do Windows. Najlepszym sposobem jest prawdopodobnie użycie LPRng zamiast PostScriptu do drukowania na serwerze Samby.
Erik Ratcliffe (erik@caldera.com) z Caldery powiedział mi, że
używanie LPRng oznacza, że na maszynach z Windows może byc użyty
każdy sterownik. Na serwerze Samby, używali oni takiego pliku
/etc/printcap
:
raw:\ :rw:sh: :lp=/dev/lp1 :sd=/var/spool/lpd/raw :fx=flp
LPRng nie wyamaga znaków ':\' na końcu każdej linii. Wciąż
potrzebna jest pozycja dotycząca drukarek w pliku
/etc/smb.conf
. Polecenie 'print' musi używać drukarki
zdefiniowanej jako "raw" w /etc/printcap
i
dane muszą być wysyłane do tej drukarki binarnie. Spróbuj użyc
poniższej linii:
print command = lpr -b -Praw %s
Możliwe też, że będziesz musiał skonfigurować kolejkowanie na Windows 95, tak żeby wysyłać wydruki bezpośrednio do drukarki zamiast je kolejkować.
Aby udostępnić drukarkę spod Windows-ów musisz zrobić następujące
rzeczy:
/etc/printcap
i muszą one
odpowiadać lokalnej strukturze katalogów (katalog dla drukarki itp.)
/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.
/usr/bin
.
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
--------------------------%<----------------------------------
Adam Neat ( adamneat@ipax.com.au) uprzejmie podał następujący skrypt, służący do robienia kopii zapasowych Windowsów na Linuksie przy pomocy narzędzia smbclient. Adam twierdzi, że używa go do robienia kopii zapasowych Windows 3.x i NT na Linuksie na napędzie DAT SCSI.
Adam nie jest dumny ze stylu kodowania, ale to działa. Jak ja to lubię mówić: "Jeśli działa i jest głupie, to nie jest głupie".
W skrypcie tym agnea1 jest nazwą użytkownika na Linuksie, który robi kopie.
#!/bin/bash clear echo Initialising ... checkdate=`date | awk '{print $1}'` if [ -f "~agnea1/backup-dir/backup-data" ]; then echo "ERROR: No config file for today!" echo "FATAL!" exit 1 fi if [ -d "~agnea1/backup-dir/temp" ]; then echo "ERROR: No tempoary directory found!" echo echo "Attempting to create" cd ~agnea1 cd backup-dir mkdir temp echo "Directory Made - temp" fi if [ "$1" = "" ]; then echo "ERROR: enter in a machine name (ie: cdwriter)" exit 1 fi if [ "$2" = "" ]; then echo "ERROR: enter in a SMB (Lan Manager) Resource (ie: work)" exit 1 fi if [ "$3" = "" ]; then echo "ERROR: enter in an IP address for $1 (ie: 130.xxx.xxx.52)" exit 1 fi ############################################################################# # Main Section # ############################################################################# cd ~agnea1/backup-dir/temp rm -r ~agnea1/backup-dir/temp/* cd ~agnea1/backup-dir/ case "$checkdate" in Mon) echo "Backuping for Monday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete" if [ -d "~agnea1/backup-dir/Monday" ]; then echo "Directory Monday Not found ... making" mkdir ~agnea1/backup-dir/Monday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf monday.tar * echo "done ..." rm ~agnea1/backup-dir/Monday/monday.tar mv monday.tar ~agnea1/backup-dir/Monday ;; Tue) echo "Backuping for Tuesday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete" if [ -d "~agnea1/backup-dir/Tuesday" ]; then echo "Directory Tuesday Not found ... making" mkdir ~agnea1/backup-dir/Tuesday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf tuesday.tar * echo "done ..." rm ~agnea1/backup-dir/Tuesday/tuesday.tar mv tuesday.tar ~agnea1/backup-dir/Tuesday ;; Wed) echo "Backuping for Wednesday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete" if [ -d "~agnea1/backup-dir/Wednesday" ]; then echo "Directory Wednesday Not found ... making" mkdir ~agnea1/backup-dir/Wednesday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf wednesday.tar * echo "done ..." rm ~agnea1/backup-dir/Wednesday/wednesday.tar mv wednesday.tar ~agnea1/backup-dir/Wednesday ;; Thu) echo "Backuping for Thrusday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete" if [ -d "~agnea1/backup-dir/Thursday" ]; then echo "Directory Thrusday Not found ... making" mkdir ~agnea1/backup-dir/Thursday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf thursday.tar * echo "done ..." rm ~agnea1/backup-dir/Thursday/thursday.tar mv thursday.tar ~agnea1/backup-dir/Thursday ;; Fri) echo "Backuping for Friday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete" if [ -d "~agnea1/backup-dir/Friday" ]; then echo "Directory Friday Not found ... making" mkdir ~agnea1/backup-dir/Friday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf friday.tar * echo "done ..." rm ~agnea1/backup-dir/Friday/friday.tar mv friday.tar ~agnea1/backup-dir/Friday ;; *) echo "FATAL ERROR: Unknown variable passed for day" exit 1;; esac ###########
Prawa autorskie tego HOWTO należą do Davida Wooda © 1996-1999, Można je reprodukować w każdej postaci oraz dystrybuować bez ograniczeń tak długo jak długo nie będzie zmieniana jego zawartość włącznie z tym stwierdzeniem.
Brad Marshall ( bmarshall@plugged.net.au) and Jason Parker ( jparker@plugged.net.au) dostarczyli czasu, cierpliwości, trochę skryptów i badań.
Adam Neat ( adamneat@ipax.com.au) dostarczył skrypt w bashu do robienia kopii zapasowych Windows na Linuksie.
Matthew Flint (
matthew@philtrum.demon.co.uk) powiedział mi o ustawienia
interfaces w smb.conf
.
Oleg L. Machulskiy ( machulsk@shade.msu.ru), Jeff Stern ( jstern@eclectic.ss.uci.edu), Dr. Michael Langner ( langner@fiz-chemie.de i Erik Ratcliffe ( erik@caldera.com) zasugerowali modyfikacje w rozdziale na temat udostępniania drukarki na Linuksie maszynom z Windows.
Alberto Menegazzi ( flash.egon@iol.it) dostarczył konfigurację MagicFilter.
Andrea Girotto ( icarus@inca.dei.unipd.it) dostarczył wielu wartościowych sugestii na temat całego dokumentu.
Dzięki także wszystki międzynarodowym tłumaczom, którzy umożliwili czytanie tego HOWTO ludziom nie znającym angielskiego: Takeo Nakano ( nakano@apm.seikei.ac.jp), Klaus-Dieter Schumacher ( Klaus-Dieter.Schumacher@fernuni-hagen.de), Andrea Girotto ( icarus@inca.dei.unipd.it) i wielu innym, z którymi nie mam kontaktu.
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:
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.jtz.org.pl w katalogu /HOWTO/
.
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
majordomo@ippt.gov.pl
Hosting by: Hurra Communications Sp. z o.o.
Generated: 2007-01-26 18:02:24