Nautilus/Skripte/SMBusershare

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. ⚓︎ Installation von Programmen

  2. ⚓︎ Starten von Programmen

  3. ⚓︎ Ein Terminal öffnen

Inhaltsverzeichnis
  1. Voraussetzungen
  2. Installation
  3. Verwendung
  4. Technische Hinweise
  5. Quellcode des Skripts
  6. Links

Hier wird ein Skript zur Ertüchtigung der Dateimanager Nautilus und Thunar beschrieben. Mit Hilfe dieses Skripts kann ein normaler Benutzer ohne root-Rechte durch Bedienung auf der graphischen Oberfläche Ordner im Netzwerk über Samba freigeben.

Für Nautilus ist dieses Skript eine Alternative zum Paket nautilus-share, welches standardmäßig installiert wird.

Bei der Verwendung von Thunar vereinfacht dieses Skript die im Artikel net usershare bzw. Samba Server GNOME beschriebene Methode.

Voraussetzungen

Das Skript verwendet net usershare zur Erstellung der Freigaben, daher muss vorher der Samba-Server installiert werden.

Die Dialoge werden mit Zenity realisiert, welches ebenfalls installiert sein muss.

Installation

Das Skript SMBusershare ⮷ herunterladen, im Nautilus-Skript-Ordner ~/.local/share/nautilus/scripts ablegen und als Programm ausführbar machen[3]. Man kann auch einen anderen Ort für die Programmdatei wählen und im Nautilus-Skript-Ordner einen Link zu dieser Datei setzen. Der Dateiname ist frei wählbar, sollte aber „Ordner freigeben“ oder ähnlich sprechend lauten, da dies auch als Menüpunkt im Dateimanager verwendet wird.

Bei Thunar muss zusätzlich die Programmdatei noch als benutzerdefinierte Aktion eingetragen werden:

'Ordner freigeben' %F 

Hierbei muss entweder die ausführbare Datei Ordner freigeben im Suchpfad PATH auffindbar sein oder man muss in Thunar den kompletten Pfad zur Datei mit angeben.

Zusätzlich muss in Thunar auch noch diese benutzerdefinierte Aktion für Ordner aktiviert werden.

Verwendung

Man wählt in einem Fenster des Dateimanagers einen oder mehrere Ordner aus, für die man die Freigabe bearbeiten möchte und startet das Skript.

Für jeden Ordner wird zuerst geprüft, ob er bereits freigegeben wurde – in diesem Fall wird die Freigabe widerrufen, aber der Freigabename gemerkt.

Im ersten Dialog kann man für den Ordner einen Freigabenamen und eine Beschreibung der Freigabe eingeben. Wenn man den Freigabenamen frei lässt, dann wird der alte Freigabename (sofern er existiert) wieder verwendet. Wenn man diesen Dialog abbricht, dann wird dieser Ordner nicht freigegeben und falls er vorher freigegeben war, dann ist dies jetzt widerrufen.

Die Beschreibung ist optional eingebbar. Wenn man nichts eingibt, dann wird als Beschreibung der Freigabename wiederholt. Auf jeden Fall wird an die Beschreibung noch „ von $USER“ angehängt, damit man in der Freigabeliste die benutzerspezifischen Freigaben erkennen kann.

In weiteren Dialogen legt man fest, ob andere Benutzer als der Eigentümer des Ordners auch in den Ordner schreiben dürfen und ob Gäste (im Sinne des SMB-Protokolls) überhaupt zugreifen können.

Der Status eines Ordners als Freigabe wird von Nautilus mit einem zusätzlichen Symbol beim Ordner angezeigt, jedoch erst nachdem man alle Nautilus-Fenster geschlossen und den Desktop neu gestartet hat.

Technische Hinweise

Nautilus und Thunar verwenden unterschiedliche Konventionen für die Parameterübergabe. Das Skript ließt daher die zu bearbeitenden Ordner aus der von Nautilus verwendeten Umgebungsvariablen und setzt – sofern es hier Daten findet – diese sich selbst als Aufrufparameter. Thunar hingegen setzt die zu bearbeitenden Ordner schon als Aufrufparameter.

Des Skript legt in dem dafür durch Konfiguration in der Datei smb.conf vorgesehenen Verzeichnis (normalerweise /var/lib/samba/usershare) für jede benutzerspezifische Freigabe eine Konfigurationsdatei an. Der Benutzer muss daher in dieses Verzeichnis schreiben dürfen. Normalerweise wird dies durch Mitgliedschaft in der Benutzergruppe sambashare gewährt.

Das Skript sorgt auch dafür, dass für über das Netzwerk sich anmeldende Benutzer für den Zugriff auf das freigegebene Verzeichnis die erforderlichen Rechte gewährt werden. Hierzu werden im freigegebenen Verzeichnis die Berechtigungen für den Besitzer und die Gruppe nicht verändert, aber für die anderen Benutzer in Abhängigkeit von den Eingaben entweder die Rechte r-x oder rwxt zusätzlich gesetzt. Das Sticky-Bit sorgt dafür, dass von anderen Benutzer angelegte Dateien dann auch dem jeweiligen anderen Benutzer gehören. Das funktioniert aber nur für Benutzer, welche sich auch mit gültigem SMB-Passwort anmelden; alle Gäste benutzen dagegen denselben Benutzernamen, in der Regel nobody.

