commit 31c87c76834b5708ecedfa73603d53a59954e684 Author: lionel <.> Date: Thu May 15 19:09:48 2025 +0200 first commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6e92f55 --- /dev/null +++ b/Makefile @@ -0,0 +1,49 @@ +# Makefile hybride avec support de PREFIX et fallback utilisateur + +SCRIPT = smbmount +COMPLETION = smbmount.bash + +PREFIX ?= /usr/local +BINDIR = $(PREFIX)/bin +COMPDIR = /etc/bash_completion.d # Bash completion n’est pas sous PREFIX + +# Répertoires utilisateur +USR_BINDIR = $(HOME)/.local/bin +USR_COMPDIR = $(HOME)/.bash_completion.d + +.PHONY: all install install-sys install-user uninstall + +all: + @echo "Utilisez 'make install' pour installer $(SCRIPT) avec fallback utilisateur si nécessaire." + +install: + @echo "Tentative d'installation dans $(BINDIR)..." + @if [ -w "$(BINDIR)" ] && [ -w "$(COMPDIR)" ]; then \ + $(MAKE) install-sys BINDIR=$(BINDIR) COMPDIR=$(COMPDIR); \ + else \ + echo "Pas d'accès en écriture à $(BINDIR) ou $(COMPDIR), installation utilisateur..."; \ + $(MAKE) install-user; \ + fi + +install-sys: + @echo "Installation dans $(BINDIR) et $(COMPDIR)..." + install -d $(BINDIR) $(COMPDIR) + install -m 0755 $(SCRIPT) $(BINDIR)/$(SCRIPT) + install -m 0644 $(COMPLETION) $(COMPDIR)/$(SCRIPT) + +install-user: + @echo "Installation utilisateur dans $(USR_BINDIR) et $(USR_COMPDIR)..." + install -d $(USR_BINDIR) $(USR_COMPDIR) + install -m 0755 $(SCRIPT) $(USR_BINDIR)/$(SCRIPT) + install -m 0644 $(COMPLETION) $(USR_COMPDIR)/$(SCRIPT) + @echo "Ajoutez à votre ~/.bashrc si nécessaire :" + @echo ' export PATH="$$HOME/.local/bin:$$PATH"' + @echo ' [ -f "$$HOME/.bash_completion.d/$(SCRIPT)" ] && source "$$HOME/.bash_completion.d/$(SCRIPT)"' + +uninstall: + @echo "Suppression de $(SCRIPT) côté système et utilisateur..." + rm -f $(BINDIR)/$(SCRIPT) 2>/dev/null || true + rm -f $(COMPDIR)/$(SCRIPT) 2>/dev/null || true + rm -f $(USR_BINDIR)/$(SCRIPT) 2>/dev/null || true + rm -f $(USR_COMPDIR)/$(SCRIPT) 2>/dev/null || true + diff --git a/README.md b/README.md new file mode 100644 index 0000000..1e96ac9 --- /dev/null +++ b/README.md @@ -0,0 +1,72 @@ +# smbmount + +`smbmount` est un script Bash pour monter facilement des partages SMB en bénéficiant d’une complétion dynamique basée sur la découverte réseau via Avahi. + +--- + +## Fonctionnalités + +* **Montage SMB simplifié** : script Bash qui facilite le montage de partages SMB. +* **Complétion dynamique** : suggestions automatiques des serveurs SMB disponibles sur le réseau grâce à Avahi. +* Installation flexible : + + * Au niveau système (avec droits administrateur). + * En mode utilisateur (sans droits, dans `~/.local`). + +--- + +## Prérequis + +* Linux avec `bash` +* `avahi-browse` installé (généralement dans le paquet `avahi-utils`) +* Accès aux dossiers d’installation (voir ci-dessous) + +--- + +## Installation + +Utilise le `Makefile` pour installer automatiquement : + +```bash +make install +``` + +* Si tu as les droits d’écriture dans `/usr/local/bin` et `/etc/bash_completion.d`, l’installation se fera au niveau système. +* Sinon, le script sera installé dans `~/.local/bin` et la complétion dans `~/.bash_completion.d`. + +### Configuration complémentaire (mode utilisateur) + +Si l’installation est en mode utilisateur, ajoute ces lignes à ton fichier `~/.bashrc` pour que le script et la complétion soient bien pris en compte : + +```bash +export PATH="$HOME/.local/bin:$PATH" +[ -f "$HOME/.bash_completion.d/smbmount" ] && source "$HOME/.bash_completion.d/smbmount" +``` + +Puis recharge ton shell : + +```bash +source ~/.bashrc +``` + +--- + +## Utilisation + +```bash +smbmount -A [options] +``` + +* La complétion fonctionne sur l’argument ``, en proposant la liste des serveurs SMB détectés. +* Par exemple, tape `smbmount -A ` pour voir les serveurs disponibles. + +--- + +## Désinstallation + +Pour supprimer l’installation (mode système ou utilisateur), lance : + +```bash +make uninstall +``` + diff --git a/smbmount b/smbmount new file mode 100755 index 0000000..d91b29c --- /dev/null +++ b/smbmount @@ -0,0 +1,287 @@ +#!/bin/bash + +#if [ "$EUID" -ne 0 ] +#then +# echo "Please run as root" +# exit 1 +#fi + +usage() +{ + cat < /dev/null | grep '\\\\' | sed -e 's/\t\t\\\\\(.*\)/\1/' -e 's/\\\(.*\)//' -e 's/^\s*//' -e '/^$/d' | uniq) + + if [ -z "$listServers" ]; then + echo "No server found" + exit 0 + fi + + echo "List of Server : " + while IFS= read -r line; do + ((i=i+1)) + echo " $i $line" + done <<< "$listServers" + + read -p "Your Choose : " choix + + server=$(sed -n ${choix}p <<< "$listServers") + + mountDir=${server} + + mapfile -t partage < <(smbtree -N 2> /dev/null | grep '\\\\'"$server"'\\' | grep -v 'IPC\$' | sed -e 's/\t\t\\\\'"$server"'\\\(.*\)/\1/' -e 's/\t\(.*\)//' -e 's/ //g') +} + +_avahiMode() +{ + + browse=$(avahi-browse -tpr _smb._tcp) + while IFS= read -r line; do + if [[ $(cut -d';' -f1 <<< "$line") = "=" ]]; then + listServers="${listServers}$(cut -d';' -f7 <<< "$line")"$'\n' + fi + done <<< "$browse" + + if [ -z "$listServers" ]; then + echo "No server found" + exit 0 + fi + + # Delete empty line, space and duplicate line + listServers=$(sed -e 's/\t\(.*\)//' -e 's/ //g' <<< "$listServers" | uniq) + + listServers=$(sort <<<"$listServers") + +} + +_chooseAvahi() +{ + i=1 + echo "List of Server : " + while IFS= read -r line; do + echo " $i $line" + ((i=i+1)) + done <<< "$listServers" + + read -p "Your Choose : " choix + + server=$(sed -n ${choix}p <<< "$listServers") + + mountDir=$(sed 's/.LOCAL//g' <<<"${server^^}") + + server="${server}" + + echo "$server" + + mapfile -t partage < <(smbclient -L $server -U " "%" " 2> /dev/null | grep "Disk" | sed -e 's/ //g' -e 's/\t\(.*\)Disk.*/\1/') + +} + +_findAvahi() +{ + + while IFS= read -r line; do + if [ "$name" == "$line" ] + then + find="yes" + break + fi + done <<< "$listServers" + + if [ "$find" != "yes" ] + then + echo "Server not found" + exit 1 + fi + + server="$name" + + mountDir=$(sed 's/.LOCAL//g' <<<"${server^^}") + + server="${server}" + + echo "$server" + + mapfile -t partage < <(smbclient -L $server -U " "%" " 2> /dev/null | grep "Disk" | sed -e 's/ //g' -e 's/\t\(.*\)Disk.*/\1/') + +} + +ipMode() +{ + + server=$ip + + echo "$server" + + lastOctet=$(rev <<< "$ip" | cut -d'.' -f 1 | rev) + + mountDir=$(avahi-resolve -4a $server | sed "s/$server\\t\(.*\).local/\1/; {q100}") + + if [ $? -ne 100 ] || [ -z "$mountDir" ]; then + mountDir=${lastOctet} + fi + + mountDir=${mountDir^^} + + echo "$mountDir" + + smbclient -L $server -U " "%" " 1> /dev/null 2>&1 + + if [ $? -ne 0 ]; then + echo "No found Server with IP : $ip" + exit 1 + fi + + mapfile -t partage < <(smbclient -L $server -U " "%" " 2> /dev/null | grep "Disk" | sed -e 's/ //g' -e 's/\t\(.*\)Disk/\1/') + + + +} + +_mount() +{ + + if [ ! -d /media/$mountDir ] + then + + mkdir /media/$mountDir + fi + + toMount=() + + for i in ${!partage[@]} + do + + if [ ! -d /media/$mountDir/${partage[$i]} ] + then + toMount=( "${partage[$i]}" "${toMount[@]}" ) + else + echo "${partage[$i]} Alredy mount" + fi + done + + if [ ${#toMount[@]} -ne 0 ]; then + + _secret-tool + + for partage in "${toMount[@]}" + do + echo "mount $partage" + mkdir /media/$mountDir/$partage + #version: /usr/bin/mount -t cifs //$server/$partage /media/$mountDir/$partage -o uid=$(id -ru),gid=$(id -rg),file_mode=0664,dir_mode=0775,vers=2.0,user=$user,pass=$password + #no show: /usr/bin/mount -t cifs //$server/$partage /media/$mountDir/$partage -o uid=$(id -ru),gid=$(id -rg),file_mode=0664,dir_mode=0775,user=$user,pass=$password + /usr/bin/mount -t cifs //$server/$partage /media/$mountDir/$partage -o uid=$(id -ru),gid=$(id -rg),file_mode=0664,dir_mode=0775,user=$user,pass=$password,x-gvfs-show + + done + + password="" + + fi + + + +} + +unmountMode() +{ + + listDir=$(find /media -mindepth 1 -maxdepth 1 -type d -printf "%f\n") + + echo "List of dir in /media : " + while IFS= read -r line; do + ((i=i+1)) + echo " $i $line" + done <<< "$listDir" + + read -p "Unmount Dir : " choix + + mountDir=$(sed -n ${choix}p <<< "$listDir") + + echo "$mountDir" + + read -p "You sure ? " -n 1 -r + echo + if [[ $REPLY =~ ^[YyOo]$ ]] + then + mapfile -t partage < <(find /media/$mountDir -mindepth 1 -maxdepth 1 -type d -printf "%f\n") + for i in ${!partage[@]} + do + if mountpoint -q /media/$mountDir/${partage[$i]} ;then + umount /media/$mountDir/${partage[$i]} + echo "umount ${partage[$i]}" + fi + if [ -d /media/$mountDir/${partage[$i]} ];then + rmdir /media/$mountDir/${partage[$i]} + fi + done + rmdir /media/$mountDir + else + echo "Cancel" + fi + + +} + +_secret-tool() +{ + user=lionel +# secret-tool clear api smbmount server $server user $user + password=$(secret-tool lookup api smbmount server $server user $user) + if [ -z "$password" ];then + echo -e "Password for $user@//$server: \c" + read -s password + echo "" + secret-tool store --label=$user@$server api smbmount server $server user $user <<< $password + fi + +} + +if [ -z "$1" ] +then + usage + exit 1 +fi + +while getopts "saA:ui:" OPTION; do + case $OPTION in + s) + smbMode + _mount + ;; + a) + _avahiMode + _chooseAvahi + _mount + ;; + A) + _avahiMode + name=${OPTARG} + _findAvahi + _mount + ;; + u) + unmountMode + ;; + i) + ip=${OPTARG} + ipMode + _mount + ;; + *) + usage + exit 1 + ;; + esac +done + + diff --git a/smbmount.bash b/smbmount.bash new file mode 100644 index 0000000..c59b956 --- /dev/null +++ b/smbmount.bash @@ -0,0 +1,36 @@ +#/usr/bin/env bash +#complete -W "now tomorrow never" ./dothis.sh +#complete -A directory ./dothis.sh + +_smbmount() +{ + listServers="" + + browse=$(avahi-browse -tpr _smb._tcp) + while IFS= read -r line; do + if [[ $(cut -d';' -f1 <<< "$line") = "=" ]]; then + listServers="${listServers}$(cut -d';' -f7 <<< "$line")"$'\n' + fi + done <<< "$browse" + + # Delete empty line, space and duplicate line + listServers=$(sed -e 's/\t\(.*\)//' -e 's/ //g' <<< "$listServers" | uniq) + + listServers=$(sort <<<"$listServers") + + OPTIONS="-s -a -A -u -i" + + # Si on est en train d'écrire le 2ème mot (1er argument) + if [ "$prev" == "-A" ]; then + + COMPREPLY=( $(compgen -W "$listServers" -- "$cur" ) ) +# else +# +# +# COMPREPLY=( $(compgen -W '$OPTIONS' -- "$cur" ) ) + fi + + +} + +complete -F _smbmount smbmount