Как объединить элементы массива в POSIX, разделенные пробелом?

Вышеупомянутая конфигурация iptables позволяет только пакетам TCP и UDP проходить через брандмауэр (если они не пришли из обратной петли). Правило по умолчанию для цепочки INPUT установлено на DROP, что означает, что каждый пакет, который явно не ПРИНЯТ, будет отброшен. Не должно быть странных пакетов из-за петли, поэтому разрешены только пакеты TCP / UDP.

Есть одна важная вещь о протоколах, которую следует прояснить: сетевое взаимодействие происходит на многих (фактически семи) уровнях ] и каждый уровень имеет свой собственный набор протоколов. Например, существуют фундаментальные различия между назначением протоколов транспортного уровня (таких как TCP и UDP) и протоколов прикладного уровня (например, SMB). Объем iptables ограничен транспортным уровнем и ниже. Анализ пакетов для их протоколов прикладного уровня требует глубокой проверки пакетов и требует гораздо больших вычислительных затрат.

Также следует проявлять осторожность, чтобы не путать протоколы и имена служб. Популярные службы были назначены определенным портам . Службы FTP обычно доступны на порту 21, в то время как веб-сервер будет прослушивать порт 80. Это подразумевает , что используемый протокол обычно будет FTP для трафика на порту 21 и HTTP на порту 80. Однако трафик на любом таком порте никоим образом не требуется использовать протокол, связанный с этой службой. Трафик на 80-м порту с таким же успехом может быть SSH или полным бредом.

1
19.04.2018, 19:50
2 ответа

В оболочке POSIX shу вас есть ровно один массив:$@(массив позиционных параметров, то есть $1, $2,... ). Вы устанавливаете его значения с помощьюset:

set -- curl git htop mc tree vim

или из командной строки:

./myscript.sh curl git htop mc tree vim

Затем,

apt --yes install "$@"

Заключение раскрытия $@приводит к тому, что массив расширяется до элементов в кавычках . То есть, если массив $@содержит a wordи another word, "$@"будет расширен до этих двух строк . Отсутствие кавычек $@приведет к расширению до четырех строк a, word, anotherи word. Поведение без кавычек зависит от содержимого $IFS.

Обратите внимание, что в bashвы также хотели бы заключить в двойные кавычки расширение ${PACKAGES[@]}:

apt --yes install "${PACKAGES[@]}"

Связанные:Массивы в Unix Bourne Shell


Вы не на самом деле "соединяете элементы пробелами" здесь. Да, если вы echoзначения, вы получите пробелы между ними, но это разница между

set -- a b c d
printf '>%s<\n' "$@"

, что дает

>a<
>b<
>c<
>d<

(четыре отдельных аргумента, как вам и нужно)

и

printf '>%s<' "$*"

, что дает

>a b c d<

(один единственный аргумент с элементами , соединенными пробелами(первый символ $IFS), что на самом деле не то, что вы хотите использовать с вашей командой apt install)

7
27.01.2020, 23:12

Поскольку у вас есть имена пакетов, вы можете просто сохранить их в простой строковой переменной, если хотите использовать стандартную оболочку. Как минимум в соответствии с руководствами Debian , имена пакетов могут содержать только символы -+.:~a-z0-9A-Z, ни один из которых не является символом подстановки или пробелом.

Так что все должно быть в порядке:

#!/bin/sh
packages="curl git htop..."
IFS=" "                           # make sure there's nothing weird here
apt --yes install $packages       # no quotes!

Если вы параноик, добавьте set -fв начало, чтобы отключить подстановку имени файла. Это оставило бы только пробелы как проблему, но я не думаю, что какая-либо разумная система допустила бы пробелы в именах пакетов.

0
27.01.2020, 23:12

Теги

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