これは予想通り正確に機能します。
echo -n 80 443 | xargs -d ' ' -I% bash -c 'socat TCP4-LISTEN:%,fork TCP4:123.123.123.123:% &'
しかし、このバージョンではありません。 $ip変数を渡すことができないため、IPは0.0.0.0になります。
ip=$(cat ip.txt)
echo -n 80 443 | xargs -d ' ' -I% bash -c 'socat TCP4-LISTEN:%,fork TCP4:$ip:% &'
期待どおりに機能させるにはどうすればよいですか?
答え1
変数が一重引用符で囲まれているため、機能しません。シェルは一重引用符で変数を拡張しません。 socatが間違ったIPを見つけた場合は、0.0.0.0を使用しているようです。
ポートとIPをコマンドライン引数としてbashサブジェクトに渡します。
ip=$(< ip.txt) # this is a bash builtin equivalent to $(cat ip.txt)
printf '%s\n' 80 443 | xargs -I% bash -c 'socat "TCP4-LISTEN:$1,fork" "TCP4:$2:$1" &' bash % "$ip"
2番目の「bash」には$ 0が割り当てられます。