Записати у файл без перенаправлення?


13

Я пишу звичайну складену програму, для якої потрібно створити спеціальний файл і написати в нього чарівне печиво. Я не можу записати файл безпосередньо з програми, модель безпеки системи вимагає від мене запустити допоміжний інструмент із підвищеними привілеями, щоб виконати трюк. Я можу навести будь-яку кількість аргументів до помічника інструменту. Тепер я хотів би вибрати декілька дуже простих системних команд, які послужили б помічником і створили для мене файл. Щось на зразок цього:

/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"

Простий touchне вирізає його, як мені потрібно записати файл cookie у файл, простий echoбез обгортки оболонки не працює, оскільки для запису файлу потрібен перенаправлення. Мені не комфортно телефонувати оболонці з привілеями root, щоб виконати таке тривіальне завдання. Чи є якась дійсно проста, обмежена системна команда, яку я міг би закликати написати файл для мене?


Чи є причина, чому /bin/sh -c 'echo magic > /path/to/magic/file'це не працює? Це був би виконуваний файл і два аргументи. Вам потрібно буде побудувати останній аргумент у вигляді рядка (з sprintf або аналогом). Чи є причина, що це не працює для вас? З вашого запитання це здається, що doCommandAsRoot () не приймає вхід для передачі в команду, правильно? В іншому випадку ви можете замінити останній аргумент 'cat > /path/to/magic/file'і передавати дані замість побудови рядка.
Арседж

Приклад оболонки працює, але мені б не хотілося називати оболонку з привілеями root просто для створення простого файлу. Бібліотека приймає аргумент каналу зв'язку (це AuthorizationExecuteWithPrivileges ), який може бути використаний для запису файлів cookie tee. Спасибі!
Зуль

Дивіться також stackoverflow.com/a/18146890/2032064
Mifeet

Відповіді:


11

Як щодо цього:

echo -n 'magic' | sudo tee /some/where/file > /dev/null

Впевнені, що в цьому перенаправленнях є, але працює лише трійник, оскільки root не оболонка. Працює і з dd of=....


2
Вибачте, останнім часом я, очевидно, маю проблеми з поясненням себе. Проблема полягає в тому, що коли я хочу запустити щось із підвищеними привілеями, я повинен пройти спеціальний виклик бібліотеки (щось подібне doCommandAsRoot). І ця функція приймає лише шлях до команди та її аргументів, тому я не маю можливості використати перенаправлення виводу одразу. Я міг би пройти оболонку (як показано в запитанні), але мені це не подобається в безпеці.
Зуль

@zoul: Я думав, ти пишеш сценарій оболонки. Чи правильно написати чарівний файл cookie у файл, доступний для непривілейованих процесів? Якщо це тоді, напишіть його в такий файл і зателефонуйте doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file").
stribika

Ні, це звичайна складена програма (питання оновлено). Я просто шукаю команди «оболонки», які служать помічником, щоб мені не довелося писати це самостійно. Так, печиво нічого чутливого. ddПриклад досить близько до того, що я хочу, спасибі. Не могли б ви придумати щось ще простіше?
zoul

Звичайно - ви могли б використовувати cpабо mvзамість цього dd.
mattdm

Я маю на увазі простіше, так як без необхідності копіювати :)
zoul

9

Без перенаправлення виводу, без труби, але з "тут рядком":

dd of=/some/where/file <<<'magic'

Одним із недоліків такого підходу є те, що ДД записує деякі статистичні дані для виведення. Ви можете використовувати> / dev / null, щоб приховати їх, але в цей момент ви також можете використовувати tee.
studgeek

1
Це працювало для мене в незвичній ситуації, коли я не міг використовувати переадресацію виходу або труби. status=noneбуде придушувати всі інші виходи з сучасних версій GNU coreutils dd.
Майкл Гемптон

5

Є ще одне питання, яке полягає в тому, що ви не хочете ставити значення магічного файлу cookie в командному рядку, оскільки це можуть спостерігати інші користувачі. Навіть якщо програма недовговічна (в тому числі, якщо програма нулює рядок командного рядка), є можливість нападу. Отже, теоретичне:

writestringtofile 'magic' /some/where/file

небезпечний підхід. Тому я схвалюю пропозицію @ stribika: запишіть значення у тимчасовий файл та скопіюйте його на місце. Обов’язково використовуйте захищену функцію для створення тимчасового файлу ( mkstemp()), щоб там також не було перегонів.


Дякую, це корисна дискусія. На щастя, "чарівне печиво" не є захисним пристроєм, його може зрозуміти будь-хто.
zoul

0

губка з moreutils - намочіть стандартний ввід і запишіть у файл:

echo -n 'magic' | sponge /some/where/file

На відміну від перенаправлення оболонки, губка вбирає весь її вхід до написання вихідного файлу. Коли це можливо, губка створює або оновлює вихідний файл атомним шляхом, перейменуючи тимчасовий файл на місце.

Побачити більше

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.