Подстановочные знаки 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
"Инструмент командной строки, который может отслеживать результаты этого конкретный файл в течение некоторого периода времени "будет 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
).