[[Vorlage(Getestet, focal, bionic )]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Programme_starten: Starten von Programmen] [:Terminal: Ein Terminal öffnen] }}} ## Eine vollständige Befehlsübersicht befindet sich im Wiki unter http://wiki.ubuntuusers.de/Wiki/Syntax [[Inhaltsverzeichnis()]] 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 [[Anhang(SMBusershare)]] {dl} 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 [:Thunar/Benutzerdefinierte_Aktionen: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 = {{{#!code Bash #! /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: ($?)" }}} = Links = * [:Samba Server:] * [:smb.conf:] * [:Nautilus/Skripte:] * [:Thunar/Benutzerdefinierte_Aktionen:] * Skript [[Anhang(SMBusershare)]] {dl} #tag: Netzwerk, Server, GNOME, Xfce, Desktop, Samba