# FAQ Tips > Hier Suchen und Finden, Links, Tutorials >  Linux und Windows im Netzwerk (Samba)

## hunter

*Einführung*

Mit dieser HowTo möchte ich erklären wie man mit Windows und Linux Rechnern untereinander Dateien austauschen kann. Dazu wird Samba benutzt dessen Installation ich hier nicht beschreibe, da es jeder Distribution beiliegt und es einfacher ist es zu installieren als es selbst zu compilieren.


*Installationen*

Im folgenden solltet ihr nun mal auf eurer CD nachsehen welche Pakete es zu Samba gibt. Die genauen Namen sind von Distribution zu Distribution unterschiedlich, jedoch haben sie immer das Wort "samba" im Namen. Wenn ihr also ein genanntes Paket nicht habt, dann kann es durchaus sein das es in einem anderen Paket mit drin ist. Die Namen die ich hier nenne beziehen sich auf Mandrake.

Installieren solltet ihr:

samba-server (oft auch nur samba)
samba-client
samba-common

samba-docs
samba-swat

LinNeighborhood -> http://freshmeat.net/projects/linneighborhood/
XfSamba -> http://freshmeat.net/projects/xfsamba

Wer will kann sich die beiden letzten Programme auch als Quellcode besorgen und installieren. Da es hilfreiche aber von Samba unabhängige GUIs sind, könnt ihr das auch selbst compilieren.


*Samba aktivieren*

Jetzt müsst ihr in eurem Kontrollzentrum, Yast oder sonst was nur noch sicherstellen das der smb und der nmb Dienst läuft bzw. beim booten aktiviert werden soll.

Alternativ könnt ihr auch in einem Bootscript diesen Befehl einbauen: "samba start"

Zusätzlich ist es auch noch Sinnvoll Swat zu aktivieren. Das ist ein Webbasierendes Config Tool das später nützlich sein kann.


*Samba Server einrichten*

Samba besteht aus zwei Teilen: Server und Client. Der Server stellt nur Dateien und Geräte für andere Rechner bereit. Wenn ihr also Verzeichnisse "freigeben" wollt, müsst ihr den Server einrichten.

Dazu sichert zunächst einmal nur die folgende Datei: /etc/samba/smb.conf
Also: cp /etc/samba/smb.conf /etc/samba/smb.conf_org [als Root]

Nun editiert die /etc/samba/smb.conf mit einem Editor und löscht ihren kompletten Inhalt (passiert ja nichts, da die Datei gesichert wurde)

Folgenden Inhalt einfügen und anpassen:

[global]
workgroup = "selbe wie auch der Windows Rechner"
guest account = nobody
keep alive = 30
os level = 2
kernel oplocks = false
security = share
interfaces = "IP der Linux Rechners"/255.255.255.0
bind interfaces only = yes
socket options = TCP_NODELAY

-> Was in Anführungszeichen steht incl. (!) der Anführungszeichen ändern. Also letztendlich ohne die Anführungszeichen.

Damit habt ihr zunächst einmal nur den Server grundsätzlich eingestellt. Da ist noch nichts freigegeben (kommt gleich). 

Die Bedeutung ist:

workgroup -> Windows verwendet Arbeitsgruppen innerhalb von Subadressen, diese muss hier eingetragen werden
guest account = nobody -> Jeder darf zugreifen (im Netzwerk)
[...]
security = share -> Ermöglicht das freigeben von Verzeichnissen (ohne besonderen Schutz)
interfaces = "IP der Linux Rechners"/255.255.255.0 -> Festlegen des Servers auf die IP eurer Lankarte
bind interfaces only = yes -> Gültigkeit des Servers nur für das Lan
[...]

Den Rest übernehmt einfach wie ich ihn genannt habe.


Nun könnt ihr Verzeichnisse freigeben:

["Name des Shares"]
comment = "kurzer Komentar"
browseable = yes
path = /../../ "also Verzeichnis zum Share" (muss natürlich entsprechnede Rechte haben)
writeable = yes
public = yes
guest only = no
directory mask = 777
create mask = 666

