Печать массива в файл с каждым элементом массива в новой строке в ударе

OpenVPN предоставляет ссылку. Если выполнение в бочке (рекомендовало) режим, это предоставляет ссылку для трафика IP. При выполнении в режиме касания это предоставляет ссылку для трафика Ethernet (который включает IP, но также и все виды других вещей).

Если Вы работаете в режиме касания, необходимо соединить интерфейс касания OpenVPN мостом к интерфейсу Ethernet. Можно сделать это с brctl, но, обычно, я не рекомендовал бы это, если Вам не нужны протоколы неIP для работы. Медленнее (больше служебное), и может иметь серьезные проблемы, в зависимости от задержки. [Хорошо, Вы могли рассматривать его как сегмент отдельной сети и использовать маршрутизацию IP, но затем необходимо переключиться на режим бочки.]

Когда Вы работаете в режиме бочки (который он кажется, что Вы и должны быть), необходимо получить IP, направляющий корректный. В этом случае я предполагаю, что Ваш клиент не знает что трафик к 10.82.54.11 потребностям быть направленным по VPN. Необходимо позволить клиенту знать это. Вы могли вручную настроить статический маршрут на клиенте, или выполнить протокол маршрутизации или использовать встроенную функцию OpenVPN, обеспечивает путем добавления этой строки к конфигурации сервера OpenVPN:

push "route 10.82.54.0 255.255.255.0"

push отправляет опцию удаленной стороне. Таким образом, клиент добавит опцию route 10.82.54.0 255.255.255.0 что означает добавлять статический маршрут для маршрутизации 10.82.54.0/24 через VPN.

Следующая вещь, которую необходимо сделать, состоит в том, чтобы удостовериться, что маршрутизация наоборот корректна, также. Ваш сервер 10.82.54.11 (или, более вероятно, маршрутизатор или брандмауэр, который функционирует как его шлюз по умолчанию) должен знать, что маршрут к 10.8.0.0/24 через шлюз VPN. Это могли быть Вы, только имеют один маршрутизатор/брандмауэр, таким образом, сервер находится позади брандмауэра, это - сервер VPN также, в этом случае Вы, возможно, просто должны добавить что-то вроде этого к своей конфигурации OpenVPN (если у Вас уже нет его):

route 10.8.0.0 255.255.255.0

Который должен выглядеть знакомым, и делает то же самое — только на конце сервера, не клиенте, из-за отсутствия push.

(Скорректируйте все сетевые маски как подходящие для Вашей сети. Я принял/24, но конечно можно использовать что-либо.)

[Примечание: я предполагаю, что Вы используете мультиклиентский режим OpenVPNs, не его режим точка-точка. Если Вы используете точка-точка, то IP-адреса в командах маршрута могут отличаться.]

13
20.04.2014, 11:44
4 ответа

Вы должны использовать printf вместо echo :

printf "%s\n" "${mtches[@]}"

Если mtches пуст, что по-прежнему выводит одну пустую строку. Чтобы учесть это:

{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file

В bash (а также в оболочках POSIX) вы часто используете массив позиционных параметров как «$ @» вместо ] "$ *" , если у вас нет особой причины. Это также верно в оболочках, поддерживающих обычные массивы, из man bash - section Arrays :

На любой элемент массива можно ссылаться с помощью $ {name [subscript]}. Фигурные скобки необходимы во избежание конфликтов с операторами раскрытия имени файла оболочки. Если нижний индекс - «@» или «*», слово расширяется на все элементы имени массива. Эти индексы различаются только в том случае, если слово заключено в двойные кавычки.Если слово заключено в двойные кавычки, $ {name [*]} заменяется одним словом со значением каждого члена массива , разделенным первым символом переменной IFS, и {{ 1}} $ {name [@]} заменяет каждый элемент имени отдельным словом. Когда нет членов массива, $ {name [@]} заменяется на ничего. Если раскрытие в двойных кавычках встречается внутри слова, расширение первого параметра присоединяется к начальной части исходного слова , а раскрытие последнего параметра соединяется с последней частью исходного слова . Это аналогично расширению специальных параметров '@' и '*'

. Используйте "$ {array [*]}" только тогда, когда вы хотите объединить все элементы массива в строка.

16
27.01.2020, 19:52

с использованием для :

for each in "${alpha[@]}"
do
  echo "$each"
done

Использование истории ; Примечание. Это будет не удастся, если ваши значения будут содержать ! :

history -p "${alpha[@]}"

Использование BaseName ; Примечание. Это будет не удастся, если ваши значения содержат / :

basename -a "${alpha[@]}"

с использованием Shuf ; Обратите внимание, что результаты могут не выйти по порядку:

shuf -e "${alpha[@]}"
2
27.01.2020, 19:52

Вы хотите использовать $ {mtches [*]} вместо этого.

Когда вы используете "$ {mtches [@]}" , не имеет значения, какое значение имеет $ IFS , bash разделит массив на несколько аргументов. Вам нужен единственный аргумент с каждым элементом массива, соединенным \ n . $ {mtches [*]} выполняет это.

Также в качестве временного способа установки $ IFS вы можете:

( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )

Тогда вам не нужно беспокоиться об установке его обратно.

7
27.01.2020, 19:52
for ENTRY in ${ARRAY[@]}; do
    echo $ENTRY
done > outfile

Красиво и читабельно, не нужно возиться с IFS. Это также означает, что вы можете настроить обработку каждой строки.

1
27.01.2020, 19:52

Теги

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