我正在为自己制作一个菜单,因为有时我需要搜索(或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扫描所有内容后立即关闭。
答案 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)