-> Solch einen Block legt ihr nun für jeden Share/ jede Freigabe an. Es ist wichtig das dieses Verzeichnis auch die entsprechenden Rechte für andere Benutzer bekommt damit man von außen darauf zugreifen kann (unabhängig von den Einstellungen hier).

Bedeutung:

["Name des Shares"] -> Name den der Share haben soll; Beliebig aber einzigartig !
comment = "kurzer Komentar" -> Ein Kommentar dient dazu den Clients einen Hinweis zu geben was das für ein Share ist
browseable = yes -> Muss "yes" sein da man sonst den Inhalt nicht durchsuchen kann
path = /../../ -> Die Pfadangabe für das freizugebende Verzeichnis
writeable = yes -> Kann auch "no" sein wenn ihr schreiben nicht zulassen wollt
public = yes -> Kann auch "no" sein wenn ihr nicht wollt das es sichtbar ist; Verzeichnis muss dann expliziet angegeben werden
[...]

So könnt ihr jetzt für jeden Share vorgehen den ihr anlegen wollt. Kopiert einfach den Block und passt ihn jeweils an.

-> Speichert nun die Datei und führt folgende Befehle aus [als Root]:

samba condrestart
samba status

Ergebnis sollte sein:

> samba condrestart
Shutting down SMB services:                                     [  OK  ]
Shutting down NMB services:                                     [  OK  ]
Starting SMB services:                                          [  OK  ]
Starting NMB services:                                          [  OK  ]

> samba status
smbd (PID 3604) läuft ...
nmbd (PID 3613) läuft ...

- Sollte Samba nun nicht mehr laufen dann habt ihr in der Config einen Fehler gemacht. Korregiert das dann und wiederholt diese Befehle.

- Prüft dann mal von einem Windowsrechner aus ob ihr diese Shares nun sehen und darauf zugreifen könnt. Oder von einem Linuxrechner mit Samba Client (siehe nächsten Abschnitt).


*Samba Client benutzen*

Der Samba Client ist im Prinziep nun das gleiche wie das Windows Netzwerklaufwerk. Er mounted einen Share auf ein Verzeichnis in eurem System. Dabei könnt ihr Samba Shares oder Windows Freigaben mounten und dann benutzen.

Ich empfehle das benutzen einer GUI wie LinNeighborhood oder XfSamba. Das ist am einfachsten.


Alternativ könnt ihr aber auch die Konsole verwenden:

mount -t smbfs -o "Optionen" //Rechner/Freigabe /mount/point

-o "Optionen" -> Optionen für das mounten (siehe smbmount --help); oft reicht "guest"
//Rechner -> Name des Rechners (Server, Windows oder Linux (Samba))
../Freigabe -> Name des Shares den ihr mounten wollt (muss bekannt sein)
/mount/point -> Mountpoint auf den ihr die Freigabe mounten wollt (muss vorhanden sein)


Zum unmounten gebt ihr ein: smbumount /mount/point


Wichtig ist hier vor allem die Option -o, da es eventuell sein kann das ihr ein Passwort und / oder einen Benutzernamen angeben müsst um den Share überhaupt mounten zu dürfen. Das ist Serverseitig bestimmt.


*Anmerkungen*

Wie ihr bereits gemerkt habt, habe ich beim Client mit einbezogen das Shares vieleicht durch Passworte geschützt sein können. Die von mir angegebene Config für den Samba Server beinhaltet dies nicht. Es ist nur die Sicherung drin das das nur im Lan freigegeben sein soll. Wer nun in großen Netzwerken ist, der sollte entweder nur "unbedeutende" Daten sharen oder mit Passwortschutz arbeiten. Ich empfehle dazu eine HowTo von LKH:

http://www.linuxforen.de/forums/show...threadid=18923


*Drucker freigeben*

Samba beherrscht neben der Freigabe von Dateien auch das teilen des Druckers. Ich beschreibe hier wie man das macht wenn man das weit verbreitete Drucker System CUPS verwendet.

Editiert die Datei /etc/samba/smb.conf

Fügt unter die [global] (unten) ein:

printcap name = lpstat
load printers = yes
printing = cups

