linux查看哪个端口可以使用

linux查看哪个端口可以使用,第1张

1)使用lsof命令lsof是一个非常强大的linux工具,她被用来查找哪些程序使用了那些文件。在linux系统下,基本上所有的东西都可以被当作文件来用。socket当然也是一种文件了。所以lsof可以用来查找谁用了某一个端口。具体方法:lsof -i :port_number grep "(LISTEN)"-i是用来查找和网络相关的文件,":"号是必须的,它是标志你查找的是一个端口。port_number就是你要查找的端口号,譬如你要查找是否 有程序占用了oracle的监听端口1521,就可以使用lsof -i :1521 |grep "(LISTEN)"。如果有程序已经占用了,那么下面打印的第二个字段就是该程序的进程id,第一个字段是进程的名字。如果只有losf -i :port_number可能会查到很多应用程序,但这些程序实际并没有占用你指定的端口,这些端口只是连接到本机器或者别的机器的该端口。所以要grep "(LISTEN)“,因为一个端口只可能被一个程序占用的,所以这种方法是可靠的。2)使用netstat 命令大家一定对这个命令比较熟悉了,可能你从没有想到用到来查找哪一个程序的占用了指定的端口。但是netstat -an 的确提供了这种功能。所以有问题了一定要想到先去查找man手册,不过说实话,某些man手册写得让中国人看不懂,那没有办法了,就googe或者 baidu一下吧。执行man netstat命令,你会发现netstat 提供了'-p'的选项,这个选项的功能是告诉你哪个程序占用了该端口,但是她提供的形式比较古怪是以pid/process_name提供的。pid当然 是进程id了,process_name是进程的命令,中间以'/'号分隔。和上面的原因一样,我们只查找listen的端口,netstat 给我们提供了-l的选项,这个选项不是默认的选项。下面以1521端口来看怎么查找到该程序,我们使用下面的命令:netstat -lnpawk 'BEGIN{prt=":1521$"}{if ($4 ~ prt) print $0}'在这里使用awk来匹配第4个字段的模式是为了避免误判。

linux系统下,查看端口占用情况的命令:lsof -i

1 [root@www ~]# lsof -i

2

3 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

4 nginx 2333 root 6u IPv4 6242 TCP *:http (LISTEN)

5 nginx 2334 www 6u IPv4 6242 TCP *:http (LISTEN)

6 sshd 2349 root 3u IPv6 6283 TCP *:ndmp (LISTEN)

7 sshd 2349 root 4u IPv6 6286 TCP *:ssh (LISTEN)

这里返回了Linux当前所有打开端口的占用情况。第一段是进程,最后一列是侦听的协议、侦听的IP与端口号、状态。如果端口号是已知的常用服务(如80、21等),则会直接显示协议名称,如http、ftp、ssh等。

查看某一端口的占用情况: lsof -i:端口号

1 [root@www ~]# lsof -i:21

2

3 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

4 pure-ftpd 2651 root 4u IPv4 7047 TCP *:ftp (LISTEN)

5 pure-ftpd 2651 root 5u IPv6 7048 TCP *:ftp (LISTEN)

这里显示出21号端口正在被pure-ftpd使用,状态是listen。

结束占用端口的进程:killall 进程名

虽然我们不建议用这种本末倒置的方法来解决冲突问题,但某些情况下还是可以直接结束掉占用进程的(比如重启Apache时进程没有完全退出,导致重启失败)

1 [root@www ~]# killall pure-ftpd

这样,所有的pure-ftpd进程都会被结束掉。

我们知道建立一个socket连接进行网络通讯时需要四个元素client_ip:client_port<----->server_ip:server_port,socket绑定一个端口号用于标识进程。我一直好奇在linux平台上运行时进程的端口如何分配的?如何才能避免端口占用冲突? 要想了解这些答案需要先了解Linux下端口范围多少?如何修改端口范围?一个进程的端口如何分配的?最后了解linux系统下端口如何分配的? 1)查看端口范围:sysctl -a | grep range 2)修改端口范围:sysctl.conf vi /etc/sysctl.conf net.ipv4.ip_local_port_range=32788 60000配置立即生效:sysctl -p 另外,端口范围不要超过1024  65535,1024以下系统使用,65535以上设置会提示失败。 程序的端口分配分为固定分配和自动分配两种。一套系统中固定端口是要进行规划的,比如ftp的端口为10021(控制连接时服务端的),控制连接时客户端的端口就可以随机分配。ftp数据连接如果在被动模式下服务端和客户端的端口都可以随机分配,如果在主动模式下,服务端的端口可以固定分配,客户端的端口随机分配。 固定分配,一般在服务端的进程启动时分配端口,用于创建socket进行监听客户端,如ftp配置文件中的listen_port=10021,http默认的是80,snmp管理的 trap端口是162和snmp agent端口是161。 自动分配,创建进程即建立socket用于通讯,比如ftp服务端的数据连接进程,会从linux sysctl.conf定义的端口范围,自动来分配端口,调用bind进行端口绑定。但有时候不进行绑定端口也能正常工作,这是因为协议栈对没有端口绑定的socket进行了自动绑定。每次调用第4层协议的sendmsg成员函数时,会进行端口号的检查,如果没有绑定就调用协议的成员函数get_port进行自动绑定。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/6190473.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-17
下一篇 2023-03-17

发表评论

登录后才能评论

评论列表(0条)

保存