Как отслеживать активность одного конкретного файла [закрыто]

Подстановочные знаки Sudoers поддерживаются только в globbing (man glob, man fnmatch). Однако команды start, stop, restart ( и т.д.) для systemctl не могут быть глобальными, поскольку они не являются файлами.

Тот факт, что вам нужно перечислять каждую команду, хорош с точки зрения безопасности. Если dhcpcd@eth0.service обновляется командой, скажем shutdown-machine при обновлении системы, ваши пользователи sudo не смогут ее использовать (к счастью).

В руководстве по sudoers есть заметка об этом:

 Wildcards in command line arguments should be used with care.
 Command line arguments are matched as a single, concatenated string.  This mean a wildcard character such as ‘?’ or
 ‘*’ will match across word boundaries, which may be unexpected.  For example, while a sudoers entry like:

     %operator ALL = /bin/cat /var/log/messages*

 will allow command like:

     $ sudo cat /var/log/messages.1

 It will also allow:

     $ sudo cat /var/log/messages /etc/shadow

 which is probably not what was intended.  In most cases it is better to do command line processing outside of the
 sudoers file in a scripting language.

С другой стороны, если вы хотите сэкономить на вводе текста, вы можете сделать именно то, что предлагает руководство: использовать язык сценариев. Например, вы можете написать что-то вроде этого в /usr/local/sbin/sudoers-dhcpd.sh:

#!/bin/sh

case "$1" in
  start)
    systemctl start dhcpcd@eth0.service
    ;;
  stop)
    systemctl stop dhcpcd@eth0.service
    ;;
  restart)
    systemctl restart dhcpcd@eth0.service
    ;;
  *)
    echo You are not allowed to do that!
    ;;
esac

И добавить строку sudoers следующим образом:

%mygroup ALL=NOPASSWD: /usr/local/sbin/sudoers-dhcpd.sh
1
15.05.2016, 11:46
1 ответ

"Инструмент командной строки, который может отслеживать результаты этого конкретный файл в течение некоторого периода времени "будет tail --follow = name --retry filename . Он будет печатать строки файла по мере их добавления и будет читать с начала файла, если он будет удален и воссоздан заново, но, к сожалению, он может пропустить строки, если файл будет усечен . Тест 1:

Терминал 1 (обратите внимание, как он не печатает bar ):

$ tail --follow=name --retry test.log
tail: cannot open 'test.log' for reading: No such file or directory
tail: 'test.log' has appeared;  following new file
foo
tail: 'test.log' has become inaccessible: No such file or directory
tail: 'test.log' has appeared;  following new file
baz

Терминал 2:

$ echo foo > test.log
$ echo bar > test.log
$ rm test.log
$ echo baz > test.log

Тест 2, терминал 1:

$ rm test.log
$ tail --follow=name --retry test.log
tail: cannot open 'test.log' for reading: No such file or directory
tail: 'test.log' has appeared;  following new file
1
2
tail: test.log: file truncated
3
4

Терминал 2:

$ echo 1 > test.log
$ echo 2 >> test.log
$ echo 3 > test.log
$ echo 4 >> test.log

Если вы пытаетесь следить за выводом команды , вам необходимо подключить стандартный вывод (и, возможно, стандартную ошибку) этой команды к чему-то - терминалу (просто запустите команда), файл ( команда> my.log 2> & 1 ) или другая команда ( команда 2> & 1 | tail -f ).

2
27.01.2020, 23:35

Теги

Похожие вопросы