проблема с экранированием кавычек в скрипте

iptables просматривает каждое правило из таблицы до тех пор, пока не будет найдено совпадение с конечной целью, поэтому меньшее количество правил означает меньшую загрузку ЦП. Хотя некоторые правила работают быстрее, чем другие, например, правило multiport для 15 портов может быть быстрее, чем эквивалентное правило set (, как в ответе Hauke ​​Laging ).. Так что важно не только количество правил, но и их тип.

Исходный код для tcp/udp , multiport и set соответствуют некоторым эмпирическим правилам, но поскольку трудно предсказать, где все работает медленно , я бы рекомендовал протестировать возможные наборы правил iptables и посмотреть, какой из них быстрее. Например, я запускаю iperf3 со списком всего из 3 портов, и модуль tcp был немного быстрее, чем многопортовый и набор . модули, которые предлагали аналогичную пропускную способность.

Если вы все еще увлекаетесь микробенчмарками, я подсчитал количество циклов ЦП, необходимых для запускаipt_do_tableфункции ядра, с помощью этого самого,очень примитивный скрипт SystemTap :

global call_cycles = 0

probe kernel.function("ipt_do_table@net/ipv4/netfilter/ip_tables.c").call {
    call_cycles = get_cycles()
}

probe kernel.function("ipt_do_table@net/ipv4/netfilter/ip_tables.c").return {
    delta = get_cycles() - call_cycles
    printf(" <- delta = %d\n", delta)
}

Это мои результаты для пакета, проходящего через все правила на виртуальной машине под управлением Linux 4.15:

Модуль Порты Правила Прогон 1 Прогон 2 Прогон 3 Прогон 4 Прогон 5
TCP 4500 4500 973148 1032564 856528 410894 854708
многопортовый 4500 300 89370 259250 99752 225275 182256
набор 4500 1 28463 43494 28315 33589 40988

1
13.12.2019, 13:57
1 ответ

Двойные (или одинарные )кавычки используются для остановки обработки текста в них оболочкой. Вы не можете добавить их как часть самой команды.

Однако вы можете создать команду, используя массив, а затем включить эту переменную массива в результат. Здесь я использовал argsкак переменную массива, а не скалярную (строку ), так что мы можем неоднократно добавлять значения в кавычках к ее списку:

C3=yellow
FILE=file.png

args=()
args+=(-draw 'line 0,0 0,319')
args+=(-draw 'line 125,0 125,319')
args+=(-draw 'line 652,0 652,319')

или

args+=(-draw "line $x,$y1 $x,$y2")

если вы используете переменные вместо буквенных чисел. Обратите внимание, что одинарные кавычки, которые вы указали в своем обновленном вопросе, неверны (, это неправильно :args+=(-draw "'line $x,$y1 $x,$y2'"), так как вы будете включать символы одинарной кавычки в значения , которые передаются вmogrify).

Наконец, дважды -заключайте в кавычки набор значений args, чтобы каждый элемент рассматривался оболочкой как значение в кавычках:

mogrify -stroke "$C3" "${args[@]}" "$FILE"
4
27.01.2020, 23:17

Теги

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