LINUX.ORG.RU

Мечтаю о «динамических» файлах


0

2

Вот как я себе это представляю. Есть некий файл. Но он не обычный: при его чтении (обычном, fread, etc.) запускается программа, которая вместо содержимого файла выдаёт результат своей работы.

Примеры:

1) имеем «динамический» файл './current-date', пишем

$ cat ./current-date
2010/10/28
А в самом 'current-date' находится программа — вызов date с заданными параметрами. Но это надуманный пример, вот более полезный (связанный с моей темой про gitignore)

2) в файле .gitignore сидит программа, которая возвращает список определённых файлов (по регэкспам или иначе — не важно; алгоритм может быть сложный, glob и рядом не стоит). Но когда git читает .gitignore, он читает его как обычный файл, в котором есть список файлов.

3) ~/.signature — подпись, которая добавляется к письму. Mutt поддерживает, если этот файл будет программой, но это реализовано только внутри Mutt и Mutt работает с .signature-файлом и с .signature-программой по-разному (разные даже способы задания опции в .muttrc). Но если бы .signature был «динамическим» файлом, то в него можно засунуть какую-нибудь программу (напр. вызов fortune). И *любая* программа, которая будет читать .signature (напр. cat) выведет результат работы fortune.

И т.д. У меня уже подобная мысль несколько раз возникала по разным случаям. Сегодня возникла ещё раз, решил написать.

Можно, конечно и просто запскать команды и скрипты, но плюс вышеизложенного в том, что внешние программы читают файл по обычному,а не запускают программу.


я просто не понял автора или он в самом деле переел диссоциативов?

doctorch
()

1) имеем «динамический» файл './current-date', пишем

$ cat ./current-date 2010/10/28

А в самом 'current-date' находится программа — вызов date с заданными параметрами

в файле находится скрипт/программа, вводишь в терминале ./current-date и в терминал выводится дата

прикольно, да? или тебе непременно нужно именно читать файл?

Можно, конечно и просто запскать команды и скрипты, но плюс вышеизложенного в том, что внешние программы читают файл по обычному,а не запускают программу.

а в чём смысл? в чём профит? если тебе хочется, чтобы программа «читала», пусть читает входной поток через конвейер

doctorch
()

А вот создам я файл, который убивает текущую сессию пользователя, а ты попробуй его прочитать. Или стереть. И с чьими правами запустится этот файл?

abraziv_whiskey ★★★★★
()

Ты мечтаешь не один. В принципе, такое можно сделать на fuse или 9p. И нельзя (хотя хочется) на fifo+incrond.

x3al ★★★★★
()
Ответ на: комментарий от abraziv_whiskey

Естественно с теми же правами, как если бы она запускалась как обычная программа.

toady2
() автор топика
Ответ на: комментарий от abraziv_whiskey

