Разрешить пользователю запускать команду с аргументами (которая содержит пробелы)


17

Я хочу разрешить одному пользователю запускать grep (через sudo) и grep для одной конкретной строки в одном конкретном файле. Я не хочу, чтобы этот пользователь мог запускать grep для всех файлов. Пользователь не имеет доступа для чтения к файлу, поэтому требуется использовать sudo. Я пытаюсь написать проверку nagios, который greps файл журнала другой службы на машине.

Однако это не работает, sudo продолжает спрашивать пароль.

Моя команда: sudo grep "string I want (" /var/log/thefilename.log(да, есть (строка и некоторые пробелы в строке, которую я хочу grep)

/etc/sudoers.d/user-can-grep имеет это содержание:

user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log

Этот файл sudoers принадлежит root:rootи имеет разрешения-r--r-----

Сервер Ubuntu верен 14.04.3 LTS.

Как я могу сделать эту работу?


Проверяет ли nagios явно / bin / grep или / usr / bin / grep?
— Джефф Шаллер

Напишите сценарий оболочки, который делает это, а затем дайте сценарию пройти sudo.
— user253751

@JeffSchaller К вашему сведению сценарий просто вызывает grepи which grepсообщает, что использует /bin/grep. AFAIK в файле sudo необходимо указать полный путь к двоичному файлу, даже если вы вызываете его без полного пути.
— Рори

Ответы:


13

Судя по всему, sudo объединяет команду в строку перед тем, как сравнить ее со спецификацией в файле sudoers. Итак, в вашем случае вам не нужно использовать кавычки или любую другую форму экранирования:

user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log

Редактировать : как @ user23013 указывает в комментариях, это можно использовать для grep для «строки, которую я хочу» в любом файле (и, соответственно, также для «строки I» и «строки».) Пожалуйста, внимательно подумайте, прежде чем используя проверку аргументов sudo!


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

sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log

Это связано с тем, что кавычки и экранирование обрабатываются оболочкой и никогда не достигают sudo.


Интересно, интересно ли это использовать, то есть убедить, что sudoвы напечатали одну вещь (которая соответствует спецификации), но когда дело доходит до ее выполнения, это совсем другое.
— EightBitTony

4
@EightBitTony Конечно, это так! В вашем sudoers: user host = NOPASSWD: /usr/bin/vim Editing sudoers file(с намерением разрешить пользователям редактировать "Редактирование файла sudoers") можно использовать cdвход /etc/и запуск sudo vim Editing sudoers file. Я бы сказал, что для любой команды разумной сложности следует использовать подход, предложенный в вашем комментарии - оболочка предоставляет $@переменную, где вы можете проверить, сгруппированы ли аргументы так, как вы ожидаете, что они будут сгруппированы.
— Александр Батищев

8
Создать путь в ( /var/logлюбом месте и символическую ссылку thefilename.logна любой файл, пользователь может grep string I wantиз любого файла.
— user23013

2
Ответ @ EightBitTony (напишите скрипт-обертку, разрешите доступ sudo к этому скрипту) гораздо лучше и безопаснее.
— Cas

Вау, это крайне плохая практика для инструмента, ориентированного на безопасность.
— Сэм Уоткинс

32
  1. Написать скрипт (доступный для записи только пользователю root)
  2. В этом скрипте выполните то, что grepвам нужно
  3. В конфиге sudoers разрешите только доступ к этому скрипту
  4. Сконфигурируйте любой инструмент или посоветуйте любому пользователю просто запустить скрипт через sudo

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


2

Так как вам нужно только корень для доступа к файлу, следует использовать cat, teeили что - то подобное и трубопроводов , что grepили любой другой программы вам нужно запустить. Например, sudo cat /file/path | grep …таким образом вы ограничиваете root там, где вам это абсолютно необходимо.


0

sudoэто здорово, но иногда это не совсем подходит. Для этого я люблю использовать super. superтакже разрешает повышенные разрешения, однако предполагает псевдонимы команд, что удобно при разрешении сложных командных строк, поскольку они используются в качестве простых командных строк.

ваш super.tab будет выглядеть так:

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

и будет вызываться как super grepcmd.


sudohas Cmnd_Alias(который может содержать одну или несколько команд, с или без ограничений arg).
— Cas

Совсем не одно и то же. Cmnd_Alias ​​- это инструмент для упрощения файла конфигурации, он не предоставляет псевдоним пользователю, который является основным режимом работы super (именно поэтому я использую sudo, когда я не использую псевдонимы для команд или не запускаю suid-скрипты (большую часть времени) и супер для этих двух вариантов использования).
— hildred

это то, для чего предназначены сценарии-обёртки ... и они не ограничены однострочными или раздражающими проблемами цитирования.
— Cas
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.