Я думаю, что важно отметить что cat
не проблема в моем комментарии выше, но перенаправление оболочки. Вы пытаетесь ограничить копирование двоичных файлов или текстовых файлов? Если это - двоичные файлы, то я полагаю, что можно разработать что-то с rbash (см. http://blog.bodhizazen.net/linux/how-to-restrict-access-with-rbash/).
Однако, если это - текстовые файлы, я не уверен, как можно предотвратить кого-то от просто копирования с их локального терминала.
Я не уверен, что любое решение генерала SELinux было бы полезно здесь. Ваше приложение, которое читает, файлы должны записать данные где-нибудь? Если не и эти файлы только должен быть считан Вашим приложением, Вы могли бы просто дать доступ только для чтения типа своего приложения к файлам типа, который Вы хотели бы, чтобы это считало, и не даете ему запись нигде.
Я думаю, что еще некоторая информация о точных полномочиях, требуемых Вашим примером использования, могла бы быть полезной, извините для неопределенного ответа.
ОБНОВЛЕНИЕ - БОЛЕЕ ОПРЕДЕЛЕННЫЙ ОТВЕТ
Я думаю, что можно достигнуть того, что Вы хотите без SELinux, как это - то, сколько вещей обрабатывается (например, обычные пользователи, изменяющие их пароль в/etc/shadow через passwd
команда):
chmod g+s
или chmod u+s
UPDATE2 - МНОГОЧИСЛЕННЫЕ ПОЛЬЗОВАТЕЛИ И ГРУППЫ, Если у Вас есть несколько приложений и групп, можно, вероятно, достигнуть функциональности, с которой Вы ищете sudo
. Многие люди знают о его способности позволить Вам команды выполнения корень, но это - полноценность, идет далеко вне того примера. Я не уверен это идеальная установка, но это - один способ сделать то, чего Вы делаете попытку.
Можно все еще сделать все файлы приложения принадлежавшими приложению, но затем можно сделать отдельные группы для каждого набора файлов. Это что Ваш /etc/sudoers
или файл в /etc/sudoers.d/
мог быть похожим:
User_Alias FILEGROUP1 = user1, user2
User_Alias FILEGROUP2 = user3, user4
Cmnd_Alias MYEDITOR = /usr/local/bin/myeditor, /usr/local/bin/mycompiler
FILEGROUP1 ALL=(:fileset1) NOPASSWD: MYEDITOR
FILEGROUP2 ALL=(:fileset2) NOPASSWD: MYEDITOR
Где user1
и user2
нужен доступ к файлам, принадлежавшим группе fileset1
и user3
и user4
нужен доступ к файлам, принадлежавшим группе fileset2
. Вы могли также использовать группы вместо пользователей.
Пользователи могли получить доступ к своим файлам через редактора путем выполнения sudo -g fileset1 /usr/local/bin/myeditor
или что-то подобное.
Это могло бы помочь создать некоторые сценарии обертки для необходимого sudo -g
команды для Ваших пользователей, тем более, что это походит, могут быть графическим приложением.
Подробнее:
http://www.garron.me/linux/visudo-command-sudoers-file-sudo-default-editor.html
https://serverfault.com/questions/166254/change-primary-group-with-sudo-u-g
Согласно POSIX странице стандарта на sed
:
Скрипт должен состоять из редактирования команды следующего вида:
[ адрес [, адрес ]] функциягде
function
представляет собой односимвольный командный глагол из списка в Команды редактирования в sed , за которым следуют любые применимые аргументы.
Итак, первый непустой символ после адреса используется как командный глагол - в вашем конкретном случае это /
, отсюда ошибка: char 9: unknown command: '/'
.
Ссылки на фигурные скобки указаны ниже:
[ 2addr ] { команда редактирования команда редактирования ... }Выполнять список команд редактирования `sed` только когда пространство шаблона выбрано. …
[ 2addr ] - индикатор того, что максимальное количество допустимых адресов равно двум.
Чтобы прояснить пункт, сделанный выше, в разделе Адреса sed (1)
говорится:
Sed
команды могут быть даны без адресов, {{1 }} в этом случае команда будет выполняться для всех строк ввода; с одним адресом, и в этом случае команда будет выполняться только для строк ввода, соответствующих этому адресу; {{1} } или с двумя адресами, и в этом случае команда будет выполняться для всех входных строк, которые соответствуют включенному диапазону строк , начиная с первого адреса и продолжая до второго адреса. Что касается диапазонов адресов, на которые следует обратить внимание: синтаксис: addr1 , addr2 (т.е. адреса разделяются запятой);
… (и другие материалы, не относящиеся к этому обсуждению) …
Информационная страница GNU ( info sed
) имеет аналогичный описание {
и }
,
в разделе «3.4 Часто используемые команды»:
{ КОМАНДЫ }Группа команды могут быть заключены в между
{
и}
символами. Это особенно полезно, когда вы хотите, чтобы запускалась группа команд {{1} } по одному совпадению адреса (или диапазона адресов).
Иначе говоря, фигурные скобки используются для применения нескольких команд к одному и тому же адресу или для вложенных адресов.
Стандарт здесь не очень явный 1 , но левая скобка {
на самом деле команда, запускающая группу других команд sed ( группа заканчивается правой фигурной скобкой }
).
И, рискуя действительно перейти на TL; DR , проблема в том,
что 195
, 210
и / add /
- это все адреса .
Команды sed
не могут быть вызваны с тремя адресами.
Таким образом, чтобы заставить вашу команду работать
, нужно вызвать команду {
в диапазоне адресов 195,210
,
, а затем ( в этом диапазоне) вызовите команду p
по адресу / add /
.
1:
хотя, если вы читаете всю страницу, упоминается, что:
Командные глаголы, кроме {, a , ] b , c , i , r , t , w , : и # могут сопровождаться ...
Согласно документации для sed
фигурные скобки используются для группировки команд вместе. Итак,
sed -n '195,210{/add/p}' <file>
сначала обрабатывается как диапазон адресов 195,210
с помощью команды блока. Затем команда блока состоит из спецификации адреса / add /
с командой print p
Синтаксис sed похож на
адрес / команда.
Итак, 195,210 - это первый совпадающий адрес, но затем вы хотите выполнить новую команду в этом диапазоне, а именно сопоставить «добавить», а затем распечатать. Поэтому вам нужно сгруппировать эту дополнительную команду, используя фигурные скобки.