Консольное подключение по WebDAV в Windows и Mac OS X

Перед автором встала задача: программно и максимально нативно управлять подключением по WebDAV к удаленному хранилищу на двух операционных системах.
Под программным управлением подразумевается запуск заготовленных скриптов в виде дочерних процессов с передачей авторизационных данных в виде аргументов.

К счастью, все последние версии Windows и Mac OS X поставляются со встроенными консольными утилитами для работы с данным протоколом.

Для полноценной работы необходимо реализовать по три скрипта на каждой ОС: подключение к хранилищу, проверка статуса и отключение.

Ниже представлено найденное решение.

Работа с WebDAV на Windows

Для реализации всех трех модулей воспользуемся командой net use.

Скрипты оформляются в виде batch-файлов.

Подключение

Файл connect.bat :

@echo off

::Передаем в скрипт параметры, в последовательности: 
::имя пользователя
set WEBDAV_USER=%1
::адрес сервера с указанием протокола (чаще всего https)
set WEBDAV_SERVER=%2
::пароль
set WEBDAV_PASSWORD=%3

::Буква для монтирования диска
set DRIVE=X:
::Если такая буква занята, выбираем следующую свободную
if exist %DRIVE% (set DRIVE=*)

net use "%DRIVE%" "%WEBDAV_SERVER%" /User:"%WEBDAV_USER%" "%WEBDAV_PASSWORD%" /persistent:yes /home

::Если подключение произошло без ошибок, выводим состояния всех подключений
::Это позволит программно подхватить вывод и отследить статус процедуры подключения
if not errorlevel 1 (net use)

Проверка статуса

Для проверки статуса необходимо знать хост проверяемого подключения, который передается скрипту в виде аргумента.

Файл status.bat :

@echo off

::Хост (без https)
set WEBDAV_HOST=%1
net use | findstr /R /C:"%WEBDAV_HOST%"

Если подключение активно, то в выводе будет строка, содержащая букву локального диска и удаленный сетевой путь:

             X:        \\webdav.example.com@SSL\DavWWWRoot

Если подключения в данный момент нет — вывод будет пустым.

Важно: передаваемый хост не должен содержать протокол (https).
Так, в случае, если подключение выполнялось к https://webdav.example.com, то для проверки соединения необходимо передавать аргумент вида webdav.example.com.

Отключение

Для разрыва соединения необходимо знать букву сетевого диска, к которому произведено подключение WebDAV хранилища.

Так как буква может быть произвольной, получим ее, применив к выводу скрипта проверки статуса регулярное выражение:

\s+([A-Z]:)\s+\\\\webdav\.example\.com

И передадим полученную букву аргументов в скрипт отключения.

Файл disconnect.bat :

@echo off

::Буква отключаемого диска
set WEBDAV_LETTER=%1
net use %WEBDAV_LETTER% /delete

Работа с WebDAV на Mac

Воспользуемся связкой двух команд: mount_webdav и mount.

Подключение

Для подключения к WebDAV в Mac OS присутствует консольная утилита mount_webdav.

К сожалению, напрямую передать логин и пароль невозможно. Утилита поддерживает два вида авторизации:

  • сохранить домен, логин и пароль в связке ключей (Keychain Access);
  • указать параметр -i, тогда пользователю в терминальном окне будет предложено ввести логин и пароль.

Однако второй вариант можно автоматизировать с помощью скриптового языка Expect, который позволяет имитировать пользовательский ввод с клавиатуры и, к тому же, принимает аргументы.

Файл connect :

#!/usr/bin/expect
set timeout 10

# логин
set user [lindex $argv 0]
# пароль
set pwd [lindex $argv 1]
# адрес сервера
set remote [lindex $argv 2]
# локальная директория (точка монтирования)
set local [lindex $argv 3]

spawn mount_webdav -i $remote $local
# ожидание приглашения ввести логин
expect "Username:"
# ввод логина
send "$user\n"
# ожидание приглашения ввести пароль
expect "Password:"
# ввод пароля
send "$pwd\n"

Важно: локальная директория для монтирования диска должна быть создана до процедуры подключения.

Проверка статуса

Воспользуемся командой mount и выполним простой скрипт, передав адрес сервера в качестве аргумента.

Файл status :

#!/bin/bash
mount | grep "$1"

Как и в случае с Windows, при наличии подключения в выводе будет содержаться строка, описывающая ресурс.

Если подключения нет — вывод будет пустой.

Отключение

Для отключения от WebDAV хранилища на Mac так же достаточно выполнить простой скрипт, аргументом которому будет служить адрес локальной директории (которая раньше была указана как точка монтирования).

Файл disconnect :

#!/bin/bash
umount -v $1

Параметр -v включает подробный вывод, необходимый для отслеживания результата.