Anhang: SMBsession-Gast
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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #! /bin/bash -e
# Nautilus helper script:
# ~/.local/share/nautilus/scripts/'SMBsession Gast'
# ~/.local/share/nautilus/scripts/'Was ist das?'
# Browse SMB networks and shares
# don't require SMBv1/CIFS for access
# SPDX-License-Identifier: GPL-2.0-or-later
# (c) Copyright 2020 kB @ ubuntuusers.de
readonly W0=3 dW=8 Wmax=1000 H0=5 dH=24 Hmax=600
LOG() { echo "${0##*/}: $*" ;} >&2
#gio mount network:/// || true # Hack!
gio info smb:/// >/dev/null || gio mount smb:/// || true # Hack!
sharelist()
for P in SMB2 NT1 CORE
do smbclient -N -U '' -L $1 \
--option="client min protocol = $P" && break || continue
done
Filter()
{ sed '1,/^\t-/ d ; /^[^\t]/,$ d ; s/^\t//' | sed 's/ */\t/g' ;}
shopt -s lastpipe
init_Dialog()
{ W=${#URI} 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=$URI
}
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
}
WS=0 ; for col in Sharename Type Comment
do columns+=" --column=$col " ; (( WS += 8 )) ; done
LIST()
{ tee $F | init_Dialog ; (( W += WS )) ; <$F sed 's/\t/\n/g' |
Dialog --list $columns --print-column=1 --multiple --separator=$'\n'
}
FORMS()
{ init_Dialog ; (( W *= 2 ))
Dialog "$@" --forms --cancel-label=Abbruch --ok-label=Weiter
}
Group=$(testparm -s -v 2>/dev/null | grep workgroup ) ; Group=${Group##* }
UName=${0#$( sed 's/[A-Z0-9a-z]*$//' <<< "$0" )} PWord=
noUN=$USER noPW='{}' # Ersatzwerte wenn Benutzername bzw. Passwort leer
Username()
{ UName=$(FORMS --text="Anmeldung als …" --add-entry=Benutzername) ;}
Password()
{ X='Benutzer ändern'
until PWord=$(FORMS --text="SMB-Passwort von $UName:" \
--add-password=Passwort \
--extra-button="$X" )
do test "$PWord" = "$X" && Username || return 1 ; done
}
retry()
{ init_Dialog ; Dialog --question --text='Fehlschlag!' \
--cancel-label=Abbruch --ok-label=Weiter --timeout=10
}
Mount()
{ Server=${1#*//} ; Server=${Server%/} ; Server=${Server%%.*}
LOG "$URI --> $1 --> $Server"
makeURI() { URI="smb://$Group;${UName:=$noUN}@$Server/$1" ;}
sharelist //$Server | Filter | LIST | readarray
for z in ${MAPFILE[@]}
do N=3 ; makeURI $z
until gio open $URI && LOG $URI eingehängt || (( N-- < 1 ))
do Password && makeURI $z || break
gio mount $URI <<< ${PWord:-$noPW} || retry || break
done || true
done
}
for URI in ${NAUTILUS_SCRIPT_SELECTED_URIS:-$@}
do action= ; Info=$(gio info $URI) || continue
z=$( grep 'standard::target-uri' <<< "$Info" || true ) ; z=${z#*: }
case $URI
in (smb:*) case $( grep 'id::filesystem: ' <<< "$Info" )
in (*smb-server*) action=mount
;; (*smb-net*) action=list
esac
;; (network:*) case $URI
in (*dnssd-domain*) action=mount
;; (*smb-server*) action=mount
;; (*smb-root) action=list
esac
esac
case $action
in (mount) Mount $z
;; (list) gio list $z | INFO
;; (*) INFO <<< "$Info"
esac
done
LOG Das ist das Ende
|
Skript SMBsession für den UU-Artikel Nautilus/Skripte/SMB-Session
Es wird auch in Samba_Client/Windows-Netzwerk verwendet und kann auch als nichttriviales Beispiel für zenity dienen.
Lizenz: GPLv2 or later, (c) Copyright 2020 kB @ UbuntuUsers.de