Файлы журнала exim`a содержат множество данных в каждой строке. Продолжая подход OP к разделению IP-информации, рассмотрим:
unique_ips2=$(grep "$email" tmp_exim | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.' | sort -u)
Первое изменение, приведенное выше, заключается в том, чтобы поместить регулярное выражение в одинарные кавычки, чтобы bash не вмешивался в него. Второе изменение - это выход из точки. Неэкранированная точка означает любой символ, но мы хотим, чтобы она означала только буквальную точку. Третье изменение - добавить (буквальную) точку в конце регулярного выражения. Это предотвращает совпадение регулярного выражения с двумя последними числами IP-адреса.
sed
также может сделать это хорошо:
unique_ips2=$(sed -nr "/$email/"' s/.*\[([0-9]{1,3}\.[0-9]{1,3})\..*/\1/p' tmp_exim | sort -u)
Параметр -n
указывает sed не печатать ничего, пока мы не попросим его явно, и -r
сообщает об этом, для удобства использовать расширенное регулярное выражение. (OSX отличается: замените -r
на -E
.) Выражение / $ email /
указывает sed
работать только со строками. с этим адресом электронной почты. (При использовании sed
, grep
часто бывает лишним.) Суть команды - это подстановка s /.* \ [([0-9] {1,3 } \. [0-9] {1,3}) \ .. * / \ 1 / p
. Это ищет любой текст (. *
), за которым следует буквальная открытая квадратная скобка (в моих журналах exim перед IP-адресом всегда стоит открытая квадратная скобка), за которым следует число, точка, другое число, точка и вообще что угодно (. *
). Регулярное выражение номер-период-номер сгруппировано в круглых скобках. Это означает, что мы можем ссылаться на него как на \ 1
(это единственная группировка по скобкам, поэтому она также является первой).Таким образом, команда замены заменяет всю строку только первыми двумя числами IP-адреса. Последний p
в команде указывает sed
напечатать результат, если произойдет подстановка.
Чтобы добиться того, чтобы пользователь techops
мог управлять сервисом publicapi.service
без ввода пароля, у вас есть разные возможности. Какой из них подходит именно вам, ответить невозможно, так как вам придется выбирать самостоятельно.
Классический sudo
подход, возможно, является наиболее часто используемым, так как он существует уже давно. Вам нужно будет создать, например. файл следующим образом.
Обратите внимание, что папка -в каталоге /etc/sudoers.d
активна только тогда, когда #includedir /etc/sudoers.d
установлено в /etc/sudoers
. Но так должно быть, если вы используете современный дистрибутив Ubuntu. Как root
выполнить:
cat > /etc/sudoers.d/techops << SUDO
techops ALL= NOPASSWD: /bin/systemctl restart publicapi.service
techops ALL= NOPASSWD: /bin/systemctl stop publicapi.service
techops ALL= NOPASSWD: /bin/systemctl start publicapi.service
SUDO
Теперь вы сможете запускать команды systemctl
от имени пользователя techops
без ввода пароля, добавляя перед командами sudo
.
sudo systemctl start publicapi.service
sudo systemctl stop publicapi.service
sudo systemctl restart publicapi.service
Второй метод заключается в использовании PolKit (, который был переименован из PolicyKit ), чтобы позволить пользователю techops
управлять systemd
службами. В зависимости от версии polit
вы можете предоставить обычным пользователям контроль над модулями systemd.
Чтобы проверить версию polkit , просто запустите pkaction --version
.
с polkit версии 0.106 и выше вы можете разрешить пользователям управлять определенными модулями systemd.
Для этого вы можете создать правило какroot
:
cat > /etc/polkit-1/rules.d/10-techops.rules << POLKIT
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
action.lookup("unit") == "publicapi.service" &&
subject.user == "techops") {
return polkit.Result.YES;
}
});
POLKIT
с polkit версии 0.105 и ниже:вы можете разрешить пользователям управлять модулями systemd. К сожалению, это включает в себя все модули systemd, и вы можете не захотеть этого делать. Не уверен, есть ли способ ограничить доступ к определенным модулям systemd с версией 0.105 или ниже, но, возможно, кто-то еще может пояснить.
Чтобы включить это, вы можете создать файл какroot
:
cat > /etc/polkit-1/localauthority/50-local.d/org.freedesktop.systemd1.pkla << POLKIT
[Allow user techops to run systemctl commands]
Identity=unix-user:techops
Action=org.freedesktop.systemd1.manage-units
ResultInactive=no
ResultActive=no
ResultAny=yes
POLKIT
В обоих случаях вы можете запустить systemctl [start|stop|restart] publicapi.service
от имени пользователя techops
без ввода пароля. В последнем случае (polkit <= 0.105 )пользователь techops
мог управлять любым модулем systemd.
Третий вариант заключается в том, чтобы сделать службу пользовательской службой, которая не нуждается в конфигурациях sudo
или polkit
.Это ставит все под контроль пользователя и работает только в том случае, если ваша фактическая служба, запущенная с /home/techops/publicapi start
, может работать без привилегий root
.
Сначала вы должны включить задержку для пользователя techops
. Это необходимо для запуска службы пользователя при загрузке. Как root
выполнить:
loginctl enable-linger techops
Затем вы должны переместить файл модуля systemd
в каталог пользователя techops
. От имени пользователя techops
выполните команды следующим образом.
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/publicapi.service << UNIT
[Unit]
Description=public api startup script
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/publicapi start
ExecStop=/home/techops/publicapi stop
[Install]
WantedBy=default.target
UNIT
Обратите внимание, что WantedBy
должно быть default.target
, поскольку multi-user.target
отсутствует в пользовательском контексте.
Теперь перезагрузите конфигурацию и включите службу. Снова как пользователь techops
выполните команды.
systemctl --user daemon-reload
systemctl --user enable publicapi.service
systemctl --user start publicapi.service
Как правило, вы должны размещать свои системные модули в /etc/systemd/system/
, а не непосредственно в /etc/systemd/system/multi-user.target.wants
. Когда вы выполняете systemctl enable publicapi.service
, символическая ссылка будет создана в etc/systemd/system/multi-user.target.wants
или любой другой цели, указанной для этого устройства.
Как уже упоминалось, если сам сервис/процесс может быть запущен без привилегий суперпользователя, вам следует подумать о добавлении User=techops
в ваш юнит-файл, чтобы запустить процесс с непривилегированной учетной записью пользователя -.
Во-первых, вы не помещаете юнит-файл в каталог /etc/systemd/system/multi-user.target.wants
. Этот каталог поддерживается командами systemd
и systemctl
. Вместо этого поместите файл модуля в /etc/systemd/system
, а затем включите его с помощью
sudo systemctl enable publicapi.service
Это создаст символическую ссылку нижеmulti-user.target.wants
(или где-либо еще, systemctl
знает лучше )чтить строки
[Install]
WantedBy=multi-user.target
в аппарате.
Затем создайте файл sudoers
ниже /etc/sudoers.d
:
sudo visudo -f /etc/sudoers.d/techops
со следующим содержанием:
Cmnd_Alias HANDLE_PUBLICAPI = \
/bin/systemctl start publicapi.service, \
/bin/systemctl stop publicapi.service, \
/bin/systemctl restart publicapi.service
techops ALL = (root) NOPASSWD: HANDLE_PUBLICAPI
Не используйте обычный редактор(т.е.sudo vim /etc/sudoers.d/techops
)отредактировать этот файл, потому что если вы добавите в него какие-либо синтаксические ошибки, вы не иметь возможность запустить sudo
снова. visudo
с другой стороны проверяет синтаксис файла перед выходом из редактора.
Теперь пользователь techops
может запускать
sudo systemctl start publicapi.service
и два других без указания пароля. Обратите внимание, что вы должны ввести команда и параметры точно такие же, как в файле sudoers
(, за исключением часть /bin/systemctl
, которую можно сократить доsystemctl
).
Например,sudo /bin/systemctl start publicapi
(без.service
)запросит пароль.