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

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

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

EightBitTony
источник
2

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

user167676
источник
0

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

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

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

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

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