-> Damit habt ihr die grundsätzliche Freigabe für Drucker aktiviert


Fügt nun unter die [global] und über den Shares den folgenden Block ein:

[printers]
comment = All Printer
spath = /var/spool/samba
browseable = no
guest ok = yes
writable = no
printable = yes
create mode = 0700
print command = lpr-cups -P %p -o raw %s -r # using client side printer drive
lpq command = lpstat -o %p
lprm command = cancel %p-%j 

-> Dieser Block gibt nun euren default Drucker aus CUPS frei und lässt zu, das andere darauf drucken können. Dabei wird deren Druckertreiber verwendet. Samba gibt den Druckauftrag nur an CUPS weiter, das ihn wiederrum an den Drucker weiterleitet.

Der Knackpunkt könnte dabei die Zeile "print command" sein. Solltet ihr Probleme haben, dann liegt es an den Optionen in dieser Zeile. In der Regel sollte das aber so laufen.

Danach wieder speichern und diese Befehle ausführen:

samba condrestart
samba status


*Schlussbemerkung*

Solltet ihr Probleme mit Samba haben, öffnet einen Thread im Bereich: Linux in heterogenen Netzen

Bei Fehlern in dieser HowTo oder Anmerkungen bitte direkt eine PN an mich.

----------


## spychodelics

Nur als kleiner Tipp : 

Um den Drucker bei mir wie oben aufgezeigt laufen zu lassen 
waren folgende Eintraege noetig 


[global]
printcap = cups           <---------
load printers = yes
printing = cups



[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = yes
writeable = no
printable = yes
create mode = 0700
print command = lpr-cups -P %p -o raw %s -r
lpq command = lpstat -o %p
lprm command = cancel %p-%j


Und eine Aenderung in /etc/cups/mime.types

application/octet-stream 

und in der /etc/cups/mime.convs

application/octet-stream        application/vnd.cups-raw        0       -

beides erlauben. 




Ich hoffe das hilft eventuell jemandem :-)


System : Redhat9 , Brother HL5040

mfg spy

----------


## uTaNG

Ich möchte diesem Thread noch eine kurze erläuterung der Variablen, die von Samba verwendet werden hinzufügen.
Samba stellt zwar nur eine geringe Anzahl von Variablen zur Verfügung,aber dennoch können sie sich in manchen fällen als sehr hilfreich erweissen.
Die Variable in der Konfigurationsdatei beginnt mit einem Prozentzeichen (%),gefolgt von einem Groß- oder Kleinbuchstaben. Zudem dürfen die Variablen nur auf der rechten Seite des Gleichheitszeichens auftauchen.

Samba kann 20 Definierte Variablen, die in 5 Bereiche aufgeteilt werden können benutzen.
Diese Bereiche sind:


*Client-Variablen*


```
%a = Client Architektur (siehe weiter unten "Die %a-Variable")
%I = IP-Adresse des Clients
%m = NetBIOS-Name des Clients
%M = DNS-Name des Clients
```

*Benutzer-Variablen*


```
%u = Aktueller Linux/Unix-Benutzername
%U = Angefoderter Client-Benutzername
%H = Home-Verzeichnis von %u
%g = Primäre Gruppe von %u
%G = Primäre Gruppe von %U
```

*Freigabe-Variablen*


```
%S = Name der aktuellen Freigabe
%P = root-Verzeichnis der aktuellen Freigabe  
%p = bekommt den Pfad des Automounters auf das root-Verzeichnis,wenn es ein anderer ist als %P
```

*Server-Variablen*


```
%d = Prozess-ID des aktuellen Servers
%h = DNS-Hostname des Samba-Servers
%L = NetBIOS-Name des Samba-Servers 
%N = Home-Verzeichnis-Server aus der automount-Map
%v = Samba-Version
```

*Sonstige-Variablen*


```
%R = Ausgehandelte SMB-Protokollstufe
%T = Aktuelles Datum und Uhrzeit
%$var = Wert der Umgebungsvariablen "var"
```

*Die %a-Variable*
.. je nach eingesetzem OS,kann diese Variable folgenden String erhalten ...


