После вещей, становящихся более странным и более странным (см. поток комментариев в моем вопросе), я наконец понял это. Первые вещи сначала: процесс аутентификации перестал работать в 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, какой адрес отправителя не соответствует тем из их клиентов
Вы должны использовать опцию -v
в awk
:
awk -F',' -v accNum="$1" '$1 == accNum {print $3,$2}'
С $ 1
в двойных кавычках оболочка обработает все свои специальные символы (если есть ) для тебя.
У вас есть:
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
есть кавычки. Цикл оболочки, который вы выполняли, не был полезен, хотя он повторил бы вывод много раз.
Ваш скрипт уже практически работает без awk
вообще:
while IFS=, read -r num last first
do [ $((num==accountNum)) -eq 1 ] &&
printf '%s.%s\n' "$first" "$last"
done < Accounts
Я не предполагаю, что это лучшее или более эффективное решение, чем использование awk
в одиночку, но если вы хотите, чтобы во время... цикла чтения
, это, конечно, бьет отдельные awk
процессы на каждую строку. Наверное, просто для справки.
#!/bin/bash
awk -v a="$1" -F ',' '$1 == a { print $3, $2 }' Accounts
С -va = "$ 1"
мы устанавливаем переменную awk
a
в значение первого аргумента командной строки скрипта, затем указываем, что ввод разделяется запятыми -F ','
. Если первый столбец равен значению a
, распечатайте два других столбца в обратном порядке.
Вы ничего не получаете в своем выводе, когда сравниваете первый столбец с переменной awk
accountNum
, которая не установлена.
Если бы существовала запись, в первом столбце которой было 0 (ноль), эта запись была бы напечатана. Это связано с тем, что значение неустановленных переменных в awk
равно нулю.