Принятие наиболее часто используемого дистрибутива 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 к целевому каталогу (однако, можно присвоить тот же корневой каталог второму пользователю).
Учитывая следующие типичные точки монтирования:
$ 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: -
В Linux у нас есть findmnt
из util-linux
, созданный именно для этого
findmnt -n -o SOURCE --target /path/to/FILE
Преимущество перед другими решениями в том, что он работает, если пути запутаны симлинками или дублирующимися bind mounts.