Монтирование удаленной директории с помощью sshfs. Часть первая

05.06.2020

Теги: FTPLinuxSSHДиректорияКлиентКлючНастройкаСерверУстановкаФайл

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  /usr/lib/ssh/sftp-server

Монтирование

Сначала установим пакет 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 совпали.

Поиск: FTP • Linux • SSH • Директория • Клиент • Ключ • Настройка • Сервер • Установка • Файл • SSHFS

Каталог оборудования
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.