sed заменить действительно длинным содержимым файла

У меня была точно такая же проблема с Raspberry Pi 3B+ за Fritz!Box 7581, поэтому мое решение может подойти и вам.

  1. Отредактируйте /etc/dhcpcd.confна RPi и замените slaac private на slaac hwaddr .

  2. Несмотря на то, что IPv6 полностью включен в RPi, в последней версии Raspbian Stretch он может быть заблокирован в /etc/modprobe.d/ipv6.conf. Удаление этого файла или комментирование его содержимого устраняет эту блокировку.

  3. Заставьте FB7581забыть о «старом» RPi, выключив его, подождав, пока он не появится в списке незанятых соединений, а затем удалив его.

  4. После (повторной )загрузки RPi в разделе «Разрешить доступ» должно быть возможно открыть его для Ping6, OpenVPN и т. д. У меня это сработало.

0
27.04.2020, 18:23
1 ответ

Начиная с версии 1.9 HAProxy поддерживает ведение журнала в stdoutи stderr.

Имея это в виду, передать его в файл довольно просто.

# change haproxy.cfg file with the following
global
    log stdout local0 debug

defaults
    log global
    option httplog

Затем вы можете просто запустить HAProxy вот так:

haproxy -f haproxy.cfg > haproxy.log 2>&1 &

Как вы, наверное, знаете, >передает stdoutв файл haproxy.log, а затем 2>&1передает stderrв тот же файл. Он заканчивается на &, что переводит процесс в фоновый режим.

Вы можете проявить изобретательность и попробовать настроить скрипт для уничтожения предыдущего экземпляра haproxy, выполнив что-то вроде этого:

#!/bin/bash
# mini launcher
kill -9 `cat /home/user/haproxy.pid`
/home/user/haproxy -f /home/haproxy.cfg > /home/user/haproxy.log 2>&1 &
echo $! > /home/user/haproxy.pid

Жестко, как вы, наверное, понимаете... не рекомендуется.

Изменить :Запись в файлы раньше была блокирующим событием и поэтому не рекомендуется, особенно для чего-то вроде HAProxy. Команда HAProxy ясно дала понять в сообщении о выпуске, указанном выше, что это уже не так .

We’ve received this request quite a bit and have spent some time planning the best way to implement it—without blocking—and we’re pleased to announce that we’ve found a solution!

-121 ---299154 ​​-

Вместо вставки шестнадцатеричного дампа в строку замены sпопробуйте прочитать как файл:

{ printf '    %s' 'var wasm = "'; hexdump -v -e '1/1 "%02X"' camaro.wasm; } |

sed -e '/var wasm = ".*";/ {' -e 'r /dev/stdin' -e 'a\";' -e 'd;}' camaro.js

выход:

var camaro = (function() {
    "use strict";

    var wasm = "6C645950577A62776A57696452624E43... etc.";

})();

  • Примечание :В приведенном выше примере вся строка, соответствующая var wasm = ".*";, заменяется содержимым stdin + ";— это не универсальная альтернатива s/match/replacement/. Кроме того, он корректно работает только для первой совпадающей строки — все последующие совпадающие строки заменяются на ";. Попробуйте использовать awkили perl, если вам нужно решить эти проблемы.

Чтобы использовать длинную строку как часть скрипта sed,передать команды редактирования в sedкак файл сценария:

sed -f /dev/stdin camaro.js <<EOS
    s#\(var wasm = "\).*";#\1$(hexdump -v -e '1/1 "%02X"' camaro.wasm)";#
EOS
  • Потенциально длинная строка из hexdump, сгенерированная при подстановке команд, передается как строка вместе с остальной частью команды редактирования sна стандартный ввод sed; -f /dev/stdinпросит sed использовать стандартный ввод в качестве файла сценария, избегая ошибки «Слишком длинный список аргументов»
5
19.03.2021, 02:25

Теги

Похожие вопросы