netcat在一段时间内读取循环立即返回

时间:2014-10-15 22:01:09

标签: 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 $serviceport";
        netcat $1 $serviceport;
    fi;
    i=$(($i+1));
done;

用nmap扫描所有内容后立即关闭。

1 个答案:

答案 0 :(得分:1)

不要对读取循环和netcat使用FD 0(stdin)。如果您不区分这些流,netcat可以使用nmap | grep管道发布的内容,而不是让read内容读取该内容。

这有一些不良影响:while / read循环的其他部分没有被执行,netcat看到一个关闭的stdin流,并在管道的内容被消耗时退出(所以你没有得到netcat的交互式控制,如果这是你想要完成的事情)。解决此问题的一种简单方法是将nmap管道的输出提供给非默认文件描述符;下面,我正在使用FD 3。

除了问题的范围之外,这个代码有很多问题,所以请不要考虑我复制并粘贴代言的部分,但是:

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)