Bash netcat在while read循环中立即返回

Bash netcat在while read循环中立即返回,bash,shell,Bash,Shell,我正在为自己制作一个菜单,因为有时我需要搜索(或NMAP哪个端口)。 我希望执行与在命令行中运行命令相同的操作 下面是我的一段代码: nmap $1 | grep open | while read line; do serviceport=$(echo $line | cut -d' ' -f1 | cut -d'/' -f1); if [ $i -eq $choice ]; then echo "Running command: netcat $1 $serv

我正在为自己制作一个菜单,因为有时我需要搜索(或NMAP哪个端口)。 我希望执行与在命令行中运行命令相同的操作

下面是我的一段代码:

nmap $1 | grep open | while read line; do
    serviceport=$(echo $line | cut -d' ' -f1 | cut -d'/' -f1);
    if [ $i -eq $choice ]; then
        echo "Running command: netcat $1 $serviceport";
        netcat $1 $serviceport;
    fi;
    i=$(($i+1));
done;
在使用nmap扫描所有内容后,它将立即关闭。

请勿将FD 0(stdin)用于读取循环和netcat。如果不区分这些流,
netcat
可以使用
nmap | grep
管道发出的内容,而不是让
read
读取这些内容

这会产生一些不良影响:while/read循环的其他部分不会执行,
netcat
会看到一个关闭的stdin流,并在管道的内容被消耗时退出(因此,如果您正试图实现这一点,则无法获得netcat的交互控制)。解决此问题的一个简单方法是将nmap管道的输出输入到非默认文件描述符中;下面,我使用的是FD3

这个代码超出了问题的范围,有很多错误,所以请不要考虑我复制和粘贴的部分是认可的,但是:

while read -r -u 3 line; do
    serviceport=${line%% *}; serviceport=${serviceport##/*}
    if [ "$i" -eq "$choice" ]; then
        echo "Running command: netcat $1 $serviceport"
        netcat "$1" "$serviceport"
    fi
done 3< <(nmap "$1" | grep open)
读取-r-u3行时;做
serviceport=${line%%*};serviceport=${serviceport##/*}
if[“$i”-eq“$choice”];然后
echo“正在运行的命令:netcat$1$serviceport”
netcat“$1”$serviceport
fi

done 3<请运行此程序,以获得一些其他问题的指针,这些问题可能会在直接导致问题的错误之外得到修复。……此外,nmap有一个可选的输出格式,旨在有助于使用shell工具进行操作;请考虑使用它。