Исполнение команды с правами суперпользователя при загрузке системы

Исполнение команды с правами суперпользователя при загрузке Linux-системы никогда не представляло каких-либо сложностей. К сожалению, с переходом на менеджер загрузки systemd ситуация значительно усложнилась. Тем не менее, нет ничего невозможного, поэтому ниже будет рассмотрена последовательность действий, необходимых для выполнения описанной задачи.

Примечание: данное руководство предназначено для исполнения команд с правами суперпользователя (или пользователя root). Не стоит использовать его для исполнения команд, не требующих прав суперпользователя. Если вы все-таки решили использовать его для исполнения таких команд, следует предусмотреть механизм явного отказа от прав суперпользователя.

В данном руководстве не описывается методика использования файла /etc/rc.local, которая пока еще актуальна ввиду поддержки этого файла systemd для достижения обратной совместимости с существующими пользовательскими сценариями. Причина этого достаточно проста — никто не знает, как долго systemd будет поддерживать данный файл. Вместо этого описывается методика, связанная с созданием юнита systemd и официально рекомендуемая разработчиками systemd.

Вы должны действовать следующим образом:

A. Если вы не уверены в своих силах, стоит создать снимок корневой файловой системы с помощью приложения Timeshift, чтобы иметь возможность восстановить систему в случае ошибки. После этого следует открыть окно терминала.

Разбираться с реальным примером всегда проще, поэтому я буду демонстрировать методику исполнения команды при загрузке системы на примере исполнения команды для снижения мощности передатчика WiFi-адаптера. Разумеется, вам придется заменить ее на ту команду, которая нужна вам. Эта команда размещена в файле сценария командной оболочки.

B. В первую очередь следует создать сценарий командной оболочки, который будет исполняться systemd в процессе загрузки системы. Мы назовем его usercommand.sh. Скопируйте и вставьте в окно терминала команду для создания этого файла:

sudo touch /opt/usercommand.sh

Для исполнения команды следует нажать клавишу Enter. При запросе пароля вы должны будете ввести свой пароль. В Ubuntu символы пароля не будут отображаться с помощью каких-либо символов, даже точек и это нормально. В Linux Mint символы пароля будут отображаться с помощью звездочек. После окончания ввода пароля следует снова нажать клавишу Enter.

C. Далее следует использовать приведенную ниже команду для редактирования созданного сценария командной оболочки (три символа слэша не являются опечаткой; в Ubuntu вместо xed нужно использовать gedit):

xed admin:///opt/usercommand.sh

Для исполнения команды также следует нажать клавишу Enter. В случае запроса пароля следует ввести ваш пароль.

D. Теперь следует скопировать приведенный ниже блок команд в окно текстового редактора. Данный блок содержит команду для снижения мощности передатчика WiFi-адаптера, представленного сетевым интерфейсом с именем wlp2s0. Команда sleep позволяет отсрочить исполнение основной команды на 20 секунд для того, чтобы исполнить ее после полной загрузки системы (она снижает вероятность возникновения проблем, поэтому стоит использовать ее при исполнении практически всех команд):

#!/bin/sh
sleep 20
iwconfig wlp2s0 txpower 5
exit 0

Обратите внимание на то, что основная команда не должна иметь префикса sudo. Это объясняется тем, что сценарий командной оболочки запускается systemd от лица пользователя root.
Наконец, следует сохранить изменения и закрыть текстовый редактор.

E. Далее следует сделать созданный файл сценария командной оболочки исполняемым с помощью следующей команды:

sudo chmod u+x /opt/usercommand.sh

Для исполнения команды также следует нажать клавишу Enter.

F. Пришло время создать юнит-файл systemd. Для этого следует выполнить с помощью терминала следующую команду:

sudo touch /etc/systemd/system/usercommand.service

Для исполнения команды, как и раньше, следует нажать клавишу Enter.

G. Для редактирования созданного юнит-файла следует использовать следующую команду:

xed admin:///etc/systemd/system/usercommand.service

Для исполнения команды следует нажать клавишу Enter.

H. Теперь следует скопировать и вставить приведенный ниже текст в окно текстового редактора:

[Unit]
Description=User command service
After=network.target

[Service]
ExecStart=/opt/usercommand.sh

[Install]
WantedBy=multi-user.target

После этого следует сохранить изменения в файле и закрыть окно текстового редактора.

J. Для запуска созданного юнит-файла следует воспользоваться следующей командой:

sudo systemctl start usercommand.service

Для исполнения команды следует нажать клавишу Enter.

K. Чтобы юнит-файл активировался при каждой загрузке системы, следует активировать его с помощью следующей команды:

sudo systemctl enable usercommand.service

Для исполнения команды так же следует нажать клавишу Enter.

L. Пришло время перезагрузить ваш компьютер. После загрузки системы следует подождать как минимум 20 секунд и проверить факт исполнения команды.

Да, для решения такой простой команды нужно выполнить столько неочевидных действий. Благодаря systemd наша жизнь значительно упростилась, не так ли?

Отмена изменений

Хотите отменить внесенные в систему изменения? В этом случае вам придется выполнить следующую последовательность команд:

sudo systemctl stop usercommand
sudo systemctl disable usercommand
sudo rm -v /opt/usercommand.sh
sudo rm -v /etc/systemd/system/usercommand.service

После перезагрузки система будет в первозданном виде.

Хотите ознакомиться с дополнительными советами?

Хотите узнать о других настройках и приемах работы с Linux-дистрибутивами? На данном веб-сайте размещено большое количество подобных материалов. Например, вы можете почитать о том, как безопасно очистить систему Linux Mint, повысить скорость ее работы и избежать фатальных ошибок при работе с ней.