这完全符合预期:
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
它不起作用,因为变量用单引号引起来。 shell 不会用单引号扩展变量,我猜当 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"
第二个“bash”被分配给 $0。