Монтирование удаленной директории с помощью sshfs. Часть 1 из 2
05.06.2020
Теги: FTP • Linux • SSH • Директория • Клиент • Ключ • Настройка • Сервер • Установка • Файл
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
:
$ sudo apt install sshfs
Создадим каталог для монтирования удаленной файловой системы:
$ mkdir /home/evgeniy/var-www
Смонтируем в этот каталог директорию /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
совпали.
- Монтирование удаленной директории с помощью sshfs. Часть 2 из 2
- Установка WireGuard на Ubuntu 20.04 LTS. Часть вторая из двух
- Установка WireGuard на Ubuntu 20.04 LTS. Часть первая из двух
- Удаленный рабочий стол в Ubuntu Desktop 18.04 LTS
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 10 из 12
Поиск: FTP • Linux • SSH • Директория • Клиент • Ключ • Настройка • Сервер • Установка • Файл • SSHFS