Как установить каталог файлов temp для команды sed в Linux?

У меня есть bash script, который изменил файл, подобный этому

sed -i "/hello world/d" /etc/postfix/virtual

и я запускал этот script из веб-приложения. Команда sed создает временный файл в этом каталоге, но пользователь, под которым работает веб-приложение, не имеет прав на создание файлов в этом каталоге. Я не хочу предоставлять больше прав для пользователя в эту папку. Можно ли указать местоположение временного файла для команды sed?

Я новичок в Linux, поэтому извините, если мой вопрос слишком прост, но я не нашел никакого решения.

Спасибо!

Ответ 1

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

При работе с такой ситуацией мы просто делаем этот процесс вручную.

## TEMP File
TFILE=`mktemp --tmpdir tfile.XXXXX`
trap "rm -f $TFILE" 0 1 2 3 15

##
sed 's_XXX_YYY_' /etc/example > "$TFILE"
cat "$TFILE" > /etc/example

## trap Deletes TFILE on Exit

Ответ 2

Вы всегда можете избежать встроенного редактирования:

sed "/hello world/d" /etc/postfix/virtual > /tmp/_foo

# mv /tmp/_foo /etc/postfix/virtual

Но позвольте мне предупредить, что редактирование веб-пользователей /etc/postfix/virtual довольно рискованное.

Ответ 3

AFAIK, вы не можете настроить sed для этого. Итак, вы должны запустить свою команду с необходимыми привилегиями.

  • создайте script named, например update-postfix (он может иметь аргументы), и поместите в /usr/local/bin

    #!/bin/bash
    sed -i "/$1/d" /etc/postfix/virtual
    
  • Создайте файл в/etc/sudoers.d/(независимо от его имени, оно может быть обновлением-постфиксным или чем-то более общим), заменив _user _ тем, кто вызывает ваш script:

    _user_ ALL = (root) NOPASSWD: /usr/local/bin/update-postfix
    

    Он позволяет _user _ запускать update-postfix (и ony эту команду) как root

  • В script вызовите sudo update-postfix helloworld вместо команды sed. Обновление-постфикс script вызывается как пользователь root.

NB: вызывается как таковой, ваш script (update-postfix) имеет право делать что-либо, поэтому будьте осторожны, что вы вложили, и дезинформируйте аргументы (что я не делал здесь для краткости).

Ответ 4

Простое решение для пользовательских временных файлов, похожее на решение от @techzilla для тех, кто не хочет использовать ловушку -

sed  "/hello world/d" /etc/postfix/virtual > /tmp/temp_postfix_update && cat /tmp/temp_postfix_update > /etc/postfix/virtual && rm -f /tmp/temp_postfix_update

В соответствии с тем, что @EdwinW сказал, прокладка ввода с помощью cat не удаляет файл, чтобы разрешения на запись в файле сохранялись.

Ответ 5

Вы можете использовать "губку".

sed  "/hello world/d" /etc/postfix/virtual |sponge /etc/postfix/virtual