awk, с если операторы

После вещей, становящихся более странным и более странным (см. поток комментариев в моем вопросе), я наконец понял это. Первые вещи сначала: процесс аутентификации перестал работать в pam_access.so однако не из-за некоторой неверной конфигурации в /etc/security/access.conf поскольку это было предложено.

Для понимания, почему, мы должны посмотреть на установку этого поля в особенности: Это действует как маршрутизатор к IPv4, который идет исходно по ссылке PPP и IPv6, который является по 6in4 туннель. Также это поле действует как DNS рекурсивный сопоставитель, и здесь это становится интересным. Я действительно настраивал сопоставитель способом, который поиски реверса IPv4 разрешены, рекурсивно запустив с корневых серверов IPv4, и поиски реверса IPv6 запускаются с корневых серверов IPv6. Эта установка действительно работала, когда я сначала установил ее.

Теперь мой ISP вводит изображения и людей, которые не понимают, как усиление DNS набрасывается на работу. Короче говоря: Я знаю наверняка, что моя путаница ISP с входящими пакетами DNS наугад, т.е. некоторые вещи должна быть разрешена через их собственные сопоставители в течение некоторого времени теперь при разрешении других адресов DNS рекурсивно на собственных работах – официальная причина состоит в том, чтобы смягчить нападения усиления DNS, но они делают ее неправильно then^1.

Так как я не хотел в основном изменять свою установку, я просто бросил сопоставители DNS своего ISP в конце моего локального сопоставителя DNS как нерекурсивные вперед, поэтому если рекурсивная попытка разрешения испытывает таймаут, это пробует сопоставители моего ISP. Это работает до сих пор. Но когда я действительно настраивал это, я сделал маленькую ошибку: Я ввел сопоставители DNS ISP для работы только от хостов в моем локальном объеме, т.е. 192.168.0.0/16, но забыл о localhost, иначе мой маршрутизатор, который является хостом, в который я попробовал к SSH, для которого сопоставитель не примет сопоставители ISP во внимание.

pam_access.so делает попытку обратного поиска на адресе коллег; и это закрывает круг: Поскольку для поиска реверса IPv6 к корневым серверам IPv6 DNS получили бы доступ, пакеты пойдут, хотя 6in4 туннелируют без моего питания ISP с ними, получая ответ. Но поиск реверса IPv4 не был бы сделан по сопоставителям ISP моим собственным, которое не получит ответа и в конечном счете сообщило бы о NXHOST (или он будет работать в тайм-ауте). Так или иначе pam_access.so не будет видеть что-то, что он любит и просто говорит, что "Вы не должны передавать".

После того, как я исправил ту конфигурацию сопоставителя, все теперь работает как очарование снова. Но я действительно должен ступить на пальцы ног ISP теперь …

Относительно того, как я действительно разрешал его? Ну, путем дергания регистрирующегося многословия, сильно учащегося /var/log/everything видеть в который развернутые вещи порядка. Когда я видел, что мой сопоставитель регистрировал обратные попытки поиска, я знал то, что продолжалось.


1: с точки зрения смягчения усиления DNS это - полная ерунда, потому что я действительно тестировал, и исходящие пакеты DNS проходят очень хорошо – однако это - пакеты, которые они должны отфильтровать. На самом деле каждый ISP конечного клиента должен отбросить все пакеты UDP, какой адрес отправителя не соответствует тем из их клиентов

8
21.07.2014, 05:48
4 ответа

Вы должны использовать опцию -v в awk :

awk -F',' -v accNum="$1" '$1 == accNum {print $3,$2}'

С $ 1 в двойных кавычках оболочка обработает все свои специальные символы (если есть ) для тебя.

8
27.01.2020, 20:10

У вас есть:

accountNum=$1
awk -F',' '{ if($1==accountNum) { print $3.$2 } }' Accounts

Как переменная оболочки accountNum попадает в awk? Нет: необходимо явно указать ее значение в awk. Вы можете использовать:

awk -F',' '{ if($1=='"$accountNum"') { print $3.$2 } }' Accounts

, которая оставляет одинарные кавычки и заставляет оболочку заменить значение своей переменной в команде awk, а затем повторно ввести одинарные кавычки для остальной части командной строки.

Лучшим или, по крайней мере, более идиоматическим сценарием был бы:

#!/bin/sh
accountNum=$1
awk -F, '$1 == "'"$accountNum"'" { print $3,$2 }' Accounts

, который работает с нечисловыми номерами счетов (цитируя подставленную переменную), использует шаблонный блок вместо явного if (блок {} будет запущен, если тест перед ним истинен), и печатает пробел между именами так, как вы хотели (из-за ,). Если вы предпочитаете явно использовать if, переместите тест внутри существующего утверждения if.

В зависимости от вашей реальной цели awk может не подойти для того, что вы делаете. Вышеуказанное все равно не удастся, если в сценарии $1 есть кавычки. Цикл оболочки, который вы выполняли, не был полезен, хотя он повторил бы вывод много раз.

3
27.01.2020, 20:10

Ваш скрипт уже практически работает без awk вообще:

while IFS=, read -r num last first
    do  [ $((num==accountNum)) -eq 1 ] && 
        printf '%s.%s\n' "$first" "$last"
done < Accounts

Я не предполагаю, что это лучшее или более эффективное решение, чем использование awk в одиночку, но если вы хотите, чтобы во время... цикла чтения , это, конечно, бьет отдельные awk процессы на каждую строку. Наверное, просто для справки.

3
27.01.2020, 20:10
#!/bin/bash

awk -v a="$1" -F ',' '$1 == a { print $3, $2 }' Accounts

С -va = "$ 1" мы устанавливаем переменную awk a в значение первого аргумента командной строки скрипта, затем указываем, что ввод разделяется запятыми -F ',' . Если первый столбец равен значению a , распечатайте два других столбца в обратном порядке.

Вы ничего не получаете в своем выводе, когда сравниваете первый столбец с переменной awk accountNum , которая не установлена.

Если бы существовала запись, в первом столбце которой было 0 (ноль), эта запись была бы напечатана. Это связано с тем, что значение неустановленных переменных в awk равно нулю.

1
27.01.2020, 20:10

Теги

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