Во-первых, вам нужно сделать /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
, они могут удалить «битые» ссылки.
/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
.
[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
для долго работающей службы -может быть не очень «идиоматичным». Когда программа запущена, состояние таких служб будет отображаться как «запуск», а не «работает».
Ни один из этих шаблонов не очень элегантен, но его довольно легко написать, и я думаю, что он должен работать нормально :-).