Определите, на каком устройстве каталог расположен

Принятие наиболее часто используемого дистрибутива Linux и sshd сервисного выполнения.

1) Если Вы хотите, чтобы два пользователя смогли создать, удалить и изменить файлы в соответствии с тем же каталогом, то просто создают одну учетную запись и предоставляют учетные данные обоим людям. Это - самый легкий путь, однако...

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

groupadd sftp
mkdir /home/sftp
chown nobody:sftp /home/sftp
chmod 770 /home/sftp
useradd -d /home/sftp -g sftp sam
useradd -d /home/sftp -g sftp tom

если пользователи sam и tom уже существуют и имеют свою собственную основную группу, то chmod g+s /home/sftp вынудит файлы, созданные в соответствии с этим каталогом наследовать его идентификатор группы.

Проверьте это другое сообщение на то, как вызвать значение по умолчанию umask под sftp, таким образом, загруженные файлы являются группой read/write-able.

2) Если Вы хотите, чтобы только один пользователь создал, удалил и изменил содержание каталога и второго пользователя, чтобы иметь доступ только для чтения. Этому действительно не нужна никакая специальная обработка, обычные пользователи могут считать содержание из каталогов других пользователей. Второй пользователь должен будет просто указать или CD к целевому каталогу (однако, можно присвоить тот же корневой каталог второму пользователю).

52
08.05.2014, 16:26
4 ответа
[114577]Если я понимаю ваш вопрос, то вы хотите знать, какое устройство использовалось для данного монтирования. Для этого вы можете использовать команду [115126]df[115127]:[12104]Чтобы найти устройство, на котором находится конкретный файл/каталог, дайте этому файлу аргумент [115128]df[115129]. Используя ваш пример:[12105]Вы также можете использовать команду [115130]mount[115131]:[12106]Каталог, смонтированный для каждого устройства, является 3-м аргументом в выводе, приведённом выше. Таким образом, для устройства [115132]/dev/sda1[115133] будет [115134]/boot[115135]. Остальные устройства используют LVM (Logical Volume Management - управление логическими томами), и их нужно дополнительно запросить, чтобы узнать, какое устройство в действительности используется LVM.[114584].
51
27.01.2020, 19:33
[114645] Самый точный метод, который мне известен, это использование вывода системного вызова lstat(). В частности, поле st_dev. Есть утилита командной строки, stat(1), с помощью которой можно посмотреть эту информацию. Например, вывод "stat /etc/issue" на мой ноутбук:[12136]Обратите внимание на третью строку, первое поле "Device". Здесь перечисляется 801h. Это значение можно разделить на два байта, 8 и 1. Первый байт называется мажорным числом, второй байт - минорным. Итак, следующий шаг - выяснить, что такое устройство мажор 8, минор 1.[12137]Я нахожу наиболее быстрым обращение к разделам /proc/. В моем случае разделы /proc/ имеют содержимое:[12138]Из этого вывода довольно ясно, что мажор 8, минор 1 - это sda1. Мы можем подтвердить это с помощью ls -l /dev/sda1 [12139]Обратите внимание на 8, 1 перед отметкой даты.[12140]Важно понять/помнить, что имя файла устройства типа /dev/sda1 - это только метка. Мажорное и минорное числа являются значительными, важными значениями файла устройства. Если вам интересно, обратите внимание на утилиту mknod(1), используемую для создания файлов устройств. Я могу создать новую запись в /dev под названием aardvark с major 8, minor 18 со следующим синтаксисом:[12141]Затем я могу легко смонтировать ее:[12142]и, если мы посмотрим на вывод команды mount или на содержимое /proc/mounts и увидим:[12143]df -h shows:[12144].... В любом случае, смысл всего этого в том, чтобы проиллюстрировать, что важными деталями для идентификации блочного устройства являются основные и второстепенные номера, а не метка файла устройства, и что использование системного вызова lstat() является лучшим способом запроса этих значений.[12145]В качестве последнего комментария, я просто перечитал ваш вопрос, чтобы убедиться, что я на него ответил, и понял, что вы спрашиваете, какая метка исходного устройства будет отображаться в /proc/mounts для монтирования при привязке. Это будет тот же самый ярлык исходного устройства, который использовался в оригинальном вызове mount(2) для точки монтирования файловой системы. Возможно, поможет пример:[12146]У меня есть /dev/sdb2 и /dev/aardvark (то же самое, что и выше). Оба они мажорные 8, минорные 18. Обратите внимание, я буду монтировать одну и ту же файловую систему дважды. Я делаю следующее:[12147]Обратите внимание, что я делаю каталог somedir в /mnt1. Но так как в /mnt1 и /mnt2 монтируются одни и те же файловые системы, то с помощью /mnt2 также будет доступен somedir.[12148]Теперь, если мы проверим /proc/mounts, то увидим:[12149]Метка исходного устройства в /foo/... bind mounts совпадает со значением, изначально указанным в вызове монтирования файловой системы (2). Помните, что /dev/aardvark и /dev/sdb2 в моем примере - одно и то же устройство. [12150] Я понимаю, что только что напечатал роман, и первая половина вообще не отвечает на ваш вопрос, но удалять его казалось таким расточительным занятием. Возможно, это поможет кому-то другому.[12151]Удачи.[12152]P.S. Имейте в виду, что некоторые файловые системы основаны на сети - как NFS или CIFS - или являются виртуальными - как procfs или sysfs и не имеют устройства с исходным блоком. Я не знаю, что будет возвращено в качестве устройства на выходе статистики, только сколько это стоит.[114680].
12
27.01.2020, 19:33

