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