Я думаю, что Вы пропускаете очень важную деталь здесь. Из страницы справочника, как заключено в кавычки (и подчеркнул) Вами:
Опция группы подобна с ограничением, что пользователь должен быть членом группы специального файла.
Отметьте мой акцент на "специальный файл". Если Вы обращаетесь к следующему объяснению об опции группы:
группа Позволяет дежурному блюду (т.е. некорневой) пользователь монтировать файловую систему, если одна из его групп соответствует группе устройства. Эта опция подразумевает опции nosuid и nodev (если не переопределено последующими опциями, как в группе строки опции, dev, suid).
Это означает, что устройство или специальный файл, который Вы пытаетесь смонтировать как myuser
должен иметь то же владение группы как владение пользователя myuser
.
Вот пример:
Давайте предположим, что существует устройство /dev/sda5
в системе, которая смонтирована на /builds
каталог:
# ls -l /dev/sda5
brw-rw---- 1 root disk 8, 5 Jun 15 21:20 /dev/sda5
# grep sda5 /etc/fstab
/dev/sda5 /builds reiserfs group,defaults 1 2
Кроме того, в этой той же системе существует 2 пользователя: foo
и srinidhi
# id foo
uid=1005(foo) gid=100(users) groups=100(users),33(video)
# id srinidhi
uid=1000(srinidhi) gid=100(users) groups=100(users),16(dialout),6(disk),10(wheel)
Пользователь srinidhi
(кто часть группы disk
) попытки смонтироваться /builds
:
srinidhi@linux:~> mount /builds/
srinidhi@linux:~> echo $?
0
Теперь, давайте посмотрим то, что происходит когда foo
попытки смонтироваться /builds
:
srinidhi@linux:~> su - foo
foo@linux:~> mount /builds/
mount: only root can mount /dev/sda5 on /builds
foo@linux:~>
С тех пор foo
не часть disk
группа, mount
сбои.
Возвращаясь к Вашему случаю, необходимо удостовериться то владение группы /blergh
должен или быть myuser
или disk
. Просто установите корректное владение группы и Ваш оригинал /etc/fstab
запись должна начать работать:
# chgrp myuser /blergh
Теперь попытайтесь работать mount /media/blergh
как myuser
.
Примечание: Владение точки монтирования (здесь /media/blergh
) не влияет mount
.
Такие программы, как SSH, sudo
, su
и т. Д., Запускают оболочку с помощью параметра семейство системных вызовов exec
. И эти системные вызовы позволяют вызывающей программе указывать каждый аргумент, включая функцию. Например, использование sudo
для запуска оболочки входа в систему:
$ strace -fe execve -o sudo.log sudo -i
root:~ $ echo $0
-bash
root:~ $ logout
$ grep bash sudo.log
19124 execve("/bin/bash", ["-bash"], [/* 31 vars */]) = 0
19140 execve("/bin/ls", ["ls", "/etc/bash_completion.d"], [/* 40 vars */]) = 0
Как видно из первого вызова execve
, массив аргументов, переданных в bash
, имеет вид просто ["- bash"]
- поэтому нулевой аргумент равен -bash
.
Это легко воспроизвести с помощью zsh
, который позволяет использовать соответствующий аргумент для вызова exec (3)
. должен быть указан через ARGV0
:
% ARGV0=-bash bash
-bash-4.1$ ps o cmd --pid=$$
CMD
-bash
-bash-4.1$ exit
% ARGV0=imnotaduck bash
$ ps o cmd --pid=$$
CMD
imnotaduck
$ exit
%
В C, как это сделано с помощью login (1)
, код будет запускать что-то вроде:
execlp("/usr/local/bin/bash", "-bash", ..., (char *) 0)
, чтобы вставить дефис в имя процесса. Это можно подтвердить, запустив login
и bash
под strace
, либо проверив исходный код для login
.
Чтобы войти в систему как пользователь usertest, выполните (будучи root):
root:~# login usertest
Password:
usertest:~$ echo $0
-bash
usertest:~$ exit
root:~# _
Это формальный способ входа пользователя в систему.
Конечно, вы всегда можете выполнить команду для которого изменен $ 0:
bash -c 'echo "hello"; echo $0;' mylogthisshell
Который всегда может иметь начальный рывок
bash -c 'echo "hello"; echo $0;' -mylogthisshell