Вопрос или проблема
У меня есть процесс, который работает под учетной записью без возможности входа (в данном случае сервер 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
также не решают вашу проблему.
Предложения по решению
-
Обновление переменной 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
После редактирования файла, вам необходимо будет перезагрузить систему или заново войти в систему, чтобы изменения вступили в силу.
-
Использование sudo для выполнения команд
Если ваш scрипт требует выполнения с повышенными правами, вы можете настроитьsudo
для nologin-пользователя.Для этого выполните:
sudo visudo
Добавьте следующую строку:
nologin_user ALL=(ALL) NOPASSWD: /path_to_command
После добавления правила, вы сможете выполнять команды от имени nologin-пользователя:
sudo -u nologin_user /path_to_command
-
Создание системного сервиса через 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
и создание системных услуг — это надежные подходы, которые помогут вам справиться с задачами в текущих условиях.