在运维和管理Linux服务器的时侯,我们最常用的一个就是netstat,我常用这个来查看当前服务器上有什么进程正在侦听端口,主要拿来确诊网路服务的工作状态。
不过,近来有一次安装好一个Ubuntu短发版,发觉默认没有安装netstat,感觉十分奇怪,自己自动安装后,发觉manpages提示,netstat已然是deprecated了,建议使用ss命令替代。
Thisprogramismostlyobsolete.Replacementfornetstatisss.Replacementfornetstat-risiproute.Replacementfornetstat-iisip-slink.Replacementfornetstat-gisipmaddr.
netstatmanpages
netstat的用法
netstat有许多许多参数,我通常就用一种组合,以至于后来早已想不上去为何是这几个参数了:
netstat -npl
得到的结果是这样的:
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 655/systemd-resolve tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 890/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 30790/cupsd tcp 0 0 0.0.0.0:18025 0.0.0.0:* LISTEN 890/sshd tcp6 0 0 :::22 :::* LISTEN 890/sshd tcp6 0 0 ::1:631 :::* LISTEN 30790/cupsd tcp6 0 0 :::9090 :::* LISTEN 15415/./prometheus tcp6 0 0 :::18025 :::* LISTEN 890/sshd udp 0 0 127.0.0.53:53 0.0.0.0:* 655/systemd-resolve udp 0 0 0.0.0.0:631 0.0.0.0:* 30792/cups-browsed udp 0 0 0.0.0.0:5353 0.0.0.0:* 757/avahi-daemon: r udp 0 0 0.0.0.0:42360 0.0.0.0:* 757/avahi-daemon: r udp6 0 0 :::58232 :::* 757/avahi-daemon: r udp6 0 0 :::5353 :::* 757/avahi-daemon: r Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node PID/Program name Path unix 2 [ ACC ] STREAM LISTENING 35116 1304/gnome-session- @/tmp/.ICE-unix/1304 unix 2 [ ACC ] SEQPACKET LISTENING 1448 1/init /run/udev/control unix 2 [ ACC ] STREAM LISTENING 34277 1270/systemd /run/user/1000/systemd/private unix 2 [ ACC ] STREAM LISTENING 34282 1270/systemd /run/user/1000/gnupg/S.gpg-agent.ssh unix 2 [ ACC ] STREAM LISTENING 33510 1270/systemd /run/user/1000/gnupg/S.gpg-agent unix 2 [ ACC ] STREAM LISTENING 33511 1270/systemd /run/user/1000/pulse/native unix 2 [ ACC ] STREAM LISTENING 33512 1270/systemd /run/user/1000/gnupg/S.gpg-agent.extra
最常用的就是这个命令组合,展示的结果有两个段落,第一个段落展示的是TCP/UDP合同的侦听情况,第二个段落展示的是socks文件的侦听情况。参数n的意思是展示数字格式的IP地址,不然会展示主机名称或则是域名,参数p的意思显示进程的名子(有时侯显示不下来),l的意思,是关注处于LISTENING状态的socket。
通过如上命令,我们听到了系统所有打开的socket,假如你启动一种网路服务也好,自己开发一个网路服务打开端口也好,通过这个命令都应当能看见自己打开的端口,假如看不到,应当就是没有才能正确打开端口,要好好查询是哪些缘由。所以这是一个挺好用的调试命令。
ss的用法
里面介绍了netstat的最最基本的一种用法,其他用法其实还有好多,并且先略过不表,假如想使用ss命令来取代netstat的话,我们如何达到类似的疗效呢?
ss -atlp
这是我自己摸索的一个参数组合,目前我背诵得还不是很流利,每次还须要看一下文档:
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 127.0.0.53%lo:domain 0.0.0.0:* users:(("systemd-resolve",pid=655,fd=13)) LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* users:(("sshd",pid=890,fd=5)) LISTEN 0 5 127.0.0.1:ipp 0.0.0.0:* users:(("cupsd",pid=30790,fd=7)) LISTEN 0 128 0.0.0.0:18025 0.0.0.0:* users:(("sshd",pid=890,fd=3)) LISTEN 0 128 [::]:ssh [::]:* users:(("sshd",pid=890,fd=6)) LISTEN 0 5 [::1]:ipp [::]:* users:(("cupsd",pid=30790,fd=6)) LISTEN 0 128 *:9090 *:* users:(("prometheus",pid=15415,fd=3)) LISTEN 0 128 [::]:18025 [::]:* users:(("sshd",pid=890,fd=4))
这是ss命令呈现下来的结果,可以看见,格式和netstat很不一样,不像netstat命令这么紧凑和直观。这是好多人非议这个命令的诱因之一。其实,批判这些批判的声音觉得,人们只是固守了一种习惯,不愿前行。其实了,那么说也未尝不对,就拿Charles个人来说,即使我2010年出席工作,才学会netstat命令,那我到现今也使用了将近六年,从来没有变过,其实看得无比顺眼啦。
其实,也有一种理由是鬼佬提出来的,说ss这个命令的名子不好,虽然ss可能是socketstatistics的意思,简写之后,居然只有两个字母,不太好联想,不像netstat这么直观。其实这是我的解释,不是鬼佬埋怨的理由,她们埋怨的是,每当提到ss,她们会联想起希特勒!是不是匪夷所思,我是80后,我这个年代的人,对这个都没有哪些印象,关键我们用英文为主linux man ls,恐怕你们看见ss最多联想到梯子,如何都不会想到希特勒。这个大纳粹有一个武装军队,曾经叫党卫兵非常机动军队,后来更名叫武装党卫兵。它的英语简称正是SS。
不说闲谈了,谈谈几个参数,a参数是显示所有的意思,t参数意思是显示TCP合同的,l代表正在LISTENING状态的,p代表进程信息。从前面的表里,我们看见p参数复印的信息,组织得不如netstat精炼。并且更为健全一点,显示了进程名子和PID以及FD。并且由于用了两重小括弧,key/value的格式,再加破折号,看上去脏乱差。其实,我们可以用一些命令去低格它,不过还是太麻烦了。
更换的缘由是哪些?
这可能是我最为好奇的事情。不过网上我搜索了不少的资料,基本都语焉不详。这也有点让我有点无奈。
大体上,我们能看下来,主要是net-tools这个包,即将被iproute这个包给替换。理由大约是,1,这个包太老了,2,这个包不支持好多内核新的特点(并且没有说是什么特点),界面不够优化使用困难(对命令行不友好)linux man ls,3,net-tools上面的ifconfig确实缺点多多linux系统介绍,4,未来不再想维护net-tools了。
LukClaesandme,asthecurrentmaintainersofnet-tools,we’vebeenthinkingaboutit’sfuture.Net-toolshasbeenacorepartofDebianandanyotherlinuxbaseddistroformanyyears,butit’sshowingitsage.
Itdoesntsupportmanyofthemodernfeaturesofthelinuxkernel,theinterfaceisfarfromoptimalanddifficulttouseinautomatisation,andalso,ithasn’tgotmuchloveinthelastyears.
Ontheotherside,theiproutesuite,introducedaroundthe2.2kernelline,hasbothamuchbetterandconsistentinterface,ismorepowerful,andisalmosttenyearsold,sonobodywouldsayit’suntested.
Hence,ourplansaretoreplacenet-toolscompletelywithiproute,maybeleadingtherouteforotherdistributionstofollow.Ofcourse,mostpeopleandtoolsuseandrememberthevenerableoldinterface,sothefirststepwouldbetowritewrappers,tryingtobecompatiblewithnet-tools.
Atthesametime,webelievethatmostpackagesusingnet-toolsshouldbepatchedtouseiprouteinstead,whileotherscancontinueusingthewrappersforsometime.Theifupdownpackageisobviouslythefirstcandidate,butitseemsthataversionusingiproutehasbeenavailableinexperimentalsince2007.
也有从原理层面剖析的:现今的netstat和ifconfig命令,都是通过读写/proc目录下的虚拟文件来完成任务的,这个东西在大型业务系统上,是没问题的,并且在大规模系统里,可能会伤害系统的性能之类的。相比之下,ss和ip两个命令,使用的是Linux内核的netlinksockets特点。有着根本上的不同。其实,老命令也可以用新原理重画,而且似乎并没有人这么做,主要由于不同程序员团体的一些politicalissues,你们意见不合……
其实,深层次的还有,我们使用这样的调试命令,本质上还是希望得知内核的状态的,毕竟,内核早已改变了networking模块的整个原理,另一方面我还要求命令像从前那样去展示信息,展示层面的格式和真实原理早已背离,所以,从长远看,取代这两个命令才是必然。
推论
俺们那些做技术的,也还是要与时俱进比较好,尽管,原先的这些命令熟悉,好用LINUX社区,手到擒来,甚至难以忘掉,然而新的还是要保持学习。很多发型版早已默认不带有net-tools包了,尽管依然可以自动安装回去,而且,这背后的心态已然很明晰了。另一方面,我们做技术,也要避免自己的脑部死板,还是要保持对新事物的好奇心和热情。
天下数据是国外屈指可数的拥有多处海外自建机房的新型IDC服务商,被业界公觉得“中国IDC行业首选品牌”。
天下数据与全球近120多个国家顶尖机房直接合作,提供包括台湾、美国、韩国、日本、台湾、新加坡、荷兰、法国、英国、德国、埃及、南非、巴西、印度、越南等国家和地区的服务器、云服务器的租用服务,须要的请联系天下数据客服!
除提供传统的IDC产品外,天下数据的主要职责是为大小型企业提供更精细、安全、满足个性需求的多样化服务器解决方案,非常是在直销、金融、视频、流媒体、游戏、电子商务、区块链、快消、物联网、大数据等众多行业,为广大顾客解决服务器租用中遇见的各类问题。
本文原创地址://gulass.cn/ywbbuztdndsm.html编辑:刘遄,审核员:暂无