Есть ли способ заставить systemd завершить работу системы, когда служба завершает работу с определенным кодом (например, код выхода 0)?

Во-первых, вам нужно сделать /LDдомашним каталогом test_user. Вы сказали, что у вас нет команды usermod; затем используйте вместо этого vipwили, если это тоже недоступно, просто убедитесь, что пользователь в данный момент не вошел в систему, и отредактируйте /etc/passwdнапрямую.

Затем проверьте справочную страницу vsftpd.conf и прочитайте описания параметров chroot_local_user, chroot_list_enableи chroot_list_file.

Если вы хотите, чтобы FTP-подключения всех (или большинства )пользователей были ограничены их домашними каталогами, вы можете установить для chroot_local_userзначение YES и использовать файл /etc/vsftpd.chroot_list(или любой другой указанный файл. с помощью опции chroot_list_file), чтобы указать исключения.

Если необходимо ограничить только test_user, оставьте для chroot_local_userзначение НЕТ и вместо этого установите для chroot_list_enableзначение ДА, а затем добавьте test_userк /etc/vsftpd.chroot_listфайл (или любой другой файл, указанный chroot_list_fileопция ). Вы можете создать файл, если он еще не существует.

В результате этих действий, когда test_userвходит в систему по FTP-соединению, они увидят каталог /LDкак корневой каталог(/). В результате они не смогут перемещаться за пределами дерева каталогов /LD, так как для их FTP-подключения остальная часть файловой системы просто не будет существовать. Пользователь по-прежнему может иметь доступ к любым подкаталогам -каталога /LD; если это нежелательно, используйте разрешения файловой системы, чтобы заблокировать это.


Сначала определите пользователя (с )и/или группу (с ), которым требуется доступ к подкаталогам -каталога /LD. В идеале все пользователи подкаталогов -каталога /LD должны принадлежать к одной группе (, назовем ее LDsub), а test_userне должны входить в эту группу. test_userдолжен быть один в другой группе (назовем ее LDftpнапример ). Члены группы LDsubмогут быть или не быть членами группы LDftp, в зависимости от того, нужен ли им доступ на запись к самому каталогу /LD.

Если у вас нет команд usermodили groupmod, вы можете изменить членство в группах с помощью vigrили просто отредактировав /etc/group.

Теперь вы можете использовать команду chown, чтобы установить владельца каталога /LDи chmod, чтобы установить разрешения:

chown root:LDftp /LD
chmod 775 /LD        #this will be drwxrwxr-x 

Теперь test_userбудет иметь доступ на запись в каталог /LDчерез членство в группе, но они не будут владельцем каталога, поэтому они не могут изменять его разрешения. Разрешения «все r -x» позволят членам группы LDsubпроходить через этот каталог для доступа к его подкаталогам -в соответствии с их разрешениями.

Подкаталоги /LD могут принадлежать кому угодно, если только это не test_user. Группа этих подкаталогов -должна быть установлена ​​​​на LDsubи разрешения следующим образом:

chgrp LDsub /LD/subdirectory  # or chown :LDsub /LD/subdirectory
chmod 770 /LD/subdirectory   # this will be drwxrwx---

Имейте в виду, что если test_userимеет доступ на запись к /LD, это обязательно означает, что они могут переименовывать любые подкаталоги -, создавать новые и удалять любые пустые подкаталоги -.

Если ваши требования более сложны, может быть проще убедиться, что поддержка ACL включена в файловой системе, и использовать ACL для указания пользователя (s )и/или группы (s )разрешен доступ к подкаталогам -каталога /LD. См. справочные страницы команд getfaclи setfaclи/или эту веб-страницу для получения подробной информации.


В качестве альтернативы вы можете рассмотреть возможность перемещения подкаталогов -каталога /LDв другое место и использования символических ссылок, чтобы пути к каталогам работали как раньше.

mv /LD/subdirectory /elsewhere/subdirectory
ln -s /elsewhere/subdirectory /LD/subdirectory

Для любого пользователя, кроме test_userв сеансе FTP, эти символические ссылки будут использоваться как обычно. Но поскольку FTP-сессия test_userбудет привязана к /LD, для них эти символические ссылки будут отображаться как непригодные неработающие ссылки. Если test_userимеет доступ на запись к /LD, они могут удалить «битые» ссылки.

3
13.03.2020, 08:38
2 ответа

/etc/systemd/system/my_unit.service:

[Unit]
...
...

[Service]
Type=oneshot
ExecStart=/usr/bin/your_program
ExecStartPost=/usr/bin/systemctl poweroff
RestartSec=5
Restart=on-failure

[Install]
...
...

Все просто. Другие интересные параметры см. в man systemd.serviceи man systemd.unit.

3
28.04.2021, 23:20
[Unit]
...

[Service]
Type=exec  # or any other type you want, apart from "oneshot"
ExecStart=/usr/bin/your_program
ExecStopPost=/bin/sh -c \
        'if [ "$SERVICE_RESULT" = "success" ]; then systemctl poweroff; fi'
RestartSec=5
Restart=on-failure

Если ваш сервис написан с использованием Type=oneshot, вместо этого вам понадобится шаблон из ответа Oxyd . Использование Type=oneshotдля долго работающей службы -может быть не очень «идиоматичным». Когда программа запущена, состояние таких служб будет отображаться как «запуск», а не «работает».

Ни один из этих шаблонов не очень элегантен, но его довольно легко написать, и я думаю, что он должен работать нормально :-).

3
28.04.2021, 23:20

Теги

Похожие вопросы