Samba — это реализация сетевого протокола SMB/CIFS с открытым исходным кодом. Обычно используется в Windows окружениях для совместного доступа к ресурсам, таким как файлы или принтеры. Мне не приходилось иметь дело с этим протоколом никогда, а тут устроился на новую работу, где для хранения данных используются сервера с Samba в количестве двух штук. Как-то так давно сложилось, что лучший файловый менеджер для меня — это любимая консолька, поэтому запускать какой-нибудь nautilus или mc для доступа к общим ресурсам было бы неудобно. Да и монтировать Samba Share в Linux мне нужно далеко не каждый день. В итоге я остановился на двух вариантах:

  1. Сделать сразу хорошо. Прописать всё нужное по работе в /etc/fstab, монтировать автоматически при запуске или ручками по необходимости.
  2. Навелосипедить пару скриптиков, которые бы мне позволяли просмотреть список папок на сервере, монтировать/размонтировать когда душе будет угодно.

Очевидно, что я выбрал второе.

Скрипты для подключения папок 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, а ведь всё дело оказалось в протоколе. Не хочу повторять эти страдания ещё раз в далёком и светлом будущем, потому и запечатлел результат этого опыта.

Навигация по записям