autofs + cifs avagy: halozati mount okosan laptopon

Régóta szenvedtem vele, hogy hogyan lehetne laptopon okosan hálózai mountot csinálni, ami akkor se esik hanyat ha épp nem abban a hálózatban vagyok ahol egy egy halozati share van. Nem tudom miért de korábban elkerültem az autofs-t, pedig az pontosan erre való. Egyetlen hibája, hogy a különböző share-ekhez nem lehet megadni jelszót neki... pontosabban alapbol nem lehet, de szerencsére lehet hozzá scriptet írni. Meg is tettem. Az enyém így működik:

Userként csinálok a home-omba ilyen file-okat:
/home/*/.config/smb/${key}.credentials

ahol a $key a cifs/samba szerver neve (ne kerdezd miert key, az autofs-es eredeti scriptbol vettem a nevet) pl:
/home/traktor/.config/smb/server1.credentials
/home/traktor/.config/smb/server2.credentials
/home/traktor/.config/smb/almafaszerver.credentials

a file-ok pedig szabalyos credentials file-ok, ahogy a mount.cif szereti (lasd man mount.cifs), ezekkel igy megoldhato, hogy akarhany (elore megadott) szerverhez, akarhany kulonfele user/jelszo parossal be lehessen jelenkezni.

Ha ezek megvannak es az autofs fut, akkor egy /smb/almafaszerver/ listazasra a scriptem vegignyalazza a userek home-jat es keresi az almafaszerver.credentials file-t es azzal megprobal csatlakozni a samba szerverhez. Ez egyben egy gyenge pontja is a megoldasomnak, igazan csak egy useres kornyezetben mukodik, hiszen ha valaki masnak is van almafaszerver.credentials file-ja, akkor lehet, hogy azt talalja meg... De tipikusan egy laptop nem ilyen, illetve ezen is lehet segiteni ha kell (pl: ecryptfs), de nekem nem kellett, ugyhogy ezt nem dolgoztam ki. Sajnos az autofs nem adja at a scriptnek, hogy melyik user akarja elerni az adott share-t... pedig ugy minden egyszerubb/szebb lenne.

Hogy mindez mukodjon, a /etc/auto.master kb igy kell kinezzen:


+auto.master

/smb /etc/auto.smb

es vegul a lenyeg, az auto.smb script, amit az eredetibol faragtam at:


#!/bin/bash

key="$1"

for P in /bin /sbin /usr/bin /usr/sbin
do
	if [ -x $P/smbclient ]
	then
		SMBCLIENT=$P/smbclient
		break
	fi
done

[ -x $SMBCLIENT ] || exit 1


### per workgroup:
#WORKGROUP=$($SMBCLIENT -gNL $key 2>&1 | grep "^Domain=" | head -1 | sed -e "s/^[^\[]*\[//g" -e "s/\].*//g")
#CREDENTIALS=$(find /home/*/.config/smb/credentials/${WORKGROUP}/{key}.credentials | head -1)

### simplified:
CREDENTIALS=$(find /home/*/.config/smb/${key}.credentials 2> /dev/null | head -1)

opts="-fstype=cifs"
if [ "$CREDENTIALS" ]
  then
    opts="$opts,credentials=$CREDENTIALS"
    LOCAL_USER=$(dirname $CREDENTIALS | sed "s,^/home/\([^/]*\)/.*$,\1,g")
  else
    opts="$opts,guest"
    CREDENTIALS_DIR=""
    CREDENTIALS_DIR=$(find /home/*/.config/smb/ -maxdepth 0 2> /dev/null | head -1)
    if [ -z "$CREDENTIALS_DIR" ]; then 
      # no any credentials file or directory
      exit 1
    fi
    LOCAL_USER=$(dirname $CREDENTIALS_DIR | sed "s,^/home/\([^/]*\)/.*$,\1,g")
fi
opts="$opts,uid=$LOCAL_USER,gid=$LOCAL_USER"

$SMBCLIENT -gNL $key 2>/dev/null| awk -v key="$key" -v opts="$opts" -F'|' -- '
	BEGIN	{ ORS=""; first=1 }
	/Disk/	{
		  if (first)
			print opts; first=0
		  dir = $2
		  loc = $2
		  # Enclose mount dir and location in quotes
		  # Double quote "$" in location as it is special
		  gsub(/\$$/, "\\$", loc);
		  gsub(/\&/,"\\\\&",loc)
		  print " \\\n\t \"/" dir "\"", "\"://" key "/" loc "\""
		}
	END 	{ if (!first) print "\n"; else exit 1 }
	'

Hozzászólások

Azért key, mert az automounternél ez a konvenció :-)

Azert a sambat en nem eroltetnem ;-)