Можем ли мы использовать временные папки, такие как временные файлы
TMP=$(mktemp ... )
exec 3<>$TMP
rm $TMP
cat <&3
который будет уничтожен автоматически после выхода из оболочки?
file-descriptors
tmpfs
Боб Джонсон
источник
источник
Ответы:
В случае временного файла ваш пример в вопросе создаст его, затем отсоединит его от каталога (заставит его «исчезнуть»), а когда скрипт закроет дескриптор файла (возможно, по завершении), пространство, занимаемое файлом будет исправимо системой. Это распространенный способ работы с временными файлами на таких языках, как C.
Насколько я знаю, невозможно открыть каталог таким же образом, по крайней мере, никоим образом, который бы сделал каталог пригодным для использования.
Распространенным способом удаления временных файлов и каталогов при завершении сценария является установка
EXIT
ловушки очистки . Приведенные ниже примеры кода позволяют избежать необходимости полностью манипулировать дескрипторами файлов.Или вы можете вызвать функцию очистки:
EXIT
Ловушка не будет выполняться после приемаKILL
сигнала (который не может быть в ловушке), что означает , что не будет никакого очистки не выполняется тогда. Однако он будет выполняться при завершении из-за сигналаINT
илиTERM
(при запуске сbash
илиksh
, в других оболочках вы можете добавить эти сигналы послеEXIT
вtrap
командной строке) или при нормальном выходе из-за прибытия в конец сценария или выполненияexit
вызов.источник
.
и..
запись. (Протестировано на Linux, я не знаю, совместимо ли это на разных платформах.)exec another-command
явно.Напишите shell-функцию, которая будет выполнена, когда ваш скрипт завершит работу. В приведенном ниже примере я называю это «очистка» и устанавливаю ловушку для выполнения на уровнях выхода, например: 0 1 2 3 6
Смотрите этот пост для получения дополнительной информации.
источник
cleanup
перед чистым выходом (0) и при получении SIGHUP (1), SIGINT (2), SIGQUIT (3) и SIGABRT (6). он не будет работатьcleanup
при выходе из сценария из-за SIGTERM, SIGSEGV, SIGKILL, SIGPIPE и т. д. Это явно недостаточно.Вы можете зайти в него, а затем удалить его, при условии, что впоследствии вы не будете пытаться использовать пути внутри него:
Я не проверял, но это, скорее всего, та же проблема при использовании openat (2) в C с каталогом, который больше не существует в файловой системе.
Если вы root и в Linux, вы можете играть как с отдельным пространством имен, так и
mount -t tmpfs tmpfs /dir
внутри него.Канонические ответы (ставить ловушку на EXIT) не работают, если ваш скрипт принудительно завершает нечистый выход (например, с помощью SIGKILL); это может привести к зависанию конфиденциальных данных.
Обновить:
Вот небольшая утилита, которая реализует подход пространства имен. Это должно быть скомпилировано с
и данные
CAP_SYS_ADMIN
возможности файла (как root) сКогда запускается (как обычный) пользователь как
он откроет пространство имен своей файловой системы, смонтирует файловую систему tmpfs
/proc/sysvipc
, вставит в нее chdir и запуститcommand
с заданными аргументами. неcommand
будет наследовать возможности.CAP_SYS_ADMIN
Эта файловая система не будет доступна из другого процесса, из которого
command
она не запущена , и она волшебным образом исчезнет (со всеми файлами, которые были созданы внутри нее), когдаcommand
и ее дочерние элементы умрут, независимо от того, как это произойдет. Обратите внимание, что это просто отключение пространства имен монтирования - нет жестких барьеров междуcommand
другими процессами, выполняемыми одним и тем же пользователем; они все еще могут проникнуть в его пространство имен либо с помощьюptrace(2)
,/proc/PID/cwd
либо другими способами.Похищение «бесполезных»
/proc/sysvipc
, конечно, глупо, но альтернативой было бы спам/tmp
с пустыми каталогами, которые пришлось бы удалить, или сильно усложнило бы эту маленькую программу с форками и ожиданиями. В качестве альтернативыdir
можно изменить, например, на./mnt/chtmp
и создать его с правами root при установке; не делайте его настраиваемым пользователем и не устанавливайте его по пути, принадлежащему пользователю, поскольку это может подвергнуть вас ловушкам символической ссылки и другим опасным вещам, на которые не стоит тратить время.chtmp.c
источник
rm $PWD
работа, оболочка еще в этом каталоге. Но никакие новые файлы не могут быть помещены в эту «папку». Только вы можете читать / писать с файлами & 3, & 4. Так что это все еще «временный файл», а не «временная папка».Вам требуется определенная оболочка?
Если Zsh вариант, пожалуйста, прочитайте
zshexpn(1)
:Например, я использую это в винтовке (часть файлового менеджера рейнджера) для расшифровки файла, а затем запускаю винтовку для временного файла, который удаляется после завершения подпроцессов. (не забудьте установить
$TERMCMD
)источник