Samba Freigaben ohne root einbinden
Leider kann man ja bekanntlich Samba Freigaben nur als root mounten. Um dieses Problem zu umgehen, habe ich ein kleines C++ Programm geschrieben, welches sich root Rechte "verschafft", und dann die Freigaben einbindet / löst. Könnte man auch mit sudo lösen. Ich mag sudo aber nicht. ;)
Der C++ Code
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include <iostream> #include <cstdlib> #include <string> using namespace std; int main(int argc, char *argv[]) { setuid(0); string uid = "1000"; string gid = "100"; string mount = "/sbin/mount.cifs "; string umount = "/bin/umount "; string usage = "Usage:\\n"; usage = usage+" Mount: "+(string)argv[0]+" -m //<server>/<freigabe> /<mountpoint> <username> <password>"; usage = usage+"\\n Unmount: "+(string)argv[0]+" -u /<mountpoint>\\n\\n"; if(argc>1) { if((string)argv[1]=="-m") { cout << "- "+(string)argv[2]+" (verbinden...)\\n\\n"; if(argc==6) { mount = mount+(string)argv[2]+" "+(string)argv[3]+" -o user="+(string)argv[4]+",pass="+(string)argv[5]+",gid="+gid+",uid="+uid+",codepage=cp850,iocharset=utf8"; system(mount.c_str()); } else { cout << usage; } } else if((string)argv[1]=="-u") { cout << "- "+(string)argv[2]+" (trennen...)\\n\\n"; if(argc==3) { umount = umount+(string)argv[2]; system(umount.c_str()); } else { cout << usage; } } else { cout << usage; } } else { cout << usage; } } |
Das Programm ist eigentlich ganz einfach. Es prüft nur, ob alle benötigten Werte übergeben wurden, und gibt diese dann mit dem system(); Befehl an das richtige mount/umount Programm weiter.
Es wird aber nicht geprüft, ob die Werte richtig sind. Das macht dann mount/umount und gibt dann evtl Fehlermeldungen aus.
Wichtig: Bevor das Programm übersetzt werden kann, musst du im Quellcode noch die richtige UID deines Benutzers und die richtige GID deiner Gruppe eintragen. An sonsten besitzt du keine Berechtigungen auf die eingehängte Freigabe. Einfach die Werte zwischen den " im Quellcode ändern.
Welche ids deine sind, kannst du in der Konsole mit dem Befehl "id" herraus finden.
Programm übersetzen
Um das Programm auszuführen, muss es noch übersetzt werden. Also nimm den Quellcode, und pack ihn in eine Datei. Als name kannst du da zB smbmount.cpp nehmen.
Dann muss man einfach folgenden Befehl in der Linux Konsole ausführen.
| 1 | g++ smbmount.cpp -o ~/bin/smbm |
Beim übersetzen muss g++ zum einen die *.cpp Datei angegeben werden, und zum anderen mit der Option "-o" den Ort, wo das fertig übersetzte Programm landen soll. Hierbei habe ich einfach den Ordner "bin" im Homeverzeichnis gewählt. Du kannst aber auch jeden anderen Ort nehmen.
Dem Programm root Rechte verschaffen
Damit das Programm auch als root ausgeführt werden kann, ohne selber root zu sein, müssen noch diverse Berechtigungen gesetzt werden.
- Der Besitzer des Programms muss root sein.
- Das Programm muss mit den Berechtigungen des Besitzers ausgeführt werden.
Folgende Befehle müssen als root ausgeführt werden!
Mit folgendem Befehl weisen wir dem Programm als Besitzer root und die Gruppe des Benutzers zu, der das Programm ausführen möchte.
| 1 | chown root:sim4000 /ordner/zum/programm/smbm |
Jeder Benutzer hat in den meisten Fällen auch eine gleichnamige Gruppe. Damit ist es möglich, das ausführen unseres mount Programms auf einen Benutzer und root zu beschränken. Um das zu bewerstelligen, müssen nun noch die Zugriffsrechte auf die Datei gesetzt werden.
| 1 | chmod u=rwxs,g=x,o=- /ordner/zum/programm/smbm |
Nach diesem Programmaufruf dürfen nur noch root und die Gruppe das Programm ausführen. Allen anderen wurden die Rechte dazu entzogen. Damit nun ein normaler Benutzer das Programm ausführen darf, muss er Mitglied in der angegeben Gruppe sein! In dem Beispiel hier der Gruppe sim4000.
Die Berechtigungen müssen nun so aussehen.
| 1 2 | <root> (/home/sim4000/bin) ls -al smbm -rws--x--- 1 root sim4000 14627 22. Jun 12:04 smbm |
Wenn alles stimmt, kann das Programm wie folgt aufgerufen werden.
Freigabe einbinden
Um eine Freigabe einzubinden, muss das Programm mit der Option "-m" gestartet werden.
| 1 | ./smbm -m //rechner/freigabe /mount/point username password |
Freigabe aushängen
Um die Freigabe wieder auszuhängen, muss das Programm mit der Option "-u" gestartet werden.
| 1 | ./smbm -u /mount/point |
All-in-One Bash Script
Um mir die Sache noch etwas zu erleichtern, hab ich mir dazu noch ein Bash Script geschrieben, mit dem man mehrere Freigaben gleichzeitig einbinden oder trennen kann.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #!/bin/bash BIN="/home/sim4000/bin/smbm" # Pfad zu dem C++ Programm USER="benutzername" # Benutzername der Freigaben PASS="password" # Password der Freigaben FOLDER="home/sim4000/samba" # Ordner, in dem die Freigaben eingebunden werden SERVER="192.168.1.1" # IP Adresse des Windows/Samba Servers case "$1" in mount) $BIN -m //$SERVER/dokumente /$FOLDER/dokumente $USER $PASS $BIN -m //$SERVER/projekte /$FOLDER/projekte $USER $PASS ;; umount) $BIN -u /$FOLDER/dokumente $BIN -u /$FOLDER/projekte ;; *) echo "usage: $0 {mount|umount}" esac exit 0 |
Das Script dient dazu, mehrere Freigaben, die auf einem Server sind gleichzeitig einzubinden / zu trennen.
Das Script funktioniert also nur mit Freigaben die die selben Zugansdaten haben, und auf dem selben Server sind. An sonsten müssen die Variablen durch die richtigen Daten ersetzt werden.




