first commit

This commit is contained in:
lionel 2025-05-15 19:09:48 +02:00
commit 57ff06577b
4 changed files with 444 additions and 0 deletions

49
Makefile Normal file
View File

@ -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 nest 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

72
README.md Normal file
View File

@ -0,0 +1,72 @@
# smbmount
`smbmount` est un script Bash pour monter facilement des partages SMB en bénéficiant dune 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 dinstallation (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`, linstallation 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 linstallation 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 <nom_serveur> [options]
```
* La complétion fonctionne sur largument `<nom_serveur>`, en proposant la liste des serveurs SMB détectés.
* Par exemple, tape `smbmount -A <Tab><Tab>` pour voir les serveurs disponibles.
---
## Désinstallation
Pour supprimer linstallation (mode système ou utilisateur), lance :
```bash
make uninstall
```

287
smbmount Executable file
View File

@ -0,0 +1,287 @@
#!/bin/bash
#if [ "$EUID" -ne 0 ]
#then
# echo "Please run as root"
# exit 1
#fi
usage()
{
cat <<EOF
Help usage :
-s Use SMBTREE discovery
-a Use AVAHI discovery and SMBclient
-i [IP] Use direct IP Address
-u Unmout Mode
EOF
}
smbMode()
{
listServers=$(smbtree -N 2> /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

36
smbmount.bash Normal file
View File

@ -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