Systemd - скрипт для включения и выключения юнита одной командой

В статье представлен образец скрипта, чтобы включать или выключать systemd unit одной командой.

Анатолий Остроумов

linuxsystemdsudo

188 Words

2025-01-18 13:31 +0300


Допустим, у вас есть OpenVPN соединение с работой (systemd-unit [email protected]), и вы хотите включать или выключать его одной командой:

$ connect_work

Для этого можно написать такой скрипт (и разместить его, допустим, в /usr/bin/connect_work):

#!/usr/bin/env bash

set -e

service="[email protected]"

if (systemctl -q is-active "$service") then
	echo "Stopping $service..."
	sudo systemctl stop "$service"
else
	echo "Starting $service..."
	sudo systemctl start "$service"
fi

systemctl status "$service"

Чтобы sudo не спрашивало постоянно пароль для эскалации прав, пользователю можно разрешить выполнять эти команды без запроса пароля, создав файл в /etc/sudoers.d/vpn с таким содержанием.

%vodolaz095 ALL=NOPASSWD: /usr/bin/systemctl start [email protected], /usr/bin/systemctl stop [email protected], /usr/bin/systemctl restart [email protected]

Тут:

  • %vodolaz095 - группа пользователя, которому можно совершать данные действия
  • ALL=NOPASSWD: выключает проверку пароля при вызове sudo для этих команд
  • /usr/bin/systemctl start [email protected], ... - список комманд, которые может вводить пользователь с эскалацией прав

Совет - файл можно создать любым текстовым редактором, но лучше всего использовать visudo - оно проверяет корректность синтаксиса.

Создать разрешения для использования vpn можно этой командой

$ sudo visudo /etc/sudoers.d/vpn 

Как итог, любой пользователь из группы vodolaz095 может вызвать команду $ connect_work и включить или выключить systemd юнит [email protected].

Образец скрипта также опубликован тут: https://gist.github.com/vodolaz095/484efe4fbd385185d50c0e454d32eabe