使用UNIX命令获取所有正在运行的端口,并根据结果形成新命令

时间:2014-04-14 22:55:57

标签: shell curl netstat

我需要从服务器获取所有正在运行的端口,例如unix命令' netstat -an | grep tcp46'

输出:

tcp46        0       0  *.8009                 *.*                    LISTEN
tcp46        0       0  *.8080                 *.*                    LISTEN

然后我需要迭代端口并形成如下命令。

  

curl http://serverhost.com:$ {iterative ports} / app / version

例如

  

curl http://serverhost.com:8080/app/version

任何人都可以帮助我使用shell脚本或任何简单的命令吗?

2 个答案:

答案 0 :(得分:0)

我的netstat -an输出与你的不同,所以我在这里盲目进行:

for netstat -an | grep tcp46 | cut -d' ' -f18 | sed 's/*.//g';做回声卷曲http://serverhost.com:$ i / app / version;完成

这是一个应该工作的单线,但它假设输出与你说的相同,如果空格数改变那么它就不能正常工作。如果要直接运行命令,只需删除echo。

答案 1 :(得分:0)

您可以在sed中使用正则表达式(REGEX)从grep输入流中获取所需的输出。然后在bash for循环中,对找到的每个端口执行curl命令。注意:以下内容不检查重复端口。

for port in $(netstat -an | grep tcp46 | sed 's/[a-zA-Z]\{1,3\}[ 0-9.]*:\{1,3\}//g' | sed 's/ \+.*//g');
do echo "curl http://serverhost.com:$port/app/version" >> commandFile.txt;
done

我调用sed两次:一次删除字符串的第一部分,第二次删除尾部。

此脚本的输出将发送到当前目录中的commandFile.txt

如果您希望运行每个curl命令而不是发送到文件,只需删除回声,如下所示:

for port in $(netstat -an | grep tcp46 | sed 's/[a-zA-Z]\{1,3\}[ 0-9.]*:\{1,3\}//g' | sed 's/ \+.*//g');
do curl http://serverhost.com:$port/app/version;
done