Я пишу обычное скомпилированное приложение, которое должно создать специальный файл и записать в него волшебный файл cookie. Я не могу записать файл напрямую из приложения, модель безопасности системы требует от меня запуска вспомогательного инструмента с повышенными привилегиями, чтобы сделать свое дело. Я могу предоставить любое количество аргументов вспомогательному инструменту. Теперь я хотел бы выбрать очень простую системную команду, которая будет служить вспомогательным инструментом, и создать файл для меня. Что-то вроде этого:
/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"
Simple touch
не обрезает его, так как мне нужно записать cookie в файл, simple echo
без оболочки не работает, так как для записи файла требуется перенаправление. Мне неудобно вызывать оболочку с правами root для выполнения такой тривиальной задачи. Есть ли какая-нибудь действительно простая системная команда с ограничениями, которую я мог бы вызвать, чтобы написать файл для меня?
/bin/sh -c 'echo magic > /path/to/magic/file'
не работает? Это будет исполняемый файл и два аргумента. Вам нужно будет построить последний аргумент в виде строки (со sprintf или эквивалентным). Есть ли причина, по которой это не сработает для вас? По твоему вопросу это звучит так, как будто doCommandAsRoot () не принимает ввод в поток в команду, правильно? В противном случае вы можете заменить последний аргумент'cat > /path/to/magic/file'
и передать данные вместо создания строки.tee
. Спасибо!Ответы:
Как насчет этого:
Конечно, в этом есть перенаправления, но только тройник работает как root, а не как оболочка. Работает с
dd of=...
тоже.источник
doCommandAsRoot
). И эта функция принимает только путь к команде и ее аргументам, поэтому я не могу сразу использовать перенаправление вывода. Я мог бы пройти через оболочку (как показано в вопросе), но мне это не нравится в плане безопасности.doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file")
.dd
Пример довольно близко к тому, что я хочу, спасибо. Не могли бы вы придумать что-нибудь еще проще?cp
илиmv
вместоdd
.Без перенаправления вывода, без канала, но с «здесь строкой»:
источник
status=none
будет подавлять все остальные выходные данные из современных версий GNU coreutilsdd
.Есть еще одно соображение, которое заключается в том, что вы не хотите помещать значение волшебного куки-файла в командную строку, так как это могут наблюдать другие пользователи. Даже если программа недолговечна (в том числе, если программа обнуляет строку командной строки), существует возможность для атаки. Итак, теоретический:
это опасный подход. Поэтому я поддерживаю предложение @ stribika: записать значение во временный файл и скопировать его на место. Убедитесь, что вы используете безопасную функцию для создания временного файла (
mkstemp()
), чтобы не было и условия гонки.источник
Губка из moreutils - впитать стандартный ввод и записать в файл:
В отличие от перенаправления оболочки, губка впитывает весь свой ввод перед записью выходного файла. По возможности sponge создает или обновляет выходной файл атомарно, переименовывая временный файл на место.
Увидеть больше
источник