Монтирование удаленной директории с помощью sshfs. Часть 1 из 2
SSHFS (Secure Shell FileSystem) — это клиент, который позволяет монтировать удаленную файловую систему и работать с файлами этой системы на локальной машине с использованием протокола SFTP. SFTP (SSH File Transfer Protocol) — это безопасный протокол передачи файлов, который обеспечивает доступ, передачу и управление файлами через протокол Secure Shell. SSHFS поставляется со встроенным модулем ядра FUSE (файловая система в пространстве пользователей), который позволяет любым непривилегированным пользователям создавать свою файловую систему без изменения кода ядра.
Итак, у нас есть веб-сервер 123.123.123.123 , все файлы сайтов расположены в директории /var/www/ . На сервере установлен пакет openssh-server и есть пользователь evgeniy . На клиенте тоже есть пользователь evgeniy и мы хотим смонтировать удаленную директорию /var/www/ .
Прежде всего проверьте, что в файле конфигурации OpenSSH-сервера есть строка, которая начинается на «Subsystem sftp», подробнее здесь.
#Subsystem sftp /usr/lib/ssh/sftp-server Subsystem sftp internal-sftp
Монтирование
Сначала установим пакет sshfs :
Создадим каталог для монтирования удаленной файловой системы:
Смонтируем в этот каталог директорию /var/www веб-сервера:
$ sshfs evgeniy@123.123.123.123:/var/www/ /home/evgeniy/var-www/ evgeniy@123.123.123.123's password: пароль
Теперь посмотрим содержимое каталога /home/evgeniy/var-www/host1.loc :
Когда на клиенте мы выполняем команду sshfs , для сервера это означает, что к нему подключился по ssh пользователь evgeniy . И этот пользователь может делать на сервере те операции, на которые у него есть права — в том числе, и работать с файлами.
Права доступа
При работе с файлами сервера в директории /var/www/ , будут учитываться права удаленного пользователя evgeniy . Если у этого пользователя нет прав на чтение-запись файлов в директории /var/www/ , то и на локальной машине их нельзя просматривать и сохранять. Давайте подключимся по ssh к серверу 123.123.123.123 и посмотрим права на файлы в директории /var/www/host1.loc/ :
$ ls -l /var/www/host1.loc/ итого 220 -rw-r--r-- 1 developer www-data 405 мая 31 09:41 index.php -rw-r--r-- 1 developer www-data 19915 мая 31 09:41 license.txt -rw-r--r-- 1 developer www-data 10552 мая 31 09:41 readme.html -rw-r--r-- 1 developer www-data 6912 мая 31 09:41 wp-activate.php drwxr-xr-x 9 developer www-data 4096 мая 31 09:41 wp-admin -rw-r--r-- 1 developer www-data 351 мая 31 09:41 wp-blog-header.php -rw-r--r-- 1 developer www-data 2275 мая 31 09:41 wp-comments-post.php -rw-r--r-- 1 developer www-data 2732 мая 31 09:41 wp-config.php -rw-r--r-- 1 developer www-data 4220 мая 31 09:41 wp-config-sample.php drwxr-xr-x 6 developer www-data 4096 мая 31 09:42 wp-content -rw-r--r-- 1 developer www-data 3940 мая 31 09:41 wp-cron.php drwxr-xr-x 21 developer www-data 12288 мая 31 09:41 wp-includes -rw-r--r-- 1 developer www-data 2496 мая 31 09:41 wp-links-opml.php -rw-r--r-- 1 developer www-data 3300 мая 31 09:41 wp-load.php -rw-r--r-- 1 developer www-data 47874 мая 31 09:41 wp-login.php -rw-r--r-- 1 developer www-data 8509 мая 31 09:41 wp-mail.php -rw-r--r-- 1 developer www-data 19396 мая 31 09:41 wp-settings.php -rw-r--r-- 1 developer www-data 31111 мая 31 09:41 wp-signup.php -rw-r--r-- 1 developer www-data 4755 мая 31 09:41 wp-trackback.php -rw-r--r-- 1 developer www-data 3133 мая 31 09:41 xmlrpc.php
Только пользователь developer имеет право на запись файлов, все остальные могут только читать. Поэтому, если мы на клиенте попробуем записать что-то в файл index.php , то получим отказ:
Так что давайте размонтируем удаленную файловую систему и смонтируем еще раз:
$ fusermount -u /home/evgeniy/var-www/ # размонтируем удаленную файловую систему $ sshfs developer@123.123.123.123:/var/www/ /home/evgeniy/var-www/ # монтируем снова
Теперь мы можем как создавать новые директории и файлы, так и изменять существующие. Создадим на клиенте директорию /home/evgeniy/var-www/host1.loc/temp/ , а внутри этой директории — файл test.txt . И посмотрим на веб-сервере права на эту директорию и на этот файл:
Теперь все правильно — на клиенте мы работаем с файлами сервера под локальным пользователем evgeniy , а все изменения на сервере сохраняются от имени удаленного пользователя developer . Что за пользователь developer и зачем он нужен, можно прочитать здесь.
Два скрипта
Чтобы облегчить себе жизнь, создадим два маленьких bash-скрипта, которые позволят быстро смонтировать и размонтировать удаленную файловую систему:
$ nano /home/evgeniy/mount-sshfs.sh
#!/bin/bash # монтируем удаленную файловую систему echo 'qwerty' | sshfs -o password_stdin developer@123.123.123.123:/var/www/ /home/evgeniy/var-www/
$ chmod +x /home/evgeniy/mount-sshfs.sh
$ nano /home/evgeniy/umount-sshfs.sh
#!/bin/bash # размонтируем удаленную файловую систему fusermount -u /home/evgeniy/var-www/
$ chmod +x /home/evgeniy/umount-sshfs.sh
Мы используем опцию password_stdin , которая позволяет получить пароль пользователя developer из входного потока. Кроме того, вместе с опцией password_stdin мы могли бы использовать утилиту sshpass — но ее нужно предварительно установить:
$ sudo apt install sshpass $ sshpass -p 'qwerty' sshfs -o password_stdin developer@123.123.123.123:/var/www/ /home/evgeniy/var-www/
Полезные опции
Опция reconnect позволяет автоматически восстанавливать соединие в случае разрыва:
$ sshfs -o reconnect developer@123.123.123.123:/var/www/ /home/evgeniy/var-www/
Опция password_stdin позволяет получать пароль пользователя из входного потока stdin :
$ echo 'qwerty' | sshfs -o password_stdin developer@123.123.123.123:/var/www/ /home/evgeniy/var-www/
Опция delay_connect — не монтировать удаленную директорию немедленно, а ждать момента первого обращения к файлам:
$ sshfs -o delay_connect developer@123.123.123.123:/var/www/ /home/evgeniy/var-www/
Опция idmap
Опция idmap по умолчанию имеет значение none . Если установить эту опцию в значение user , то sshfs будет транслировать идентификаторы локального и удаленного пользователя. Звучит сложно, так что давайте разберем на примере:
- на сервере есть пользователь evgeniy , UID равен 1000
- на сервере есть пользователь developer , UID равен 1001
- на клиенте есть пользователь evgeniy , UID равен 1000
- на клиенте есть пользователь backups , UID равен 1001
Посмотрим владельца файлов на сервере в директории /var/www/ :
$ ls -l /var/www/ # показывается имя владельца итого 12 drwxr-xr-x 6 developer www-data 4096 мая 31 14:45 host1.loc drwxr-xr-x 2 developer www-data 4096 мая 31 09:07 host2.loc drwxr-xr-x 2 developer www-data 4096 мая 31 08:55 html
$ ls -n /var/www/ # показывается UID владельца итого 12 итого 12 drwxr-xr-x 6 1001 33 4096 мая 31 14:45 host1.loc drwxr-xr-x 2 1001 33 4096 мая 31 09:07 host2.loc drwxr-xr-x 2 1001 33 4096 мая 31 08:55 html
Смонтируем удаленную файловую систему без опции idmap и посмотрим список файлов в директории /home/evgeniy/var-www/ :
$ sshfs developer@192.168.110.30:/var/www/ /home/evgeniy/var-www/
$ ls -l /home/evgeniy/var-www/ # показывается имя владельца итого 12 drwxr-xr-x 1 backups www-data 4096 мая 31 14:45 host1.loc drwxr-xr-x 1 backups www-data 4096 мая 31 09:07 host2.loc drwxr-xr-x 1 backups www-data 4096 мая 31 08:55 html
$ ls -n /home/evgeniy/var-www/ # показывается UID владельца итого 12 drwxr-xr-x 1 1001 33 4096 мая 31 14:45 host1.loc drwxr-xr-x 1 1001 33 4096 мая 31 09:07 host2.loc drwxr-xr-x 1 1001 33 4096 мая 31 08:55 html
Смонтируем удаленную файловую систему с опцией idmap и посмотрим список файлов в директории /home/evgeniy/var-www/ :
$ sshfs -o idmap=user developer@192.168.110.30:/var/www/ /home/evgeniy/var-www/
$ ls -l /home/evgeniy/var-www/ # показывается имя владельца итого 12 drwxr-xr-x 1 evgeniy www-data 4096 мая 31 14:45 host1.loc drwxr-xr-x 1 evgeniy www-data 4096 мая 31 09:07 host2.loc drwxr-xr-x 1 evgeniy www-data 4096 мая 31 08:55 html
$ ls -n /home/evgeniy/var-www/ # показывается UID владельца итого 12 drwxr-xr-x 1 1000 33 4096 мая 31 14:45 host1.loc drwxr-xr-x 1 1000 33 4096 мая 31 09:07 host2.loc drwxr-xr-x 1 1000 33 4096 мая 31 08:55 html
Как видите, все просто. При использовании опции idmap=user — все файлы, которые принадлежат на сервере пользователю developer , на клиенте принадлежат локальному пользователю evgeniy . Утилита sshfs в процессе работы подменяет UID удаленного пользователя developer , который равен 1001 на UID локального пользователя evgeniy , который равен 1000 . Если опция не используется, на локальной машине мы видим UID пользователя backups , потому что он совпадает с UID удаленного пользователя developer .
Эту опцию лучше использовать всегда. Либо, создать локального пользователя с таким же именем, как на сервере. И монтировать удаленную файловую систему от имени локального пользователя developer , передавая sshfs имя и пароль удаленного пользователя developer . Это не обязательно, но так проще не запутаться — почему файлы принадлежат пользователю backups и какое отношение он имеет к файлам веб-сервера? А никакого не имеет — просто UID совпали.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
- 1С:Предприятие (31)
- API (29)
- Bash (43)
- CLI (99)
- CMS (139)
- CSS (50)
- Frontend (75)
- HTML (66)
- JavaScript (150)
- Laravel (72)
- Linux (143)
- MySQL (76)
- PHP (125)
- React.js (66)
- SSH (27)
- Ubuntu (66)
- Web-разработка (509)
- WordPress (73)
- Yii2 (69)
- БазаДанных (95)
- Битрикс (66)
- Блог (29)
- Верстка (43)
- ИнтернетМагаз… (84)
- КаталогТоваров (87)
- Класс (30)
- Клиент (27)
- Ключ (28)
- Команда (68)
- Компонент (60)
- Конфигурация (59)
- Корзина (32)
- ЛокальнаяСеть (28)
- Модуль (34)
- Навигация (31)
- Настройка (137)
- ПанельУправле… (29)
- Плагин (33)
- Пользователь (26)
- Практика (99)
- Сервер (74)
- Событие (27)
- Теория (104)
- Установка (65)
- Файл (47)
- Форма (58)
- Фреймворк (192)
- Функция (36)
- ШаблонСайта (68)
ИТ решения, настройка серверов Linux, Asterisk
Настройка и администрирование Windows и Linux, телефония Asterisk, готовые решения и услуги аутсорсинга.
Монтируем папку через sftp на Ubuntu
Потребовалось получить доступ к папке на сервере с Ubuntu, с возможностью примонтировать её на свой компьютер (тоже Ubuntu).
Чтобы не городить лишний софт и использовать шифрование, воспользуемся протоколом SFTP (SSH File Transfer Protocol), который входит в состав Openssh.
На сервере
Логинимся на сервер по ssh и создаем пользователя sftp-user, запрещаем ему локальный вход и возможность выходить за пределы своей домашней директории:
useradd -d /dev/null -M -s /bin/bash sftp-user passwd sftp-user
Subsystem sftp internal-sftp Match User sftp-user X11Forwarding no AllowTcpForwarding no AllowAgentForwarding no PermitTunnel no ForceCommand internal-sftp ChrootDirectory /tmp
В ChrootDirectory указываем требуемую папку, в которую монтировать. Не забудьте проверить права доступа 🙂
На клиенте
sshfs sftp-user@server-ip-address:/tmp /mnt/test/
Далее нужно будет ввести пароль для авторизации и проверить содержимое /mnt/test
Отключить соединение можно командой:
Нас, конечно, интересует автоматизация подключения, приступим:
Чтобы не вводить пароль, передадим его напрямую:
echo 'password'| sshfs sftp-user@server-ip-address:/tmp /mnt/test/ -o password_stdin
Это небезопасно, так что можно засунуть это конструкцию в скрипт и ограничить доступ до него. Либо вы можете настроить авторизацию по сертификату (Гугл в помощь). Далее можно засунуть команду или полученный скрипт в crontab и монтировать папку при включении компьютера, но это не удобно. Вот здесь я подсмотрел другой способ. Монтирование происходит только при обращении к папке.
Устанавливем Automount FUSE и пробуем подключиться:
sudo apt-get install afuse afuse -o mount_template="sshfs %r:/ %m" -o unmount_template="fusermount -u -z %m" /tmp