Samba — это реализация сетевого протокола SMB/CIFS с открытым исходным кодом. Обычно используется в Windows окружениях для совместного доступа к ресурсам, таким как файлы или принтеры. Мне не приходилось иметь дело с этим протоколом никогда, а тут устроился на новую работу, где для хранения данных используются сервера с Samba в количестве двух штук. Как-то так давно сложилось, что лучший файловый менеджер для меня — это любимая консолька, поэтому запускать какой-нибудь nautilus или mc для доступа к общим ресурсам было бы неудобно. Да и монтировать Samba Share в Linux мне нужно далеко не каждый день. В итоге я остановился на двух вариантах:
- Сделать сразу хорошо. Прописать всё нужное по работе в /etc/fstab, монтировать автоматически при запуске или ручками по необходимости.
- Навелосипедить пару скриптиков, которые бы мне позволяли просмотреть список папок на сервере, монтировать/размонтировать когда душе будет угодно.
Очевидно, что я выбрал второе.
Скрипты для подключения папок Samba
На самом деле, скрипты — это звучит слишком громко, скорее скриптики. Небольшие такие. В общем случае я действую так, когда мне нужно добавить очередной сервер с samba (тоже небольшое преувеличение, я вообще это сделал только 2 раза в своей жизни =) ).
Для начала устанавливаю smbclient:
# apt install smbclient
Создаю на диске папку, куда буду монтировать директории с SMB Share Folder и перехожу в неё:
# mkdir -p /mnt/smb/servera
$ cd /mnt/smb/servera
Открываю файлик server.conf, куда записываю ip сервера с samba:
192.168.33.34
или при наличии имени хоста у сервера:
servera
Потом заполняю credentials.conf именем, паролем и доменом своего пользователя Samba, ввереного мне системным администратором:
username=имя_пользователя_samba
password=пароль_пользователя_samba
domain=домен_samba
Осталось создать три скриптика для просмотра доступных папок для монтирования, собственно монтирования и размонтирования.
list.sh
#!/usr/bin/env bash
server=$(head -n 1 server.conf)
smbclient -L $server -A credentials.conf | grep Disk | awk '{print $1}'
mount.sh
#!/usr/bin/env bash
if [ -z "$1" ]
then
echo "You must provide share name."
exit 1
fi
server=$(head -n 1 $PWD/server.conf)
mkdir -p $1
mount -t cifs -o "credentials=$PWD/credentials.conf,sec=ntlm,vers=1.0" //$server/$1 $1
unmount.sh
#!/usr/bin/env bash
if [ -z "$1" ]
then
echo "You must provide share name."
exit 1
fi
umount $1
rmdir $1
И дать им права на исполнение:
$ chmod +x *.sh
В итоге в целевой папочке оказывается такое хозяйство:
$ ls /mnt/smb/servera
credentials.conf list.sh mount.sh unmount.sh server.conf
Использование скриптов bash для подключение к Samba
Заметьте, что в скрипте mount.sh в опциях указан протокол шифрования и его версия, если монтирование не сработает — попробуйте поиграть с этими настройками. Кроме того, можно добавить опции для монтирования с нужными правами для нужного пользователя, изменив строку на:
mount -t cifs -o "credentials=$PWD/credentials.conf,sec=ntlm,vers=1.0,uid=1000,gid=1000,dir_mode=0755,file_mode=0755" //$server/$1 $1
Где 1000 — это id нужного пользователя и группы, соответственно. А 0755 — нужные права.
А так, сама по себе работа в консоле очень простая:
$ cd /mnt/smb/servera
$ echo "Просматриваем список share folder" > /dev/null
$ ./list.sh
folderA
folderB
$ echo "Монтируем Samba Share folderA" > /dev/null
$ ./mount.sh folderA
$ echo "Полезная работа с folderA, к примеру - посмотреть что внутри" > /dev/null
$ ls folderA
fileA fileB
$ echo "Отмонтируем folderA, если она больше не нужна" > /dev/null
$ ./unmount.sh folderA
Ничего не мешает смонтировать несколько папок подряд, а размонтировать только одну или вообще этого не делать.
Заключение
Скрипты и файлы я сохранил в своём репозитории на github, откуда их можно оперативно скачать. На самом деле, я потратил где-то час, чтобы смонтировать в первый раз папку с samba сервера в Linux, а ведь всё дело оказалось в протоколе. Не хочу повторять эти страдания ещё раз в далёком и светлом будущем, потому и запечатлел результат этого опыта.