私は持っています
#!/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 に各行の一致するすべてのインスタンスを置き換えるよう指示します。 1行にIPアドレスが1つしかない場合、このg
フラグは必要ありません。