first commit
This commit is contained in:
commit
57ff06577b
49
Makefile
Normal file
49
Makefile
Normal 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 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
|
||||||
|
|
72
README.md
Normal file
72
README.md
Normal file
@ -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 <nom_serveur> [options]
|
||||||
|
```
|
||||||
|
|
||||||
|
* La complétion fonctionne sur l’argument `<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 l’installation (mode système ou utilisateur), lance :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make uninstall
|
||||||
|
```
|
||||||
|
|
287
smbmount
Executable file
287
smbmount
Executable 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
36
smbmount.bash
Normal 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
|
Loading…
x
Reference in New Issue
Block a user