Как установить каталог файлов 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