Выполнение команд от имени процесса, запущенного под пользователем без входа в систему

Вопрос или проблема

У меня есть процесс, который работает под учетной записью без возможности входа (в данном случае сервер Tomcat).

Я хотел бы выполнять некоторые команды оболочки из этого процесса, но большинство из них недоступно, кроме стандартных утилит, таких как ls, date и т. д.

В моем конкретном случае я хочу использовать некоторые скрипты, которые доступны в /usr/local, и для обычных пользователей с входом достаточно просто source инициализационного скрипта в .bashrc.

source для пользователей без возможности входа, похоже, не работает, так же как и оператор ..

Я пробовал добавить необходимые строки в /etc/profile или /etc/bash.bashrc, но это тоже не работает.

Существует ли другой способ, кроме копирования бинарников в /bin?

Я сейчас использую Ubuntu 14.04.

Добавьте /usr/local в ENV_PATH в /etc/login.defs, потому что файл /etc/login.defs содержит путь по умолчанию следующим образом:

ENV_PATH        PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Возможно, вы можете запустить с повышенными привилегиями:

sudo visudo

затем…

nologin_user ALL=(ALL) NOPASSWD: /path_to_command

после входа снова:

sudo -u nologin_user /path_to_command

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

Сначала создайте файл единицы:

_unit_service_file="/etc/systemd/system/some_name_you_want.service"

sudo touch "${_unit_service_file}"

_unit_service_content=$(cat <<EOF
[Unit]
Description=Описание моей новой службы
After=network.target

[Service]
ExecStart=/path_to_command_or_script
Restart=on-failure
User=root
MaxStartups=5
TimeoutStartSec=5

[Install]
WantedBy=multi-user.target
EOF
) >/dev/null || exit 1

echo "$_unit_service_content" | sudo tee "${_unit_service_file}" >/dev/null || exit 1

После создания файла единицы вам нужно перезагрузить демон systemctl:

sudo systemctl daemon-reload

затем просто запустите вашу новую службу:

sudo systemctl start some_name_you_want.service

Надеюсь, это поможет!

Ответ или решение

Выполнение команд от процесса, работающего под пользователем с ограниченным доступом (nologin)

Когда вы работаете с сервером Tomcat под пользователем, ограниченным в доступе (nologin), возникают определенные сложности с выполнением различных команд и скриптов. Пользователи с таким режимом доступа, действительно, имеют ограниченные возможности, и это может затруднить выполнение необходимых задач.

Проблема

Вы хотите использовать скрипты, находящиеся в каталоге /usr/local, но из-за условий работы nologin-пользователя команды, такие как source и . (точка), не выполняются корректно. Установленные переменные окружения в /etc/profile или /etc/bash.bashrc также не решают вашу проблему.

Предложения по решению

  1. Обновление переменной ENV_PATH
    Вы можете добавить путь к исполняемым файлам в переменную ENV_PATH, прописанную в файле /etc/login.defs. Это обеспечит доступ к необходимым утилитам для вашего пользователя:

    sudo nano /etc/login.defs

    Добавьте или измените строку:

    ENV_PATH        PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

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

  2. Использование sudo для выполнения команд
    Если ваш scрипт требует выполнения с повышенными правами, вы можете настроить sudo для nologin-пользователя.

    Для этого выполните:

    sudo visudo

    Добавьте следующую строку:

    nologin_user ALL=(ALL) NOPASSWD: /path_to_command

    После добавления правила, вы сможете выполнять команды от имени nologin-пользователя:

    sudo -u nologin_user /path_to_command
  3. Создание системного сервиса через systemd
    Если вы хотите запускать процессы от имени пользователя nologin с достаточными привилегиями, рассмотрите возможность создания системного сервиса. Вам необходимо создать unit-файл:

    sudo nano /etc/systemd/system/your_service_name.service

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

    [Unit]
    Description=Описание вашего сервиса
    After=network.target
    
    [Service]
    ExecStart=/path_to_command_or_script
    Restart=on-failure
    User=root
    MaxStartups=5
    TimeoutStartSec=5
    
    [Install]
    WantedBy=multi-user.target

    После этого перезагрузите демона systemd:

    sudo systemctl daemon-reload

    И запустите ваш новый сервис:

    sudo systemctl start your_service_name.service

Заключение

Для пользователя с nologin возможность выполнения команд является серьезным ограничением, однако, используя предложенные методы, вы можете обойти эти ограничения и обеспечить необходимую функциональность процессов. Настройка ENV_PATH, использование sudo и создание системных услуг — это надежные подходы, которые помогут вам справиться с задачами в текущих условиях.

Оцените материал
Добавить комментарий

Капча загружается...