파일의 IP 주소를 텍스트 파일에 저장된 IP 주소로 바꾸는 sh 스크립트

파일의 IP 주소를 텍스트 파일에 저장된 IP 주소로 바꾸는 sh 스크립트

나는 가지고있다

#!/bin/sh
tcpdump -c 1 -eni any host 100.80.1.252 > tcpd.txt
sleep 2
awk 'NR==1{print $9}' tcpd.txt > ip.txt
sleep 2
cat ip.txt

출력은 100.70.62.33입니다.

이제 file1의 모든 100.70.xx 주소를 ip.txt 파일에 저장된 주소로 변경하고 싶습니다.

내가 달성하고 싶은 것:

일부 iptables 규칙을 호출하는 sh 스크립트가 있습니다(100.70.xx IP를 수정하려는 파일입니다).

cat set_direct_routing_server_2.sh

#!/bin/sh
iptables -t nat -F

iptables -t nat -A PREROUTING --source 192.168.219.2 --destination 192.168.219.4/30 -j DNAT --to-destination 100.70.62.21
iptables -t nat -A PREROUTING --source 100.70.62.21 --destination 100.80.1.252 -j DNAT --to-destination 192.168.219.2
iptables -t nat -A POSTROUTING --source 100.70.62.21 -j SNAT --to-source 192.168.219.6

ipstables -t nat -L

master.sh첫 번째 게시물에서 제가 이야기한 스크립트는 다음과 같습니다.

#!/bin/sh
tcpdump -c 1 -eni any host 100.80.1.252 > tcpd.txt
sleep 2
awk 'NR==1{print $9}' tcpd.txt > ip.txt
sleep 2
cat ip.txt
sleep 2
sed -i "s/100\.70\.[0-9]\{1,3\}\.[0-9]\{1,3\}/$(<ip.txt)/g" set_direct_routing_server_2.sh
cat set_direct_routing_server_2.sh

master.sh를 호출하면 다음과 같은 결과가 나타납니다.

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

모든 링크 유형 LINUX_SLL(Linux Cooked), 캡처 크기 262144바이트 캡처 1 패킷 필터 수신 2 패킷 커널 삭제 0 패킷 100.70.62.33 #!/bin/sh iptables -t nat - F

iptables -t nat -A PREROUTING --source 192.168.219.2 --destination 192.168.219.4/30 -j DNAT --to-destination
iptables -t nat -A PREROUTING --source  --destination 100.80.1.252 -j DNAT --to-destination 192.168.219.2
iptables -t nat -A POSTROUTING --source  -j SNAT --to-source 192.168.219.6

ipstables -t nat -L

보시다시피 100.70.xx 주소만 삭제됩니다.

답변1

s=$(cat ip.txt)
awk -v s="$s"  '{gsub(/100.70.[0-9].{1,3}.[0-9]/, s)}1' file.txt

s=$(cat ip.txt) 이 변수에는 서브쉘의 출력을 저장합니다.

-v s="$s"이는 -v로컬 및 전역 쉘 변수를 받습니다. 이 경우에는 로컬입니다.

 gsub 글로벌 대안을 나타냅니다. 이는 다음 항목을 모두 대체합니다.

/100.70.[0-9].{1,3}.[0-9]/ aki 정규식은 모든 IP와 일치합니다.100.70. *

, s 이 변수는 처음에 생성한 서브셸의 값을 가지며 flags를 통해 가져오며 -v, awk이 시점에서 해당 값을 인쇄합니다.

1 true로 간주되므로 인쇄와 동일합니다.

답변2

IP 주소 정규식이 약간 느슨해도 괜찮다면 다음을 사용할 수 있습니다 sed.

sed "s/100\.70\.[0-9]\{1,3\}\.[0-9]\{1,3\}/$(<ip.txt)/g" < file1 > output

또는 sed지원을 사용하십시오 -i.

sed -i "s/100\.70\.[0-9]\{1,3\}\.[0-9]\{1,3\}/$(<ip.txt)/g" file1

"100.70.xx" 주소와 일치하는 정규식은 유효한 IP 주소뿐만 아니라 잘못된 IP 주소도 일치합니다. 예: 100.70.900.678, [0-9]\{1,3\}이는 단순히 1~3자리 숫자와 일치함을 의미합니다.

$(< filename)텍스트 교체는 파일의 내용을 읽는 특수 명령인 교체()를 사용하여 큰따옴표 안에 수행됩니다 ip.txt.

g플래그는 sed에게 각 줄의 일치하는 모든 인스턴스를 교체하라고 지시합니다. 한 줄에 IP 주소가 하나만 있는 경우에는 이 g플래그가 필요하지 않습니다.

관련 정보