```
Windows 2000 und Windows XP = Win2k
Windows NT                  = WinNT
Windows 95 und Windows 98   = Win95
Windows for Workgroups      = WfwG
Samba                       = Samba
Jedes OS,das noch nicht aufgelistet wurde = UNKNOWN
```


So und nun zu einigen Beispielen wo man die ganze Geschichte Anwenden kann.



```
[global]
     server string = wIr Tanzen Samba %v auf %L
```

Mit der _server string_ Option können wir ein Kommentar vereinbaren was neben dem Server Namen in der Netzwerkumgebung auftaucht.(Und mit Hilfe der Variablen,gibt es noch zusatz Infos.)


```
        Sharename      Type      Comment
        ---------      ----      -------
        IPC$           IPC       IPC Service (wIr Tanzen Samba 2.2.8a auf gustaf)
        ADMIN$         Disk      IPC Service (wIr Tanzen Samba 2.2.8a auf gustaf)

        Server               Comment
        ---------            -------
        GUSTAF                 wIr Tanzen Samba 2.2.8a auf gustaf
```


In dem nächsten Beispiel weisst Samba jedem Client,der sich anmeldet eine Freigabe hinzu die von der Architektur des Client-Systems abhängig ist.



```
[pustekuchen]
     path = /tmp/samba/%a
```

somit sehe das zum Beispiel so aus:



> /tmp/samba/Win2k
> /tmp/samba/WinNT
> /tmp/samba/Win95
> /tmp/samba/WfwG
> /tmp/samba/Samba
> /tmp/samba/UNKNOWN


Dann ist es noch möglich zu der verwendetet Konfigurationsdatei ein weiter zuverwenden. Das kann sehr nützlich sein wenn ein Client noch weitere Optionen für seine Freigabe benötigt.



```
[pustekuchen]
     include = /etc/samba/smb.conf.%m
```

Möchte man allerdings das ein Spezielle Konfigurationsdatei verwendet werden soll wenn sich ein Client anmeldet dann nehmen wir nicht _include_ sondern:



```
[pustekuchen]
     config file = /etc/samba/smb.conf.%m
```

Somit kann man eine Ersatz Konfigurationsdatei angeben.

Weiter ist es Möglich auch speziell loggen zu lassen.



```
[pustekuchen]
     log file = /var/log/smb.log.%m
```

So das waren nun ein Paar Beispiele um vlt. mal zu demonstrieren was man mit den Variablen alles anfangen kann.

----------


## uTaNG

Da es für den ein oder anderen immer eine neue kleine Welt ist mit Samba umzugehen haben ich nochmal 2 ..Szenarien ausgepickt,die ich erläutern möchte.

*1.) das hinzufügen eines neuen Benutzers*
*2.) Verzeichnisfreigaben für unterschiedliche User*



*1.) das hinzufügen eines neuen Benutzers*
Wenn sich ein User von einem Client-System auf den Samba-Server einloggen möchte,dann muss auf dem Samba-Server ein Account für den jeweiligen User existieren. Hier gibt es häufig eine Verwechslung. Samba setzt vorraus das bereits ein System-Account vorhanden ist, ansonsten wird es nicht gelingen einen Samba-Acount zu erstellen.

Also legen wir als erstes einen Account für den User "flo" auf dem Linux-rechner an,dem gleichzeitig noch ein Home-Verzeichnis erstellt und in die Gruppe "users" aufgenommen wird.


```
test@linuxforen.de # useradd flo -m -G users
test@linuxforen.de # passwd flo
New UNIX password: 
Retype new UNIX password:
```

Ob ihr nun dem User ein Homeverzeichnis oder eine Shell gebt bzw. in welche Benutzergruppe ihr ihn aufnimmt,liegt ganz in euerem Interesse. Für Samba reicht es, wenn es den Benutzer gibt.

Damit ein Benutzer sich auf eine Samba-Freigabe einloggen kann,muss Samba ihn in der eigen Datenbank gelistet haben.



```
test@linuxforen.de # smbpasswd -a flo
New SMB password:
Retype new SMB password:
Added user flo.
```

