Уважаемые форумчане, требуется наладить автомотрирование USB-Flash под Ubuntu Server 10.10. Сервер работает без Иксов. Нашёл в интернетах скрипт, скопипастил. Не работает. Помогите пожалуйста разобраться. Сразу скажу - в bash не очень силён. Код скрипта, в меру своих возможностей, попытался понять. Вроде как должно работать, но...
Вот код:
#!/bin/bash
# Задаем стартовые переменные
lockfile=/tmp/automount.lock
# lock файл необходим когда одновременно монтируется несколько разделов одного устройства
mountpoint="/dev/"$2
# превращаем точку монтирования в правильный вид
# Выбираем действие
# msd - монтирование /dev/sdX устройств - чаще всего USB накопителей
# msr - монтирование cdrom которые обычно обозначаются как /dev/srX\
# u - отмонтирование устройств
case "$1"
in
msd)
# Проверяем наличие lock файла и если он есть спим 2 секунды
while [ -f $lockfile ]
do sleep 2 done
# Создаем lock файл и получаем метку раздела в качестве точки монтирования
touch $lockfile DLABEL=`/sbin/udevadm info --query=all --name=$mountpoint | sed -n s@"S: disk/by-label/"@@p`
# Проверяем что метка у раздела есть, а если нет, то в качестве метки берем имя производителя
if [ -z "$DLABEL" ];
then DLABEL=`/sbin/udevadm info --query=all --name=$mountpoint | grep ID_VENDOR | sed s/"E: ID_VENDOR="//g`
fi
# Проверяем нет ли уже такой точки монтирования, а если есть то пытаемся добавить к имени -1, -2 итд.
if [ `/bin/ls -1 --hide=cdrom --color=none /media | sed s/"\/"//g | grep -cx $DLABEL` -gt 0 ];
then k=1 DLABELN=$DLABEL'-'$k
while [ `/bin/ls -1 --hide=cdrom --color=none /media | sed s/"\/"//g | grep -cx $DLABELN` -gt 0 ]
do k=`expr $k + 1` DLABELN=$DLABEL'-'$k done
DLABEL=$DLABELN fi
# В качестве варианта к метке просто добавляем имя раздела (то есть -sdX)
# if [ -d /media/$DLABEL ]; then
# DLABEL=$DLABEL"-"$2
# fi
# Монтируем и удаляем lock файл
pmount -A $mountpoint $DLABEL 2>/dev/null rm $lockfile
;;
msr)
# предполагаем что в системе только один оптический привод, находим метку диска и монтируем
LABEL=`volname $mountpoint` pmount $mountpoint $DLABEL
;;
u)
# Проверяем количество смонтированых устройств
# /media/cdrom это точка монтирования прописанная в /etc/fstab в моем дистрибутиве
set `/bin/ls -1 --hide=cdrom --color=none /media | wc -l`
case "$1"
in
0)
echo "Нечего отмонтировать!" ;; 1)
DLABEL=`/bin/ls -1 --hide=cdrom --color=none /media` cd /media pumount $DLABEL 2>/dev/null
# Проверяем код возврата pmount. Если больше 0 то операция не удалась
if [ $? -gt 0 ];
then echo "Операция отмонтироования "$DLABEL" не удалась"
fi
;;
*)
echo "Много монтированных устройств. Выбирайте одно."
# Получаем список монтированных устройств и печатаем его с порядковым номером каждой точки монтирования
set `/bin/ls -1 --hide=cdrom --color=none /media` k=1 for i in "$@" do
echo $k " "$i k=`expr $k + 1` done
# Читаем номер
echo -n "Введите номер отмонтируемого устройства:" read x
# Снова получаем список и бежим по нему. Если k=x то делаем как в предыдущем случае (то есть 1)
set `/bin/ls -1 --hide=cdrom --color=none /media` k=1 for i in "$@" do
if [ $x = $k ];
then cd /media
pumount $i 2>/dev/null
if [ $? -ne 0 ];
then echo "Операция отмонтироования "$i" не удалась"
fi
exit 0
fi
k=`expr $k + 1` done
;;
esac
;;
esacА вот ответ консоли:
/usr/bin/automount: line 35: syntax error near unexpected token `;;'
/usr/bin/automount: line 35: `;;'
Скрипт взял здесь http://www.openkazan.info/node/3098. Судя по дате публикации и дате последнего комментария (около полутора лет тому) - ответа от автора вряд ли получил бы, потому решил спросить здесь.
> if [ `/bin/ls -1 --hide=cdrom --color=none /media | sed s/"\/"//g | grep
> -cx $DLABEL` -gt 0 ];
> then k=1 DLABELN=$DLABEL'-'$k
> while [ `/bin/ls -1 --hide=cdrom --color=none /media | sed s/"\/"//g | grep
> -cx $DLABELN` -gt 0 ]
> do k=`expr $k + 1` DLABELN=$DLABEL'-'$k done
> DLABEL=$DLABELN fiИли fi на на новую строку перенести, или писать 'DLABEL=$DLABELN ; fi'
>> if [ `/bin/ls -1 --hide=cdrom --color=none /media | sed s/"\/"//g | grep
>> -cx $DLABEL` -gt 0 ];
>> then k=1 DLABELN=$DLABEL'-'$k
>> while [ `/bin/ls -1 --hide=cdrom --color=none /media | sed s/"\/"//g | grep
>> -cx $DLABELN` -gt 0 ]
>> do k=`expr $k + 1` DLABELN=$DLABEL'-'$k done
>> DLABEL=$DLABELN fi
> Или fi на на новую строку перенести, или писать 'DLABEL=$DLABELN ; fi'Спасибо, сделал так
DLABEL=$DLABELN ; fi
Ничего не изменилось, после этого по-переносил всеdoneна новую строку, скрипт вроде запустился, ошибок небыло, но монтирование так и не заработало. Буду копать дальше.
> Уважаемые форумчане, требуется наладить автомотрирование USB-Flash под Ubuntu Server
> 10.10. Сервер работает без Иксов.udev надеюсь не выкинули?
# Udev rules for udevmountd
# Skip 'add' events for device-mapper
ACTION=="add", SUBSYSTEM=="block", KERNEL=="dm-*", GOTO="skip_mount"
ACTION=="add", SUBSYSTEM=="block", KERNEL=="md*", GOTO="skip_mount"
ACTION=="change", SUBSYSTEM=="block", KERNEL=="dm-*", ENV{DM_TARGET_TYPES}=="crypt", GOTO="skip_mount"
ACTION=="add", SUBSYSTEM=="block", ENV{FSTAB_OPTS}=="*nofail*", IMPORT="udevmountd"
ACTION=="change", SUBSYSTEM=="block", KERNEL=="dm-*", ENV{FSTAB_OPTS}=="*nofail*", IMPORT="udevmountd"
ACTION=="change", SUBSYSTEM=="block", KERNEL=="md*", ENV{FSTAB_OPTS}=="*nofail*", IMPORT="udevmountd"ACTION=="add|change", ENV{FSCK_STATE}=="unknown|clean", RUN+="udevmountd add"
ACTION=="remove", ENV{FSTAB_OPTS}=="*nofail*", RUN+="udevmountd remove"LABEL="skip_mount"
udevmountd должен находиться в /lib/udev/ (иль где там в Убунте)
>[оверквотинг удален]
> esac
>
Попробуйте autofs или pmount
> Попробуйте autofs или pmountНу.. В виду того, что меня "ушли" с работы - топик теряет актуальность. Всем ответившим - огромное спасибо. :)
>> Попробуйте autofs или pmount
> Ну.. В виду того, что меня "ушли" с работы - топик теряет
> актуальность. Всем ответившим - огромное спасибо. :)Жестокие люди, за не сделанный скрипт увольняют. :)
Скоро за memleak и double free расстреливать будут.