Дозволити користувачу запускати команду з аргументами (яка містить пробіли)


17

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

Однак це не працює, sudo продовжує просити пароль.

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

/etc/sudoers.d/user-can-grep містить цей вміст:

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

Цей файл судорів належить root:rootі має дозволи-r--r-----

Сервер надійний Ubuntu 14.04.3 LTS.

Як я можу змусити цю роботу?


Чи перевіряють нагіоси явно виклики / bin / grep, або / usr / bin / grep?
Джефф Шаллер

Напишіть сценарій оболонки, який це робить, а потім нехай запускається сценарій sudo.
користувач253751

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

Відповіді:


13

Мабуть, sudo згладжує команду в рядок, перш ніж порівнювати її із специфікацією у файлі sudoers. Тож у вашому випадку вам не потрібно використовувати лапки або будь-яку іншу форму втечі:

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

Редагувати : Як у коментарях вказує @ user23013, це можна використовувати для отримання "ряду, який я хочу" у будь-якому файлі (і, як розширення, також для "рядка 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на будь-який файл із символічного посилання string I want.
user23013

2
@ Відповідь EightBitTony (написати сценарій обгортки, дозволити доступ Sudo до цього сценарію) набагато краща та безпечніша.
cas

О, це надзвичайно погана практика для інструмента, орієнтованого на безпеку.
Сем Уоткінс

32
  1. Написання сценарію (для запису тільки корінь)
  2. У цьому сценарії виконайте grepнеобхідне
  3. У налаштуваннях sudoers дозволити доступ лише до цього сценарію
  4. Налаштуйте будь-який інструмент або порадьте будь-якого користувача просто запустити скрипт через sudo

Набагато простіше налагодження, простіше заблокувати конкретний доступ до певного файлу та набагато складніше використовувати.


2

Так як вам потрібно тільки корінь для доступу до файлу, слід використовувати cat, teeабо що - щось подібне і трубопроводів , що grepабо будь-який інший програми вам потрібно запустити. Наприклад, sudo cat /file/path | grep …ви обмежуєте корінь там, де вам це абсолютно потрібно.


0

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

ваш super.tab виглядатиме так:

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

і буде викликано як super grepcmd.


sudoмає Cmnd_Alias(який може містити одну чи більше команд, з обмеженнями аргументу або без).
cas

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

ось для чого розробляються сценарії обгортки ... і вони не обмежуються одностроями або мають дратівливі проблеми цитування.
cas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.