>А вот создам я файл, который убивает текущую сессию пользователя, а ты попробуй его прочитать. Или стереть.
А кто сказал, что он исполнится, если находится вне некоторой ФС (примонтированной в личном неймспейсе пользователя (http://linux.die.net/man/8/pam_namespace))?

И с чьими правами запустится этот файл?

Очевидно, с правами читающего.

x3al ★★★★★
()
Ответ на: комментарий от doctorch

Вы не поняли сути. Внешняя программа, которая читает файл foo, не знает, что этот файл «динамический». Она работает с ним, как с обычным файлом. Не всегда тот файл можно подать через конвеер.

См. примеры 2 и 3. Вот предположим, что Mutt не поддерживал бы .signature-программу. А просто тупо копировал его содержимое в конец письма. Как тогда засунуть в подпись случайную фортунку? А вот с «динамическими» файлами было бы просто.

Или .gitignore. Там *уже* git не поддерживает .gitignore-программы. Гит тупо читает .gitignore как обычный файл.

toady2
() автор топика

привет, rm -rf ~/
как минимум
и да - накладно ту же дату каждый раз генерить - гораздо легче один раз сгенерить и положить в файл - тупо меньше жрать ресы будет система!
если только «избранные» файлы такими слабать...хотя - тогда где страховка от rm?
короче - имхо конечно, но ересь!

megabaks ★★★★
()

Нашёл с чем сравнить можно: /proc

$ cat /proc/meminfo

Мечтаю о таком же, но не только в /proc, а в любом месте.

toady2
() автор топика
Ответ на: комментарий от toady2

а, теперь ясно

в принципе, это нетрудно осуществить технически, можешь начинать

doctorch
()

оффтоп жеж:

Here's how to create a log file in Notepad [works in Windows]

1. Click Start, point to Programs, point to Accessories, and then click Notepad.

2. Type .LOG on the first line, and then press ENTER to move to the next line.

3. On the File menu, click Save As, type a descriptive name for your file in the File name box, and then click OK.

When you next open the file, note that the date and time have been appended to the end of the log, immediately preceding the place where new text can be added. You can use this functionality to automatically add the current date and time to each log entry.

UserUnknown ★★★★★
()
Ответ на: комментарий от Legioner

>А как посмотреть сам код исполняемого файла?

И как его написать? Вдруг вим или нано тоже запустят программу в файле?

vurdalak ★★★★★
()

P.S. В мечтаемой системе с мечтаемой ФС вообще многие программы могли бы сбросить с плеч много кода. Тому же git не надо искать файлы по glob'ам из .gitignore, он просто читает список файлов из .gitignore (а там: от банального «ls *.c» до сложных манипуляций с регекспами). Mutt'у не надо парится с сигнатурой, он просто копирует файл .signature в файл письма. И т. д.

Вообще можно будет забыть о всяких ./prog.sh! Всё будет сводится к обычному чтению файлов, а уже содержимое файлов динамически генерируется при каждом чтении (а может быть и статическим). Нужен файл со случайными числами объёмом 1GB? Зачем мне тратить пространство ФС? Ведь я могу создать крошечный «динамический» файл, который при чтении выдаёт гиг случайных чисел. И т. д. Много места для фантазии!

toady2
() автор топика
Ответ на: комментарий от Legioner

Должны быть специальные механизмы ФС для этого.

toady2
() автор топика
Ответ на: комментарий от toady2

>Ведь я могу создать крошечный «динамический» файл, который при чтении выдаёт гиг случайных чисел


Поздравляю, ты только что изобрел /dev/urandom

redgremlin ★★★★★
()
Ответ на: комментарий от toady2

>Нужен файл со случайными числами объёмом 1GB? Зачем мне тратить пространство ФС? Ведь я могу создать крошечный «динамический» файл, который при чтении выдаёт гиг случайных чисел.

Т.е. пользователь, который нашел этот файл в своей системе, но не помнит, что в нем и решил посмотреть cat'ом, будет ждать 100500 минут генерацию гигабайта случайных данных? OMG...

vurdalak ★★★★★
()
Ответ на: комментарий от redgremlin

Ну вот опять :( Рандомные числа (и всё другое) — лишь пример.

Только я вижу лес, а не деревья?

toady2
() автор топика
Ответ на: комментарий от toady2

лучше уж сделать слой ExeFS (например) в виде отдельного каталога, чтение файлов из которого автоматом исполняет их

а делать такое повсеместно в системе не нужно - бардак будет и путаница

doctorch
()
Ответ на: комментарий от vurdalak

Т.е. пользователь, который нашел /dev/urandom в своей системе, но не помнит, что в нем и решил посмотреть cat'ом, будет ждать * минут генерацию гигабайта случайных данных? OMG...

toady2
() автор топика
Ответ на: комментарий от doctorch

при таком механизме будет очень легко разграничить права на исполнение, кстати

doctorch
()
Ответ на: комментарий от vurdalak

Сделать возможность документации. Например делаешь echo help > file, а он выдает какое-то описание.

creepnee
()
Ответ на: комментарий от toady2

Ответ прост - вы пытаетесь лишить пользователя возможности прочитать исходник программы в файле, подменяя операцию чтения выполнением самой программы.

vurdalak ★★★★★
()
Ответ на: комментарий от toady2

>«о таком же» я имел в виду не в буквальном смысле

why not?

пишешь модуль ведра, в нем при загрузке параметрами (или лучше через write_proc) указываешь что должно исполняться, на read_proc вешаешь исполнение указанной команды.

PROFIT

lazyklimm ★★★★★
()
Ответ на: комментарий от vurdalak

Чем плох ./file ? Давайте на каждую команду повесим еще 20 функций, а потом попробуй догадайся, что произойдет при открытии файла.

vurdalak ★★★★★
()
Ответ на: комментарий от vurdalak

Ответ на два ваших последних сообщения один: «см. выше.»

toady2
() автор топика

Ладно, забудьте. Помечтал и хватит. Вернусь к реалиям...

Спасибо за дискуссию.

toady2
() автор топика

а что, про hurd никто не вспомнил? это же там можно всяких хитрых обработчиков понавешать без всяких fuse-ов. по крайней мере, когда я последний раз про это читал, лет десять назад, hurd-овцы очень этим хвастались.

dmiceman ★★★★★
()

если я не ошибаюсь, то ты `изабрёл' Plan9

beastie ★★★★★
()

Дваждану-ка я fuse.

AnDoR ★★★★★
()

Идея интересная, на самом деле, и достаточно легко осуществима с помощью FUSE.

Legioner ★★★★★
()
Ответ на: комментарий от Dark_SavanT

>Пайпы не спасают?
Сделай пайп, в который пишут только после того, как кто-то читает.

x3al ★★★★★
()
Ответ на: комментарий от Dark_SavanT

См. выше.

Если не трудно, пожалуйста, пишите в тему только после прочтения всех сообщений в ней. Какой смысл отвечать сто раз на одни и те же вопросы.

P.S. Хватит плюсовать за Fuse. Уже читаю.

toady2
() автор топика
Ответ на: комментарий от x3al

Ты мечтаешь не один. В принципе, такое можно сделать на fuse или 9p. И нельзя (хотя хочется) на fifo+incrond.

+ translators , где, имхо это кошернее, но не linux

anonymous
()

В командную строку пишем

mkfifo fifo;
while true; do echo `date` > fifo; done &

пример использования:

$ cat fifo
Thu Oct 28 23:18:23

annoynimous ★★★★★
()

А зачем исполняемые файлы придумали?

derlafff ★★★★★
()

Автор, завязывай с тяжелыми веществами. Курни лучше плану-9.

Macil ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.