각 줄 읽기 - BASH

각 줄 읽기 - BASH

내 목표는 각 리프 라인(실제로는 각 규칙)을 배열에 저장하는 것입니다. 내 결과:

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     udp  --  109.224.241.0/24     0.0.0.0/0            udp dpt:5060
2    ACCEPT     udp  --  109.224.241.0/24     0.0.0.0/0            udp dpt:4569
3    ACCEPT     udp  --  217.14.138.0/24      0.0.0.0/0            udp dpt:5060
4    ACCEPT     udp  --  217.14.138.0/24      0.0.0.0/0            udp dpt:4569
5    ACCEPT     udp  --  172.30.33.0/24       0.0.0.0/0            udp dpt:5060
6    ACCEPT     udp  --  172.30.33.0/24       0.0.0.0/0            udp dpt:4569
7    ACCEPT     udp  --  212.11.91.0/24       0.0.0.0/0            udp dpt:5060
8    ACCEPT     udp  --  212.11.91.0/24       0.0.0.0/0            udp dpt:4569
9    ACCEPT     udp  --  212.11.64.0/19       0.0.0.0/0            udp dpt:5060
10   ACCEPT     udp  --  212.11.64.0/19       0.0.0.0/0            udp dpt:4569
11   ACCEPT     udp  --  77.240.48.0/20       0.0.0.0/0            udp dpt:5060
12   ACCEPT     udp  --  77.240.48.0/20       0.0.0.0/0            udp dpt:4569
13   LOG        udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:4569 LOG flags 0 level 4 prefix "AsteriskHack:"
14   DROP       udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:4569
15   LOG        udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:5060 LOG flags 0 level 4 prefix "AsteriskHack:"
16   DROP       udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:5060

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

그래요아니요규칙 수를 제한하고 싶습니다. 각 체인에는 여러 가지 규칙이 있습니다.

코드를 실행한 후:

while IFS='' read line -r || [[ -n "$line" ]]; do
     array+=($line)
done < <(iptables -L --line-numbers)

에코하면 ${array[@]}출력이 끔찍한 텍스트 줄이므로 각 줄을 구분하고 싶습니다. 실제로 내 배열의 내용은 실수가 아닌 수의 iptables 규칙으로 구성됩니다( echo 이후 ${!array[@]}).

조건부로 리프 행에 정의된 구분 기호(새 줄)를 지정하는 방법을 모르겠습니다. 구분 기호가 올바른지 잘 모르겠습니다.

답장을 보내주셔서 감사합니다, M님

답변1

그게 내가하는 일이야. 먼저, 단순화를 위해 각 체인을 개별적으로 나열하겠습니다. 규칙이 어느 체인에 속하는지 알고 싶다고 가정하겠습니다.

$ iptables -L INPUT --line-numbers

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     udp  --  109.224.241.0/24     0.0.0.0/0            udp dpt:5060
2    ACCEPT     udp  --  109.224.241.0/24     0.0.0.0/0            udp dpt:4569
3    ACCEPT     udp  --  217.14.138.0/24      0.0.0.0/0            udp dpt:5060
4    ACCEPT     udp  --  217.14.138.0/24      0.0.0.0/0            udp dpt:4569
5    ACCEPT     udp  --  172.30.33.0/24       0.0.0.0/0            udp dpt:5060
6    ACCEPT     udp  --  172.30.33.0/24       0.0.0.0/0            udp dpt:4569
7    ACCEPT     udp  --  212.11.91.0/24       0.0.0.0/0            udp dpt:5060
8    ACCEPT     udp  --  212.11.91.0/24       0.0.0.0/0            udp dpt:4569
9    ACCEPT     udp  --  212.11.64.0/19       0.0.0.0/0            udp dpt:5060
10   ACCEPT     udp  --  212.11.64.0/19       0.0.0.0/0            udp dpt:4569
11   ACCEPT     udp  --  77.240.48.0/20       0.0.0.0/0            udp dpt:5060
12   ACCEPT     udp  --  77.240.48.0/20       0.0.0.0/0            udp dpt:4569
13   LOG        udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:4569 LOG flags 0 level 4 prefix "AsteriskHack:"
14   DROP       udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:4569
15   LOG        udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:5060 LOG flags 0 level 4 prefix "AsteriskHack:"
16   DROP       udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:5060

다음과 같은 체인 이름 목록을 얻을 수 있습니다.

CHAINS="$(iptables -L | awk '/Chain /{print $2}')"

이제 몇 가지 트릭을 사용하여 간단히 배열에 넣어 보겠습니다.

# We can just define the array from the contents of our command
# output, using \r or \n as a field separator.
# We use grep to ignore lines that don't start with a number.
IFS=$'\r\n' GLOBIGNORE='*' command eval 'INPUT_RULES=($(iptables -L INPUT --line-numbers | grep '^[0-9]'))'

Bash 4의 경우 다음을 사용할 수도 있습니다.mapfile내장:

IFS=$'\r\n' mapfile INPUT_RULES < <(iptables -L INPUT --line-numbers | grep '^[0-9]')

이제 구체적인 사용 사례는 모르지만 각 체인을 한 번에 쿼리하는 경우 행 번호를 제거하거나 연관 배열의 키로 사용할 수도 있지만 포함하는 것이 좋을 수도 있습니다.

that 을 사용하고 싶지 않지만 grep여전히 배열에서 처음 두 행을 제외하려는 경우 다음과 같이 사실 뒤의 처음 두 요소를 설정 해제할 수 있습니다.

array=("${array[@]:2}")

또한 원래 예에서 다음 사항에 유의하십시오.

echo "${array[@]}"

별도의 배열 키에 있는지 여부에 관계없이 모든 것을 한 줄에 배치합니다. 행당 정확히 하나의 요소가 있는 배열을 보는 더 좋은 방법은 다음과 같습니다.

for rule in "${array[@]}"; do echo LINE: "$rule"; done

관련 정보