Dabei ist es zu beachten das die Option _-a_ genutzt wird,da ansonsten nur das Passwort geändert wird. Dazu kommt,dass wenn es das erstemal ist das ein Benutzer mit _smbpasswd_ angelegt wird, Samba eine Fehlermeldung bringt, das die Datenbank nicht existiert. Das sit aber nicht weiter schlimm da die Datenbank nun,mit dem hinzufügen des neuen Users erstellt wurde.

Das wär es eigentlich zum Thema *das hinzufügen eines neuen Benutzers* gewesen.
Wenn man sich aus irgendeinen Grund,irgendwo vertippt hat bzw. den User-Account löschen möchte geht das ganz schnell.



```
test@linuxforen.de # smbpasswd -x flo
test@linuxforen.de # userdel -r flo
```


*2.) Verzeichnisfreigaben für unterschiedliche User*

Mein Ziel soll es sein,euch zu zeigen wie man Freigaben User-Spezifisch konfigurieren kann.
Ein kleines alltägliches Beispiel ist schnell gefunden und zwar bin ich mal so frech und nehme gleich ein Problem was einen Board-Member beschäftigte. Er wollte das der User _root_ vollenzugriff auf alle Verzeichnisse hat,während der User _Flo_ nur in seinem Home-Verzeichniss Arbeiten kann.

Ich hoffe er hat es auch so gemeint,nicht dsa ich ihn flasch verstenden habe...   :Big Grin: 
Aber ich werde euch mal dieses Szenario demonstrieren.


Schritt Nummer -eins-

Als erstes müssen wir den User _root_ in die Samba-Datenbank aufnehmen,da wir dieses mit _flo_ schon im vorrigen Abschnitt getan haben,werde ich diesen schritt mit ihm überspringen.



```
test@linuxforen.de # smbpasswd -a root
New SMB password:
Retype new SMB password:
Added user root.
```


Schritt Nummer -zwei-

Wir werden hier folgendes tun. 

Als erstes erstellen wir für jeden User eine seperate _smb.conf_ und diese bekommt als Erweiterung den Usernamen: _smb.conf.username_.

Meine _/etc/samba/smb.conf.root_


```
# Samba config file created by uTaNG
#
# Date: 2004/03/12
# Version: 0.1

[global]
     server string = wIr Tanzen Samba
     workgroup = ARBEITSGRUPPE
     encrypt passwords = yes
; Log Options
     log level = 0
     log file = /var/log/samba.log.%m
     max log size = 50
     debug timestamp = yes
     wins support = yes
     wide links = no
; Zugriff auf Freigaben steuern
     invalid users = bin daemon adm sync shutdown halt mail news uucp operator
     security = user
     smb passwd file = /etc/samba/private/smbpasswd
     client code page = 850
     character set = ISO8859-1
     oplocks = no
     level2 oplocks = no

[ROOT]
    path = /
    comment = du kommst hier net rein
    writeable = yes
```

Meine _/etc/samba/smb.conf.flo_


```
# Samba config file created by uTang
#
# Date: 2004/03/12
# Version: 0.1

[global]
     server string = wIr Tanzen Samba
     workgroup = ARBEITSGRUPPE
     encrypt passwords = yes
     config file = /etc/samba/smb.conf.%u
; Log Options
     log level = 0
     log file = /var/log/samba.log.%m
     max log size = 50
     debug timestamp = yes
     wins support = yes
     wide links = no
; Zugriff auf Freigaben steuern
     invalid users = bin daemon adm sync shutdown halt mail news uucp operator
     security = user
     smb passwd file = /etc/samba/private/smbpasswd
     client code page = 850
     character set = ISO8859-1
     oplocks = no
     level2 oplocks = no

[FLO]
     path = /home/flo
     comment = kratz mich =)
     writeable = yes
     valid users = flo
```

Und nun meine Normale _/etc/samba/smb.conf_


