2017. február 13., hétfő

Samba (CIFS) megosztások automatikus fel- és lecsatolása KDE grafikus környezetben

Bevezető


Ennek a módszernek a megalkotása saját igényből merítkezik, de úgy gondolom, sokak számára lehet hasznos, így most közkinccsé teszem.
A módszert én KDE grafikus környezetben használom, de más grafikus környezetben is alkalmazható – apróbb módosításokkal.
A leírás többek számára "kisiskolás" vagy túlzottan szájba rágós lehet, de hát nem lehet mindenki Linux gugu, nem igaz? 😉

FIGYELMEZTETÉS

Felhívom a figyelmedet, hogy noha az alábbi leírás elkészítésénél igyekeztem a legnagyobb körültekintéssel eljárni, a leírásban előforduló hibákból (pláne nem az Olvasó figyelmetlenségéből), valamint a leírásban szereplő programok hibáiból adódó károkért semmilyen felelősséget nem vállalok. Továbbá a szövegben előforduló hivatkozásokon lévő dokumentumok tartalmáért sem vállalok felelősséget, az a hivatkozásokon található dokumentumok szerzőire tartozik.

Kijelentem, hogy az alábbi dokumentum a saját szellemi termékem, azt a CC BY-NC-SA 2.5 HU licenc alapján bárki felhasználhatja.

A környezet és a probléma, ami életre hívta ezt a megoldást


Van egy Ubuntu Linuxot futtató házi szerverem (Úgy tervezem, erről majd a későbbiekben írok még, miféle finomságok vannak rajta. 😊), ami Samba kiszolgáló segítségével sok-sok fájlt oszt meg a saját LAN-unkon. (Mily meglepő, igazi? 😉)
Évekig az Smb4K amúgy remek kis programot használtam a szervereken megosztott mappák tallózására és csatlakoztatására (még anno vállalati környezetben is egyetlen linuxos munkaállomást használóként 😉), ám nem olyan rég meggyűlt vele a bajom.
Ehhez egyrészt tudni kell, hogy kb. 15 éve Debian GNU/Linuxot használok az itthoni gépemen, abból is a testing kiadást. Mivel ez még nem egy stabil kiadás, előfordulhatnak benne hibák (Köztünk legyen szólva nem túl gyakori, és nem túl komolyak.), és sajnos az Smb4k elég régi verziója van gyárilag csomagolva.
Másrészről tapasztalatom szerint az iptables (egész konkrétan az UFW) is hajlamos bekavarni az Smb4k-nak, illetve az SMB/CIFS protokolloknak.
Persze-persze, töltögethetném és fordítgathatnám a SourceForge-ról az Smb4K friss verzióját, de erre nincs kapacitásom. No meg persze-persze, ki lehetne nyomozni, hogy mibe is aggat bele az iptables. Neki is álltam, de végül meguntam a nyomozást.
Így történt, hogy más megoldás után néztem.
Első verzió amivel próbálkoztam, hogy az fstab-ból csatolom fel a megosztásokat, de ezzel alapvetően az volt a bajom, hogy a gép indulása után mindenki számára elérhető lesz a felcsatolt mappa. Vagy nem, ha nincs másnak hozzáférése a csatolási ponthoz, hiszen én, mezei felhasználóként nem férek hozzá Béla saját mappájához, ahova felcsatolásra került a megosztott mappa. De ha én használom a gépet, nem pedig Béla, akkor mi a fenéért van felcsatolva a mappa. Plusz ugyanazt a megosztott mappát az én saját mappám alá is fel kellene csatolni. Minek többször felcsatolni ugyanazt a megosztást, ráadásul úgy, hogy egyszerre csak az egyik csatoláson keresztül használjuk? Felesleges erőforrás-pazarlás mind kliens, mind kiszolgáló oldalon.
Ez a verzió elvetve.
Létezik az SMBNetFS nevű okosság. Ezzel az csak az volt a bajom, hogy valamiért nem akaródzott neki működni. Hogy mi volt pontosan a baja, már nem emlékszem, de lényeg, ez is ment a lecsóba.
Számtalan blog- és fórumbejegyzést átrágása után, illetve közben kezdett alakot ölteni ötlet szinten az alábbi megoldás, amit aztán a megvalósítás követett.

Amire szükség lesz


Mint korábban említettem, Debian GNU/Linuxot használok, így az alábbiak erre a rendszerre igazak teljes mértékben, de nagy valószínűséggel a származtatott rendszerekben (pl. Ubuntu Linux, Linux Mint, stb.) is ugyanígy működik minden. Annyi különbség mindenképp van, hogy ezekben a rendszerekben alapból telepítésre kerül a sudo parancs, Debian alatt alapból (még) nem így van, de előfordulhat, hogy függőség miatt már telepítésre került. Ezt ezt többféle módon is ellenőrizheted, íme egy példa:

# which sudo

Az alábbi eredményt kell kapnod:

/usr/bin/sudo

Ha a fenti parancs nem ír ki semmit, akkor nincs telepítve a sudo. Telepíteni így tudod:

# su -

Add meg a root felhasználó jelszavát, majd:

# apt install sudo

Ha megvan, add hozzá saját magad a csoporthoz:

# adduser <FELHASZNÁLÓNEVED> sudo

Ezután jelentkezz ki a terminálon vagy konzolon, majd jelentkezz be újra, hogy az új csoporttagság érvényre jusson.

Ezeken túl szükség lesz a cifs-utils csomagra is ahhoz, hogy fel tudjuk csatolni a Samba vagy Windows által megosztott mappákat.
Ha nincs még telepítve, akkor az alábbi paranccsal teheted meg:

# sudo apt install cifs-utils

A már telepített rendszertől függően előfordulhat, hogy további csomagok is telepítésre kerülnek. Miután ez megvan, elkezdhetjük az érdemi munkát.

Előkészületek


A sudoers fájl módosítása


Ahhoz, hogy a mount parancsot "mezei" felhasználóként használni tudjuk, módosítanunk kell a sudo beállításait oly módon, hogy ne kérjen jelszót a parancs kiadásakor. Ez egyfajta biztonsági kockázatot jelent, tudom, de úgy gondolom, hogy csak a mount parancs jelszó nélküli futtatásának engedélyezése saját magunk számára, kisebb kockázatot jelent, mint a jelszavunk egy parancsfájlon belüli olvasható formában való megadása.


# sudo visudo -f /etc/sudoers.d/smbmounters


Samba hozzáférési adatok megadása


Ha még nem létezik, akkor hozz létre a saját mappádban egy .smb mappát, és azon belül pedig egy credentials nevű szöveges állományt.


# cd && mkdir .ssh && touch .smb/credentials

Nagyon fontos, hogy ne felejtsük el a megfelelő jogosultságokat beállítani a mappán és a fájlon, vagyis rajtunk kívül senki más ne férjen hozzá, hisz amint látni fogod, a fájlban olvasható formában kell megadnod a megosztáshoz használt jelszavadat! (Persze-persze, jól beállított rendszerben már eleve nem fér már a saját mappádhoz, de nem árt az óvatosság, hisz előfordulhat olyan még fel nem tárt hiba a rendszerben, amivel akár közvetlenül is el lehet érni bizonyos fájlokat.)
Tehát:

# chmod -vR u=rwx,g-rwx,o-rwx .smb
# chmod -vR u=rw,g-rwx,o-rwx .smb/credentials

Ezután nyisd meg az imént létrehozott fájlt a kedvenc szövegszerkesztődben, és helyezd el benne az alábbi tartalmat (értelemszerűen a "kacsacsőrös" részt a saját adataiddal helyettesítsd – a "kacsacsőrök" nélkül):

username=<SMB_FELHASZNÁLÓNEVED>
password=<SMB_JELSZAVAD>
domain=<SMB_TARTOMÁNY>

Amúgy ez egy "szabványos" fájl, ezt használja pl. a fentebb említett SMBNetFS is.

A parancsfájlok elkészítése


Én a saját mappám alatt egy bin nevű mappában tárolom a saját felhasználásra készült parancsfájlokat, de természetesen te teheted máshova is őket. A lényeg, hogy könnyen elérhető (és futtatható) helyen legyenek.

Két parancsfájlt fogunk készíteni. Az első a bejelentkezéskor fog lefutni, és felcsatolja a megadott megosztásokat, a második pedig a kijelentkezéskor lecsatolja azokat.

Megosztások felcsatolása


A korábban tárgyalt mappában (nálam $HOME/bin) hozz létre egy parancsfájlt, ami esetemben a kde_autostart_mount_smb.sh elég beszédes nevet kapta a keresztségben. Itt persze megint csak választhatsz másik, számodra szimpatikusabb nevet, viszont ne feledd, hogy a későbbiekben én az imént említett néven fogok rá hivatkozni!

A parancsfájl tartalma pedig az alábbi:

#!/bin/bash

SERVER=<SZERVERED_NEVE>
MNT_POINT=$HOME/mnt
OPTIONS=noexec,credentials=$HOME/.smb/credentials,noperm,uid=$USER

if ping -c3 imserver &>/dev/null; then
  sudo mount -o $OPTIONS //$SERVER/<MEGOSZTÁS_1> $MNT_POINT/$SERVER/megosztas_1
  sudo mount -o $OPTIONS //$SERVER/<MEGOSZTÁS_2> $MNT_POINT/$SERVER/megosztas_2
  sudo mount -o $OPTIONS //$SERVER/$USER $MNT_POINT/$SERVER/$USER
  MESSAGE="Hálózati meghajtók felcsatolva."
  echo "SMB mount: $MESSAGE"
  kdialog --title "SMB mount" --passivepopup "$MESSAGE"
