sh script para substituir o endereço IP de um arquivo por um armazenado em um arquivo de texto

0

Eu tenho

#!/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

a saída é 100.70.62.33

Agora quero alterar todos os endereços 100.70.x.x do arquivo1 com um armazenado no arquivo ip.txt

O que eu quero alcançar:

Eu tenho um script sh que está chamando algumas regras iptables (este é o arquivo onde eu quero modificar o IP 100.70.x.x)

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 é o script que eu estava falando no primeiro post:

#!/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

Quando eu chamo master.sh, tenho a seguinte saída.

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

ouvindo em qualquer tipo de link LINUX_SLL (Linux cozido), tamanho de captura 262144 bytes     1 pacote capturado     2 pacotes recebidos pelo filtro     0 pacotes descartados pelo kernel     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

Como você vê, o endereço 100.70.x.x é excluído somente

    
por Boris 23.10.2018 / 16:30

2 respostas

0
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) nesta variável eu armazeno a saída de um sub-shell

-v s="$s" here -v recebe uma variável de shell local e global. neste caso e local.

gsub significa substituição global. Substitui todas as ocorrências

/100.70.[0-9].{1,3}.[0-9]/ aki a expressão regular para corresponder a todo o ip 100.70. *

, s esta variável tem o valor do nosso sub-shell que foi criado no início e o leva pela -v flag de awk , que naquele momento irá imprimir seu valor.

1 é visto como verdadeiro e, portanto, é equivalente a imprimir.

Espero que ajude você

    
por 24.10.2018 / 19:37
0

Se você não se importa em ficar um pouco solto na expressão regular do endereço IP, você pode usar sed :

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

ou, com um sed que suporte -i :

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

A expressão regular para corresponder aos endereços "100.70.xx" corresponderá aos endereços IP válidos e inválidos, como: 100.70.900.678 , pois o [0-9]\{1,3\} simplesmente diz para corresponder entre um e três dígitos.

O texto de substituição é feito entre aspas duplas por meio de uma substituição de comando especial ( $(< filename) ) que simplesmente lê o conteúdo do arquivo ip.txt .

O sinalizador g informa ao sed para substituir cada instância correspondente em cada linha. Se você tiver apenas um endereço IP por linha, não há necessidade do sinal g .

    
por 23.10.2018 / 18:40