Как безопасно использовать вывод grep в сценарии?

Я бы определенно сделал это с помощью Nginx reverse proxy.

Вы можете установить nginx на той же машине, что и ваш сервер apache, и настроить его на перенаправление запросов на вторичный сервер на основе url.

В этом примере apache был (ранее) настроен на обслуживание example.com на порту 8080, в то время как edu.example.com обслуживается на x.x.x.100:80

server { 
server_name example.com;

  # app1 reverse proxy follow
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://127.0.0.1:8080;

}

server { 
  server_name edu.example.com;

  # app2 reverse proxy settings follow
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://x.x.x.100:80;
}

Вам, вероятно, потребуется расширить пример с определениями для журналов доступа и ошибок.

Еще одно большое преимущество, которое дает такая настройка - это разгрузка SSL/TLS: вы можете заставить бэкенды apache обслуживать простой http, а nginx - https с поддержкой SSL/TLS, таким образом, у вас будут все сертификаты на одном сервере, что значительно упрощает и упрощает его обслуживание.

1
31.10.2016, 09:51
3 ответа

Не существует такой вещи, как grep --porcelain , обработка специальных символов в именах файлов всегда была в UNIX второстепенной задачей. Вы можете попробовать что-то вроде этого, но ценой эффективности:

pattern='some pattern'
for file in ./*; do
    grep -- "$pattern" "$file" | while read -r line; do
        printf 'file: %s, line: %s\n' "$file" "$line"
    done
done
1
27.01.2020, 23:47

Последние (-ish) версии GNU grep имеют параметр -Z , который делает вывод однозначным, но в основном предназначен для использования вроде grep -lZ… | xargs -0 . Он по-прежнему работает, если вы перечисляете содержимое строки, нулевой байт заменяет двоеточие, а содержимое строки по-прежнему заканчивается новой строкой¹, но оболочки не умеют работать с нулевыми байтами, поэтому вам будет сложно разобрать этот вывод .

Одно простое решение (с небольшим снижением производительности) - запускать команду grep для каждого файла отдельно.

Другое решение - использовать такой язык, как Perl или Python. Perl неплохо эмулирует grep; grep REGEX в основном представляет собой perl -ne '/ REGEXP / и print' .

Но вам это может вообще не понадобиться, если результат на самом деле неоднозначен. Например, если совпадающие строки не содержат двоеточия, тогда имя файла - это все в строке до последнего двоеточия.Если все совпадающие строки начинаются с SUCCESS или FAILURE и эти слова не появляются в именах файлов, вы можете использовать это, чтобы найти разделение и т. Д.

¹ ] За исключением случаев, когда используется -z для фильтрации записей с завершающим нулем, а не с записями с завершением новой строки, тогда NULL является как ограничителем имени файла, так и указателем конца результата; без -o вывод по-прежнему однозначный, с чередующимися записями вывода, являющимися именами файлов, и совпадающими записями в выводе.

0
27.01.2020, 23:47

Как безопасно использовать вывод grep в сценарии?

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

Shell-скрипты не имеют структур данных. Есть массивы, но это все, и не так-то просто безопасно перевести вывод в массив. (Имена файлов могут содержать новые строки.)

Лучший способ выполнить код над файлами в сценарии оболочки - это просто выполнить код над файлами - не пытаясь сохранить имена файлов для последующего использования.

Чтобы сделать это, используйте find:

find somedir -type f -exec grep -q somepattern {} \; -exec somecommand {} \;

Однако, прочитав ваш вопрос более внимательно, похоже, что вы не хотите выполнять код над вашими файлами, вы просто хотите выполнить некоторую обработку текста в определенных строках. В этом случае опция GNU Grep -z, вероятно, то, что вам нужно. Это, а также знание Sed или Awk, поможет решить ваш вопрос.


Возможно, имеет смысл изменить соглашение об именовании файлов.

0
27.01.2020, 23:47

Теги

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