Firefox & samba

Браузер mozilla-firefox не позволяет работать с протоколом smb напрямую.
Существует множество способов использования ресурсов, расшаренных по самбе, в линуксе. Начиная от ручного монтирования и заканчивая специальными утилитами с поддержкой этого протокола.
В этой статье пойдёт речь о способе доступа к вышеупомянутым ресурсам с помощью веб-клиента mozilla-firefox и обычного файлового менеджера.

Настройка браузера.

первым делом устанавливаем обработчик протокола smb. Это делается для того, чтобы наш браузер узнал к какой программе обращаться при попытке открытия ссылки smb://…

для этого:

1) Открываем страничку настроек параметров браузера. Она находится по адресу about:config

2) Создаём параметр network.protocol-handler.external.smb.
Для этого нужно нажать правой кнопкой мыши на страничке —> Создать —> логическое —>
—> network.protocol-handler.external.smb —> true.

3) Добавляем ещё один параметр.
Создать —> Строка —> network.protocol-handler.app.smb —> полный путь к программе-обработчику.
В качестве обработчика можно выбрать любую программу, понимающую этот протокол (например konqueror)

Установка обычного файлового менеджера в качестве обработчика

При помощи небольшого костыля мне удалось организовать доступ к самба-шарам из обычного файлового менеджера.

Как это работает
При переходе по ссылке smb://… браузер вызывает скрипт-обработчик, передавая ему ссылку как параметр.
Скрипт парсит ссылку и определяет имя сервера, название шары и запрошенный полный путь.
Затем монтирует шару в специальную директорию(Если запрошенная шара уже смонтирована, этот шаг пропускается)
И вызывает файловый менеджер, передавая ему преобразованную ссылку на примонтированный ресурс.

По-умолчанию обычным пользователям не разрешено монтирование.
Разрешаем использование команды mount следующим образом:
Устанавливаем sudo
В файл /etc/sudoers добавляем строку:
<имя пользователя> ALL= NOPASSWD:/bin/umount,/bin/mount
подробнее о синтаксисе — man sudoers

Скрипт-обработчик

$ cat /opt/smbhandler.pl
#!/usr/bin/perl
#use strict;
#use warnings;
my $PATH="/mnt/smb";  #path to mnt root dir
my $APP="/usr/bin/thunar"; #file manager
my $url=$ARGV[0];  #script argument - url

$url=~s|%$@~*!G4;:%#`smb://(.+?)/(.+?)/(.*)$|/$1_$2/$3|;

my $dir="$PATH/$1_$2";  # compose dir name for mount
my $share="//$1/$2";  # compose share name

$url=~s/%([0-9a-fA-F]{2})/pack('C',hex($1))/eg; # make url
$url="$PATH$url";  # full path

if(!-d "$dir"){
# dir doesnot exist yet
mkdir "$dir";  # create it
&mount($share, $dir); # mount share
}else{
# dir already exist
# check mounted or not
my $var=`/bin/mount|/bin/grep "$share"`;
if( "x" eq "x$var"){
# not mounted - do mount
&mount("$share","$dir");
}
}

system $APP, "$url";  # run file manager

sub mount($$){
# mount share function
# args: 1 - $share; 2 - $mnt_dir
system("/usr/bin/sudo", "/bin/mount", "-o rw,guest", "$_[0]", "$_[1]")==0 || die "mount failed: $? $!";
}

Небольшое замечание: Если ссылка имеет вид smb://host/share/, то слэш на конце обязателен.

После небольшой доработки можно научить его работать не только с сылками
вида smb://host/share/blabla но и с \\host\share\blabla
скрипт нормально показал себя и при работе с именами шар, содержащими пробелы и кириллицу.