Я любил использовать выставление счета zoho.com, и я абсолютно ЛЮБЛЮ Урожай за отслеживание времени. Я не уверен приложения zoho, все говорят друг с другом, но это стоит исследовать.
Если эмиттер действительно хочет отдать файл, вы можете использовать двоичный код SUID, который перемещает файл в каталог, доступный для записи всем и имеющий липкий бит (например, / tmp
), затем переходит к новому владельцу. chown (3)
уже позаботится об удалении битов set-user-ID
и set-group-ID
за вас. Таким образом, новый владелец может делать с файлом все, что он хочет, в том числе перемещать его.
Этот каталог, доступный для записи всем, может принадлежать домашнему каталогу пользователя, на случай, если вы хотите использовать несколько файловых систем для домашних каталогов и хотите убедиться, что вы не пересекаете границы файловой системы, поскольку производительность сразу же будет ужасной. В этом случае вы, вероятно, захотите убедиться, что получатель знает, когда предлагается новый файл.
Электронная почта поможет. Еще одним решением для Unixy было бы / etc / profile
, в котором перечислены ваши недавно доставленные файлы. Дополнительный бонус, если вы предлагаете эту функцию с pam_echo
( например, с file = / tmp / delivery /% u
, см. pam_echo (8)
]). Как и во всем, что связано с PAM, вам нужно сначала проверить, все ли ваши реализации предлагают такой модуль.
Вы можете использовать систему с общим каталогом (возможно, без разрешения на выполнение), где вещи для данного пользователя архивируются с определенной структурой имени файла ( to- $ username_from - $ username.tar
, например). Give создает файл и передает
его целевому пользователю; take извлекает файл и удаляет его.
Если вы хотите сделать это как фактическое перемещение (IE, изменение местоположения файла и разрешений; без копирования из-за гигантского размера файла), вам может сойти с рук переход на общий каталог с -x perms (чтобы никто не мог перечислить там файлы) и тот же метод chown
. mv
, chown
/ mv
.
Как говорит xryl669, вы можете использовать каталог для фактического совместного использования файлов. Это должно выглядеть так:
$ ls -ld shared
drwxrws--- 2 root usergroup 4096 somedate shared
$ ls -l shared
drwx-wx--- 2 user1 usergroup 4096 somedate user1
drwx-wx--- 2 user2 usergroup 4096 somedate user2
drwx-wx--- 2 user3 usergroup 4096 somedate user3
drwx-wx--- 2 user4 usergroup 4096 somedate user4
Команда give становится
#!/bin/sh
#Use a random suffix to prevent guessing
RANDOM=$(dd if=/dev/urandom count=4 2> /dev/null | sha512sum | cut -d' ' -f1)
NEWNAME=/path/to/shared/$2/$1$RANDOM
#Move the file
mv $1 $NEWNAME
#Make it readable
chmod 440 $NEWNAME
Команда take выглядит примерно так:
$ cd /path/to/shared/user
$ ls
...
$ mv somefile ~
Я бы посоветовал переписать приложение, чтобы оно действительно имитировало «отдавать» и «брать», а скорее «выталкивать» и «извлекать» его из защищенного каталога. Ваш каталог может быть доступен только для приложения push / pull, которое обрабатывает перемещение файлов. В качестве альтернативы ваше приложение / сценарий может создать случайный временный каталог с разрешениями, установленными только для отправителя и получателя.
Хотите повысить безопасность? Вы можете PGP зашифровать / подписать файл (используя открытый ключ получателя).
С точки зрения переделки его с «точки зрения безопасности и функциональности», я настоятельно рекомендую не создавать программы SUID. Если вы не откажетесь от привилегий должным образом, вы получите практически доступ к любому файлу в системе. Если ваша программа глючит (переполнение буфера и т. Д.)
Это, вероятно, бесполезно для вас, но для справки cp --reflink source target делает тонкие копии файлов с помощью копирования при записи.
Это означает, что вы можно было скопировать файл напрямую, и на самом деле будут скопированы только измененные блоки. В отличие от жесткой ссылки, новый файл имеет собственный индексный дескриптор и метаданные, что означает, что вы можете затем предоставить копию файла новому пользователю, используя стандартные материалы chown.
Насколько мне известно, эта функция доступна только на OCFS2 и btrfs в настоящее время. Я предполагаю, что это решит вашу проблему, но, поскольку доступность этого не является широко распространенной, вероятно, бесполезно.