Außerdem wird für jedes Verzeichnis im Pfad zum freigegebenen Verzeichnis für andere Benutzer die Berechtigung --x hinzugefügt, da dies technisch für den Zugriff erforderlich ist.

Diese Änderungen an den Berechtigungen werden vom Skript bei der Freigabe eines Ordners ohne Rückfrage vorgenommen. (nautilus-share macht es anders.)

Beim Widerruf einer Freigabe werden die Berechtigungen dagegen nicht verändert, weil zu diesem Zeitpunkt nicht mehr bekannt ist, ob die für die Freigabe erforderlichen Berechtigungen durch dieses Skript erteilt wurden oder schon vorher bestanden.

In der Zeile

readonly W0=3 dW=8 Wmax=1000 H0=5 dH=24 Hmax=600 

werden Konstanten definiert, mit denen die Größe der angezeigten Fenster an den Fensterinhalt angepasst wird. Im Normalfall sollte somit eine manuelle Anpassung der Fenster nicht erforderlich sein. Wenn das auf dem eigenen Rechner unbefriedigend funktioniert, kann man in dieser Zeile Anpassungen versuchen. W0 mit H0 beschreiben die Mindestgröße des Fensters in Zeichen, dW mit dH die Pixel für ein Zeichen und Wmax mit Hmax die gewünschte maximale Fenstergröße. zenity behandelt die ihm übergebene Fenstergröße aber als unverbindlich.

Quellcode des Skripts

 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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#! /bin/bash -e

# Nautilus extension script:
#	~/.local/share/nautilus/scripts/SMBusershare

# Thunar extension:
#	SMBusershare "%F"

# Ordner durch Benutzer im Netzwerk freigeben
# Let user share folders on network

# Version: 2020-07-13
# SPDX-License-Identifier: GPL-2.0-or-later
# © Copyright 2020 kB @ ubuntuusers.de

readonly W0=3 dW=8 Wmax=1000 H0=5 dH=24 Hmax=600
readonly TITLE='Ordner freigeben'
#readonly TITLE='Share Folders'

shopt -s lastpipe
init_Dialog()
{ W=${#TITLE} H=0
  while read x ; do (( H++ , ${#x} < W )) || W=${#x} ; done
}
Dialog()
{ (( H += H0 , H *= dH , H < Hmax )) || H=$Hmax
  (( W += W0 , W *= dW , W < Wmax )) || W=$Wmax
  zenity "$@" --width=$W --height=$H --title="$TITLE" 2>/dev/null
}

F=$(mktemp) && trap "rm -f $F" EXIT ERR
_INFO()
{ { echo "$*" ; cat - ;} | tee $F | init_Dialog
  Dialog --info --text="$(cat $F)" --timeout=60 || true # wg. timeout
}
INFO()	{ echo | _INFO "$*" ;}

FORM()
{ for X ; do echo $X; done | init_Dialog
  Dialog --forms --cancel-label=Abbruch --ok-label=Weiter "$@"
}
ASK()	{ echo "$*?" | init_Dialog; Dialog --question --text="$*?" ;}

LOG()	{ logger -- "${0##*/}: $*" ;}

getSharename()
until	FORM	--text="$PWD"					\
		--add-entry="Freigabename [$oldSharename]:"	\
		--add-entry='Beschreibung:'			|
	  read REPLY						|| return 1
	Comment=${REPLY#*|} ; Sharename=${REPLY%%|*}
	test -n "${Sharename:=$oldSharename}"
   do	INFO 'Freigabename erforderlich!' ; done

# Für Kompatibilität mit Thunar:
# Dateinamen aus Variable übernehmen und als Aufrufparameter setzen.
readarray -t <<< "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
test -z "$( IFS= ; echo ${MAPFILE[*]} )" || set -- "${MAPFILE[@]}"

for Folder
do test -d "$Folder" && cd "$Folder" || continue

  net usershare info --long					|
    awk -v RS="\n\n" -v FS="\n" "/${PWD##*/}/ {print \$1}"	|
      read oldSharename						|| true
  oldSharename=${oldSharename#[} ; oldSharename=${oldSharename%]}
  test -z "$oldSharename" || net usershare delete "$oldSharename"

  getSharename || continue

  if	ASK Fremde dürfen schreiben
	then chmod -R o+rwXt "$PWD" ; ACL='Everyone:F'
	else chmod -R o+rX   "$PWD" ; ACL="Everyone:R,$USER:F"
  fi
  (	until cd .. ; test "$PWD" = /
	   do test -w "$PWD" && chmod o+x "$PWD" || true ; done
  )

  ASK Gäste dürfen zugreifen && guest_ok=y || guest_ok=n

  net usershare add --long "${Sharename}" "$PWD"		\
    "${Comment:-$Sharename} von $USER" $ACL guest_ok=$guest_ok	| _INFO
done
LOG "Das ist das Ende: ($?)"