나는 가지고있다
#!/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
플래그가 필요하지 않습니다.