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

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

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

Моя команда: sudo grep "string I want (" /var/log/thefilename.log (да, есть raw ( и некоторые пробелы в строке, которую я хочу 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 trusty 14.04.3 LTS.

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

По-видимому, 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 .

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

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

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

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

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

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

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