```
# Samba config file created by uTang
#
# Date: 2004/03/12
# Version: 0.1

[global]
     server string = wIr Tanzen Samba
     workgroup = ARBEITSGRUPPE
     encrypt passwords = yes
     config file = /etc/samba/smb.conf.%U
; Log Options
     log level = 0
     log file = /var/log/samba.log.%m
     max log size = 50
     debug timestamp = yes
     wins support = yes
     wide links = no
; Zugriff auf Freigaben steuern
     invalid users = bin daemon adm sync shutdown halt mail news uucp operator
     security = user
     smb passwd file = /etc/samba/private/smbpasswd
     client code page = 850
     character set = ISO8859-1
     oplocks = no
     level2 oplocks = no
```

Wie ihr seht hat sich im Globale-Teil bei mir, abgesehen von einer Option, nichts verändert.
Und zwar handelt es sich in der normalen _/etc/samba/smb.conf_ um die Option:



```
[global]
    config file = /etc/samba/smb.conf.%U
```

Diese lädt, entsprechend dem Benutzer eine neue smb.conf rein und ersetzt somit die "alte".
Fals sich nun ein 3ter User mit dem Namen "hunsekuns" einloggt und wird Samba in diesem Fall,keine _smb.conf.hunsekuns_ finde,da wir keeine erstellt haben. Aber das macht nichts, wenn es keine Spezielle smb.conf für den jeweiligen eingeloggten User gibt, wird die Standardt smb.conf verwendet.

Um das ganze euch zu demonstrieren, das das auch fein klappt:



```
test@linuxforen.de $ smbclient //192.168.99.12/root -U root
added interface ip=192.168.99.4 bcast=192.168.99.255 nmask=255.255.255.0
Password: 
Domain=[ARBEITSGRUPPE] OS=[Unix] Server=[Samba 2.2.8a]
smb: \> ls
  .                                   D        0  Sun Feb 22 15:19:40 2004
  ..                                  D        0  Sun Feb 22 15:19:40 2004
  bin                                 D        0  Fri Mar 19 18:18:35 2004
  dev                                 D        0  Thu Jan  1 01:00:00 1970
  etc                                 D        0  Sat Mar 27 13:30:44 2004
  lib                                 D        0  Fri Mar 19 18:18:35 2004
  mnt                                 D        0  Fri Mar 12 12:28:04 2004
  opt                                 D        0  Tue Feb 24 22:19:39 2004
  tmp                                 D        0  Sat Mar 27 12:54:17 2004
  sys                                 D        0  Thu Mar 25 12:21:52 2004
  var                                 D        0  Tue Feb 24 22:19:39 2004
  usr                                 D        0  Sun Mar  7 23:29:27 2004
  boot                                D        0  Tue Mar  9 01:02:40 2004
  home                                D        0  Sat Mar 27 13:28:45 2004
  proc                               DR        0  Thu Mar 25 12:21:52 2004
  sbin                                D        0  Tue Mar 23 22:03:07 2004
  root                                D        0  Tue Mar 23 22:02:41 2004

                38184 blocks of size 262144. 27240 blocks available
smb: \>
```



```
test@linuxforen.de $ smbclient //192.168.99.12/flo -U flo
added interface ip=192.168.99.4 bcast=192.168.99.255 nmask=255.255.255.0
Password:                       
Domain=[ARBEITSGRUPPE] OS=[Unix] Server=[Samba 2.2.8a]
smb: \> ls
  .                                   D        0  Sat Mar 27 13:28:45 2004
  ..                                  D        0  Sat Mar 27 13:28:45 2004
  .bashrc                             H      812  Sat Mar 27 13:28:45 2004
  .bash_profile                       H      232  Sat Mar 27 13:28:45 2004

                38184 blocks of size 262144. 27240 blocks available
smb: \> cd ..
smb: \> ls
  .                                   D        0  Sat Mar 27 13:28:45 2004
  ..                                  D        0  Sat Mar 27 13:28:45 2004
  .bashrc                             H      812  Sat Mar 27 13:28:45 2004
  .bash_profile                       H      232  Sat Mar 27 13:28:45 2004

                38184 blocks of size 262144. 27240 blocks available
smb: \>
```

So ich hoffe ich konnte dem ein oder anderem etwasbehilflich sein.   :Smilie:

----------

