-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathusb-automount.sh
146 lines (132 loc) · 5.44 KB
/
usb-automount.sh
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/bin/bash
#
# Mount attached USB devices to /media/usb{1..9}
# Mount attached cdrom devices to /media/cdrom and then /media/cdrom{1..9}
# Unmout attached devices automatically
# Detect changes every 3s
#
USER_UID=$(id -u)
ROOT_UID=0
# Check if run as root
if [ $USER_UID -ne $ROOT_UID ] ; then
echo "* "
echo "* You must be root to do that!"
echo "* "
exit 1
fi
while true; do
sleep 3
# Detect umounted disk partitions
# Loop on each mounted devices
for i in {1..9}; do
# Present on mounted partitions and not in connected partitions
if [ -d /media/usb$i ] && [ -n "$(mount | grep "/media/usb$i")" ] && [ -z "$(lsblk | grep "/media/usb$i")" ]; then
dev_part="$(mount | grep "/media/usb$i" | awk '{print $1}')"
umount /media/usb$i
[ $? -eq 0 ] && echo "* Partition $dev_part unmounted from /media/usb$i"
fi
# Cleaning unused mounted folders
if [ -d /media/usb$i ] && [ -z "$(mount | grep "/media/usb$i")" ] && [ -z "$(lsblk | grep "/media/usb$i")" ]; then
[ $(find /media/usb$i -maxdepth 5 -type f -print | wc -l) -eq 0 ] && rm -Rf /media/usb$i
fi
done
# Detect umounted cdrom partitions
# Not present on mounted partitions and not in connected partitions
if [ -d /media/cdrom ] && [ -z "$(mount | grep "/media/cdrom")" ] && [ -z "$(lsblk | grep "/media/cdrom")" ]; then
dev_part="$(mount | grep "/media/cdrom" | awk '{print $1}')"
umount /media/cdrom > /dev/null 2>&1
[ $? -eq 0 ] && echo "* Device $dev_part unmounted from /media/cdrom"
[ $(find /media/cdrom -maxdepth 5 -type f -print | wc -l) -eq 0 ] && rm -Rf /media/cdrom
fi
# Loop on each mounted devices
for i in {1..9}; do
# Not present on mounted partitions and not in connected partitions
if [ -d /media/cdrom$i ] && [ -z "$(mount | grep "/media/cdrom$i")" ] && [ -z "$(lsblk | grep "/media/cdrom$i")" ]; then
dev_part="$(mount | grep "/media/cdrom$i" | awk '{print $1}')"
umount /media/cdrom$i > /dev/null 2>&1
[ $? -eq 0 ] && echo "* Device $dev_part unmounted from /media/cdrom$i"
[ $(find /media/cdrom$i -maxdepth 5 -type f -print | wc -l) -eq 0 ] && rm -Rf /media/cdrom$i
fi
done
# Loop on each connected disk devices
for disk_name in $(lsblk | grep 'disk' | awk '/^sd[a-z] /{print $1}'); do
#disk=$(lsblk -f | awk '/^sd[a-z] /{print $1}')
#part=$(lsblk -f | grep '^[└├]─sd[a-z][1-9] ')
# Loop on each device partitions
for part in $(lsblk | grep 'part' | grep "$disk_name[1-9] " | sed -r 's/^.{2}//' | awk '{print $1"|"$7}'); do
part_name=$(echo $part | awk -F'|' '{print $1}')
fstype=$(lsblk -o NAME,FSTYPE | grep "$part_name " | sed -r 's/^.{2}//' | awk '{print $2}')
label=$(lsblk -o NAME,LABEL | grep "$part_name " | sed -r 's/^.{2}//' | awk '{print $2}')
mountpoint="$(echo $part | awk -F'|' '{print $2}')"
# No mount point detected
if [ -z "$mountpoint" ]; then
# Mount on /media/usb1 or next available number
for i in {1..9}; do
if [ ! -d /media/usb$i ]; then
mkdir -p /media/usb$i
# Try to mount for fat, exFat or ntfs fs type
uid=1000
mount -t $fstype -o nosuid,noexec,nodev,noatime,umask=0077,uid=$uid,gid=$(id -g $uid),iocharset=utf8 /dev/$part_name /media/usb$i > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "* Partition /dev/$part_name mounted on /media/usb$i"
else
# Try to mount without options for others fs types, like ext2 or ext4
mount -t $fstype -o noatime /dev/$part_name /media/usb$i > /dev/null
if [ $? -eq 0 ]; then
echo "* Partition /dev/$part_name mounted on /media/usb$i"
else
echo "* Error: mount -t $fstype /dev/$part_name /media/usb$i"
#exit 1
fi
fi
break
fi
done
fi
done
done
# Loop on each connected cdrom devices
for disk_name in $(lsblk | grep 'rom' | awk '/^sr[0-9] /{print $1"|"$7}'); do
name="$(echo $disk_name | awk -F'|' '{print $1}')"
fstype="iso9660"
mountpoint="$(echo $disk_name | awk -F'|' '{print $2}')"
# No mount point detected
if [ -z "$mountpoint" ]; then
# Mount on /media/cdrom
if [ ! -d /media/cdrom ]; then
mkdir -p /media/cdrom
res=$(mount -t $fstype -o ro /dev/$name /media/cdrom 2>&1)
ret=$?
# Remove unnecessary output
res=$(echo $res | sed '/mounted on/d')
res=$(echo $res | sed '/no medium found/d')
if [ $ret -eq 0 ]; then
echo "* Device /dev/$name mounted on /media/cdrom"
elif [ -n "$res" ]; then
echo "* Error: mount -t $fstype /dev/$name /media/cdrom => $res"
#exit 1
fi
break
fi
# Mount on /media/cdrom1 or next available number
for i in {1..9}; do
if [ ! -d /media/cdrom$i ]; then
mkdir -p /media/cdrom$i
res=$(mount -t $fstype -o ro /dev/$name /media/cdrom$i 2>&1)
ret=$?
# Remove unnecessary output
res=$(echo $res | sed '/mounted on/d')
res=$(echo $res | sed '/no medium found/d')
if [ $ret -eq 0 ]; then
echo "* Device /dev/$name mounted on /media/cdrom$i"
elif [ -n "$res" ]; then
echo "* Error: mount -t $fstype /dev/$name /media/cdrom => $res"
#exit 1
fi
break
fi
done
fi
done
done
exit 0