Учитывая следующие типичные точки монтирования:

$ df --output=target
Mounted on
/
/dev
/run
/sys/fs/cgroup
/run/lock
/run/shm
/run/user

stat --format% m будет печатать только точку монтирования с возможностью перехвата по кругу ( хотя вам нужно проверить код выхода, чтобы однозначно обнаружить ошибку разрешения; подходы с использованием таблицы монтирования выигрывают здесь):

$ stat --format %m /
/
$ stat --format %m /tmp
/
$ stat --format %m /proc
/proc
$ stat --format %m /run
/run
$ stat --format %m /run/mount
/run
$ stat --format %m /run/user
/run/user
$ stat --format %m /run/user/1000/dconf
/run/user
$ stat --format %m /run/user/1000/gvfs
/run/user/1000/gvfs

Символьные ссылки, как обычно, требуют некоторой осторожности:

$ ls -lh ~/.gvfs
/home/cwillu/.gvfs -> /run/user/1000/gvfs
$ stat --format %m ~/.gvfs
/run/user/1000/gvfs
$ stat --format %m ~/.gvfs
/

И, конечно, не забывайте использовать кавычки при написании сценариев. Рассмотрим путь к точке монтирования с пробелами и т. Д .:

$ mkdir /tmp/Something\ Like\ This\!
$ sudo mount none /tmp/Something\ Like\ This\! -t tmpfs
$ stat --format %m /tmp/Something\ Like\ This\!
/tmp/Something Like This!
$ touch /tmp/Something\ Like\ This\!/pretend-I\'m-big
$ ls /tmp/Something\ Like\ This\!
pretend-I'm-big

Насколько велики вы?

$ du $(stat --format %m /tmp/Something\ Like\ This\!/)
du: cannot access /tmp/Something: No such file or directory
du: cannot access Like: No such file or directory
du: cannot access This!: No such file or directory

$ du "$(stat --format %m /tmp/Something\ Like\ This\!/)"
0   /tmp/Something Like This!

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

$ stat --format %m /tmp/Something*
/tmp/Something   
Like   This!

$ a="$(stat --format %m /tmp/Something*)"
    # the above assignment is actually the one place you don't need quotes, 
    # but `export a=...` or similar _would_ need them, so we'll just put them in;
    # they don't change the behaviour in this form of assignment.

$ stat "$a"
  File: ‘/tmp/Something   \r\n\rLike   This!’
  Size: 40          Blocks: 0          IO Block: 4096   directory
Device: 7bh/123d    Inode: 1279171     Links: 2
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-09-30 11:43:17.933467344 -0600
Modify: 2016-09-30 11:43:17.933467344 -0600
Change: 2016-09-30 11:43:17.933467344 -0600
 Birth: -
2
27.01.2020, 19:33

В Linux у нас есть findmnt из util-linux, созданный именно для этого

findmnt -n -o SOURCE --target /path/to/FILE

Преимущество перед другими решениями в том, что он работает, если пути запутаны симлинками или дублирующимися bind mounts.

58
27.01.2020, 19:33

Теги

Похожие вопросы