else
  MESSAGE="SMB mount: Nem sikerült a hálózati meghajtókat felcsatolni."
  echo $MESSAGE
  kdialog --error $MESSAGE
fi

A <SZERVERED_NEVE> helyére írd be a saját szerver nevét, ahonnan a megosztásokat fel szeretnéd csatolni. Nálam a saját mappámon belül egy mnt mappába kerülnek a csatolási pontok, de természetesen te ezt is teheted máshova, csak ennek megfelelően írd át az elérési utat az MNT_POINT változóban.

A parancsfájl végez egy egyszerű ellenőrzést (ping parancs), és ha nincs hiba, akkor felcsatolja a megosztásokat, majd erről üzenetben tájékoztat is mind konzolon, mind pedig a KDE értesítési területén keresztül.

A megosztások neveit és a csatolási pontokat módosítsd a saját igényed szerint, illetve bővítsd továbbiakkal, ha szükséges. A harmadik csatolás a szerveren lévő saját mappát is felcsatolja – feltételezve, hogy a felhasználónevünk ugyanaz, mint a saját gépünkön (számomra ez logikus megoldás).

Megosztások leválasztása

A felcsatolt megosztások leválasztását egy valamivel egyszerűbb parancsfájl végzi, amelyiket én kde_logout_umount_smb.sh névvel illettem. Így néz ki:

#!/bin/bash

SERVER=<SZERVERED_NEVE>
MNT_POINT=$HOME/mnt

sudo umount $MNT_POINT/$SERVER/megosztas_1
sudo umount $MNT_POINT/$SERVER/megosztas_2
sudo umount $MNT_POINT/$SERVER/$USER

kdialog --title "SMB mount" --passivepopup "Hálózati meghajtók leválasztva."

Ebben a fájlban értelemszerűen ugyanazokat a megosztásokat kell felsorolni, amiket előzőleg a másik parancsfájlban megadtál. Gondoltad volna? 😛😀

Még egy fontos lépés


Linux (Unix) rendszerekben nem a megfelelő fájlkiterjesztés jelzi a rendszer számára, hogy futtatható-e egy állomány; erre külön fájl attribútum van fenntartva. Ahhoz, hogy az elkészült parancsfájlokat használni is tudjuk, futtathatóvá kell tenni azokat az alábbi paranccsal:

# cd && chmod -v u+x,g-x,o-x bin/* 

Ezzel most a bin mappában lévő összes fájlon csak saját magunk számára engedélyeztük a futtatást, de mivel emmen a mappában csak futtatható állományokat tartunk (Nálam legalábbis így van.), egyszerűbb így beírni, mint megadni a fenti két fájlt. Én legalábbis így gondolom. 😛

A parancsfájlok hadrendbe állítása


Az elkészült parancsfájlokat a KDE Rendszerbeállítások alkalmazásán keresztül tudod a legegyszerűbben hadrendbe állítani.Kattints az Indítás és leállítás ikonra. Itt az Automatikus indítás részben tudod felvenni a fájlokat a Parancsfájl hozzáadása... gombbal. Az elsőt indításkor kell futtatni, a másodikat pedig kijelentkezéskor, ezt ne felejtsd el beállítani a Futtatás oszlopban!

Ha ezzel megvagy, gyakorlatilag készen is vagyunk. 😊

Vagyis majdnem, olvasd még el az alábbiakat is!

Összegzés


Tisztában vagyok vele, hogy fent kifejtett megoldás koránt sem tökéletes. Gyorsan kellett kreálnom valami megoldást a problémámra.
Mivel a saját (akkori) igényeim hívták életre ezt a megoldást, így a jelenlegi formában csak egy szerverről csatolhatóak fel megosztások. A hibaellenőrzés is elég szegényes, leválasztás esetében egyáltalában nincs. Új megosztás felvételéhez mindkét scriptet módosítani kell. Jó lenne valamiféle logolás is.
Mindent összevetve nem túl rugalmas és bombabiztos megoldás, ezt el kell ismernem.
Éppen ezért már formálódik a következő verzió (ezt nevezhetjük v0.2-nak, mert volt egy v0.1 is – egy közepes szintű biztonsági kockázattal 😊), ami jórészt az imént említett hiányosságokat és hibákat igyekszik orvosolni, illetve a jelenleginél egy jóval rugalmasabb, szélesebb körben is jól használható megoldást kínál majd a felhasználók számára.
Ha készen leszek vele, azt is közkincsé teszem majd. 😊