我有一个看似非常简单的问题,但我无法提出令人满意的解决方案。我有一个包含 IP 和端口的简单输入文件,例如
10.155.78.0 445
172.17.11.0 3389
现在我想nc -vvv <ip> <port>
在 for 循环中执行每一行。
我能想到的就是用 cut 将线分割两次:
for x in $(cat inputfile); do nc -vvv $(echo -n $x | cut -d" " -f1) $(echo -n $x | cut -d" " -f2)
或使用 gawk 并启动子 shell
for x in $(cat dingens); do cmd=$(echo $x | gawk -F" " '{ print "nc -vvv -w 2 " $1 " " $2 }'); echo -n $cmd | bash; done
但这两种解决方案似乎都非常复杂。难道就没有更好的解决办法吗?
答案1
while IFS=" " read -r Ip Port Junk <&3; do
nc -vvv "${Ip}" "${Port}" 3<&-
done 3< inFile
的目的Junk
是接收第二个字段之后的任何字段(例如,评论)。我们inFile
在 fd 3 而不是 stdin 上打开,否则nc
,在该循环中调用也会最终读取以下内容inFile
答案2
您可以使用xargs
,例如:
xargs -n 2 nc -vvv < inputfile
从man xargs
:
-n max-args
,--max-args=max-args
每个命令行最多使用 max-args 个参数。 [...]
您甚至可以使用该选项并行xargs
运行多个命令,只要您小心重定向每个命令的输出即可。例如,如果您有一个 8 核 CPU 并且想要并行运行 8 个作业:nc
-P
nc
xargs -P 8 -n 2 sh -c 'nc -vvv "$1" "$2" > "$1-$2.log"' sh < inputfile
-P max-procs
,--max-procs=max-procs
max-procs
一次运行最多进程;默认值为 1。[...]