Linux 查看端口占用情况

lsof

lsof(list open files)是一个列出当前系统打开文件的工具。

lsof 查看端口占用语法格式:

lsof -i:端口号

实例

查看服务器 8000 端口的占用情况:

# lsof -i:8000
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nodejs  26993 root   10u  IPv4 37999514      0t0  TCP *:8000 (LISTEN)

可以看到 8000 端口已经被轻 nodejs 服务占用。

lsof -i 需要 root 用户的权限来执行,如下图:

更多 lsof 的命令如下:

lsof -i:8080:查看8080端口占用
lsof abc.txt:显示开启文件abc.txt的进程
lsof -c abc:显示abc进程现在打开的文件
lsof -c -p 1234:列出进程号为1234的进程所打开的文件
lsof -g gid:显示归属gid的进程情况
lsof +d /usr/local/:显示目录下被进程开启的文件
lsof +D /usr/local/:同上,但是会搜索目录下的目录,时间较长
lsof -d 4:显示使用fd为4的进程
lsof -i -U:显示所有打开的端口和UNIX domain文件

netstat

netstat -tunlp 用于显示 tcp,udp 的端口和进程等相关情况。

netstat 查看端口占用语法格式:

netstat -tunlp | grep 端口号

  • -t (tcp) 仅显示tcp相关选项
  • -u (udp)仅显示udp相关选项
  • -n 拒绝显示别名,能显示数字的全部转化为数字
  • -l 仅列出在Listen(监听)的服务状态
  • -p 显示建立相关链接的程序名

例如查看 8000 端口的情况,使用以下命令:

# netstat -tunlp | grep 8000
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      26993/nodejs  

更多命令:

netstat -ntlp   //查看当前所有tcp端口
netstat -ntulp | grep 80   //查看所有80端口使用情况
netstat -ntulp | grep 3306   //查看所有3306端口使用情况

Centos7添加删除策略黑名单

开启防火墙:systemctl start firewalld
查看开放的端口和服务以及屏蔽的IP:firewall-cmd –zone=public –list-all
查看系统中查看系统中可用的服务:  firewall-cmd –get-services

允许全部网段访问本机80端口:firewall-cmd –permanent –zone=public –add-port=80/tcp  (–permanent永久生效,没有此参数重启后失效)
查看:                     firewall-cmd –zone= public –query-port=80/tcp

### 添加规则允许规则:
允许全部网段访问本机端口段:          firewall-cmd –permanent –zone=public –add-port=5060-5061/udp
允许[指定IP]访问本机10050:          firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=”ipv4″ source address=”172.17.134.13″ port protocol=”tcp” port=”10050″ accept”

允许[指定IP]访问本机全部tcp端口:     firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=”ipv4″ source address=”172.17.134.13″ port protocol=”tcp” port=”0-65535″ accept”

允许[指定IP]访问本机全部端口:        firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=”ipv4″ source address=”172.17.172.236″  accept”

允许[指定IP段]访问本机全部端口:   firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=”ipv4″ source address=”192.168.1.0/24″ accept”

允许[指定IP段]访问本机8080-8090端口: firewall-cmd –permanent –zone=public –add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.0/24″ port protocol=”tcp” port=”8080-8090″ accept’

### 添加禁止规则:
禁止[指定IP]访问本机8080端口:firewall-cmd –permanent –zone=public –add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.1″ port protocol=”tcp” port=”8080″ reject’
屏蔽[指定IP](reject):      firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=ipv4 source address=43.229.53.61 reject”
屏蔽[指定IP段](drop):       firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=ipv4 source address=’x.x.x.x/24′  drop”

###删除添加的规则:

删除端口:   firewall-cmd –permanent –zone=public –remove-port=8080/tcp 

删除IP+端口:firewall-cmd –permanent –zone=public –remove-rich-rule=”rule family=”ipv4″ source address=”10.0.5.0/24″ port protocol=”tcp” port=”10050″ accept”

***添加或者修改完规则后必须热加载才能生效:firewall-cmd –reload
查看屏蔽结果:firewall-cmd –list-rich-rules
因为在/usr/lib/firewalld/services/中事先定义了ssh.xml的相应的规则

来自 <https://www.cnblogs.com/faithH/p/11811286.html>

1.drop禁止特定ip连接ssh/22服务

  firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=ipv4 source address=’x.x.x.x/24′ service name=’ssh’ drop”

  firewall-cmd –reload ##重新加载防火墙配置,不然firewall-cmd –list-all-zones不会显示刚加上的规则

2.reject禁止特定ip连接ssh/22服务

  firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=’ipv4′ source address=’x.x.x.x/24′ service name=’ssh’ reject”

  firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=’ipv4′ source address=’x.x.x.x/24′ port port=22 protocol=tcp reject”

  firewall-cmd –reload

3.accept运行特定ip连接ssh/22服务

  firewall-cmd –permanent –zone=public –add-rich-rule=”rule family=ipv4 source address=’x.x.x.x/24′ port port=22 procotol=tcp accept”

  firewall-cmd –reload

防火墙内的策略动作有DROP和REJECT两种,区别如下:

1、DROP动作只是简单的直接丢弃数据,并不反馈任何回应。需要Client等待超时,Client容易发现自己被防火墙所阻挡。

2、REJECT动作则会更为礼貌的返回一个拒绝(终止)数据包(TCP FIN或UDP-ICMP-PORT-UNREACHABLE),明确的拒绝对方的连接动作。连接马上断开,Client会认为访问的主机不存在。REJECT在IPTABLES里面有一些返回参数,参数如下:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

    至于使用DROP还是REJECT更合适一直未有定论,因为的确二者都有适用的场合。REJECT是一种更符合规范的处理方式,并且在可控的网络环境中,更易于诊断和调试网络/防火墙所产生的问题;而DROP则提供了更高的防火墙安全性和稍许的效率提高,但是由于DROP不很规范(不很符合TCP连接规范)的处理方式,可能会对你的网络造成一些不可预期或难以诊断的问题。因为DROP虽然单方面的中断了连接,但是并不返回任何拒绝信息,因此连接客户端将被动的等到tcp session超时才能判断连接是否成功,这样早企业内部网络中会有一些问题,例如某些客户端程序或应用需要IDENT协议支持(TCP Port 113, RFC 1413),如果防火墙未经通知的应用了DROP规则的话,所有的同类连接都会失败,并且由于超时时间,将导致难以判断是由于防火墙引起的问题还是网络设备/线路 故障。

    一点个人经验,在部署防火墙时,如果是面向企业内部(或部分可信任网络),那么最好使用更绅士REJECT方法,对于需要经常变更或调试规则的网络也是如此;而对于面向危险的Internet/Extranet的防火墙,则有必要使用更为粗暴但是安全的DROP方法,可以在一定程度上延缓******的进度(和难度,至少,DROP可以使他们进行TCP-Connect方式端口扫描时间更长)。

修改防火墙配置文件之前,需要对之前防火墙【/etc/firewalld/zones/public.xml】做好备份

重启防火墙后,需要确认防火墙状态和防火墙规则是否加载,若重启失败或规则加载失败,则所有请求都会被防火墙。

1.firewall-cmd –state           #查看firewall的状态

  firewall-cmd –list-all        #查看防火墙规则(只显示/etc/firewalld/zones/public.xml中防火墙策略)

  firewall-cmd –list-all-zones  #查看所有的防火墙策略(即显示/etc/firewalld/zones/下的所有策略)

  firewall-cmd –reload          #重新加载配置文件

2、关闭firewall:

  systemctl stop firewalld.service      #停止firewall

  systemctl disable firewalld.service   #禁止firewall开机启动

  firewall-cmd –state                  #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

3、firewalld的基本使用

  启动: systemctl start firewalld

  查看状态: systemctl status firewalld

  停止: systemctl disable firewalld

  禁用: systemctl stop firewalld

4.systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。

  启动一个服务:systemctl start firewalld.service

  关闭一个服务:systemctl stop firewalld.service

  重启一个服务:systemctl restart firewalld.service

  显示一个服务的状态:systemctl status firewalld.service

  在开机时启用一个服务:systemctl enable firewalld.service

  在开机时禁用一个服务:systemctl disable firewalld.service

  查看服务是否开机启动:systemctl is-enabled firewalld.service

  查看已启动的服务列表:systemctl list-unit-files|grep enabled

  查看启动失败的服务列表:systemctl –failed

5.配置firewalld-cmd

  查看版本: firewall-cmd –version

  查看帮助: firewall-cmd –help

  显示状态: firewall-cmd –state

  查看所有打开的端口: firewall-cmd –zone=public –list-ports

  更新防火墙规则: firewall-cmd –reload

  查看区域信息:  firewall-cmd –get-active-zones

  查看指定接口所属区域: firewall-cmd –get-zone-of-interface=eth0

  拒绝所有包:firewall-cmd –panic-on

  取消拒绝状态: firewall-cmd –panic-off

  查看是否拒绝: firewall-cmd –query-panic

CentOS 7 启动Oracle

1. 切换用户 

    su – oracle        — 使用户环境变量生效

2. 检查监听

    lsnrctl  status    — 查看状态

    lsnrctl  start      — 启动监听

3. 登录SqlPlus

    sqlplus /nolog

4. 登录数据库

    sqlplus   / as sysdba

5. 启动数据库

    startup 

6.关闭数据库

    shutdown

curl发送请求

我们在客户端开发过程中总免不了和后端进行api对接,有时候需要对返回的数据格式进行调试,有时候每次运行客户端来发送请求,这个未免效率太低,这里就来介绍一个好用的工具–curl。

curl

curl是一个向服务器传输数据的工具,它支持http、https、ftp、ftps、scp、sftp、tftp、telnet等协议,这里只针对http进行讲解一些常用的用法,具体安装请自行搜索。

打开百度

curl http://www.baidu.com

接着你就会看到百度的页面源代码输出。

如果要把这个网页保存下来,可以这样:

curl http://www.baidu.com > /tmp/baidu.html

你会看到一条进度条,然后源码就被重定向到了/tmp/baidu.html。

或者:

curl -o /tmp/baidu.html http://www.baidu.com

GET请求

默认直接请求一个url就是发出一个get请求,参数的话直接拼接在url里就好了,如

curl http://www.baidu.com/s?wd=curl

上述请求会上百度发起一条查询请求,参数是wd=url

POST请求

curl -d “name=test&page=1” http://www.baidu.com

-d 参数指定表单以POST的形式执行。

只展示Header

curl -I  http://www.baidu.com

可以看到只返回一些header信息

HTTP/1.1 200 OK
Date: Fri, 07 Nov 2014 09:48:58 GMT
Content-Type: text/html; charset=utf-8
Connection: Keep-Alive
Vary: Accept-Encoding
Set-Cookie: BAIDUID=E9DB2F0AC95CB6BFDAD9D5CFDCED0A12:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUPSID=E9DB2F0AC95CB6BFDAD9D5CFDCED0A12; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=9725_9165_1465_7800_9452_9498_6504_9509_6018_9700_9757_9531_9478_7798_9453_9793_9024; path=/; domain=.baidu.com
P3P: CP=” OTI DSP COR IVA OUR IND COM “
Cache-Control: private
Cxy_all: baidu+3057b288b211c770a1463cc8519b62a8
Expires: Fri, 07 Nov 2014 09:48:17 GMT
X-Powered-By: HPHP
Server: BWS/1.1
BDPAGETYPE: 1
BDQID: 0xfa28eff900012706
BDUSERID: 0

显示通信过程

-v参数可以显示一次http通信的整个过程,包括端口连接和http request头信息

curl -v www.baidu.com

* Adding handle: conn: 0x7ffe4b003a00
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* – Conn 0 (0x7ffe4b003a00) send_pipe: 1, recv_pipe: 0
* About to connect() to www.baidu.com port 80 (#0)
*   Trying 61.135.169.125…
* Connected to www.baidu.com (61.135.169.125) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.30.0
> Host: www.baidu.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 07 Nov 2014 09:49:49 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: Keep-Alive
< Vary: Accept-Encoding
< Set-Cookie: BAIDUID=062E02D23FBB651CF8455B699DF02B64:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
< Set-Cookie: BAIDUPSID=062E02D23FBB651CF8455B699DF02B64; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
< Set-Cookie: BDSVRTM=0; path=/
< Set-Cookie: BD_HOME=0; path=/
< Set-Cookie: H_PS_PSSID=7744_1429_7801_9583_9499_6506_6018_9769_9699_9757_9532_9477_7799_9453_9716_9023; path=/; domain=.baidu.com
< P3P: CP=” OTI DSP COR IVA OUR IND COM “
< Cache-Control: private
< Cxy_all: baidu+7dcb6b3c03d32c334d42f311919a14d6
< Expires: Fri, 07 Nov 2014 09:49:20 GMT
< X-Powered-By: HPHP
* Server BWS/1.1 is not blacklisted
< Server: BWS/1.1
< BDPAGETYPE: 1
< BDQID: 0xadb706860000088f
< BDUSERID: 0

如果你觉得上面的信息还不够,那么下面的命令可以查看更详细的通信过程。

curl –trace output.txt www.baidu.com

或者

curl –trace-ascii output.txt www.baidu.com

运行后,请打开output.txt文件查看。

HTTP方法

curl默认的HTTP方法是GET,使用-X参数可以支持其他动词。

curl -X POST www.example.com

curl -X DELETE www.example.com

Referer字段

有时你需要在http request头信息中,提供一个referer字段,表示你是从哪里跳转过来的。

curl –referer http://www.example.com http://www.example.com

User Agent字段

这个字段是用来表示客户端的设备信息。服务器有时会根据这个字段,针对不同设备,返回不同格式的网页,比如手机版和桌面版。

iPhone4的User Agent是

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7

curl可以这样模拟:

curl –user-agent “[User Agent]” [URL]

增加头信息

有时需要在http request之中,自行增加一个头信息。–header参数就可以起到这个作用。

curl –header “Content-Type:application/json” http://example.com

来自 <http://stormzhang.com/devtools/2014/11/07/use-curl-debug/>

-H, —header LINE Custom header to pass to server (H)

-d, —data DATA HTTP POST data (H)

示例命令

1curl -H “Content-Type: application/json” -d ‘{“object_kind”:”merge_request”,”object_attributes”:{“id”:22,”target_branch”:”master”,”source_branch”:”master”,”source_project_id”:57,”author_id”:9,”assignee_id”:null,”title”:”Master Title”,”created_at”:”2014-07-02T02:31:20.000Z”,”updated_at”:”2014-07-02T02:36:33.008Z”,”milestone_id”:null,”state”:”closed”,”merge_status”:”unchecked”,”target_project_id”:55,”iid”:7,”description”:”description_content”}}’ http://10.0.6.122:9002/merge_request

来自 <https://cloud.tencent.com/developer/article/1328118>

curl -v -H “Content-Type:application/json” \

-H  “Authorization:Basic Y2xpZW50Q3JlZGVudGlhbHNJZDpzZWNyZXQ=” \

-X POST  http://172.16.5.172:3396/crm/oauth/token?grant_type=client_credentials

请求soup

curl -X POST -d @testrequest.xml \

–header “Content-Type:application/json” \

http://localhost:8080/services/xxxxService

testrequest.xml

<soapenv:Envelope xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/” xmlns:ent=”http://entity.xxx.com”>

   <soapenv:Header/>

   <soapenv:Body>

      <ent:getTableData>

         <!–Optional:–>

         <ent:oaUsername>zhangsan</ent:oaUsername>

      </ent:getTableData>

   </soapenv:Body>

</soapenv:Envelope>

ls 排序

首先我们通过man 来看看 ls其中有几项;

  • -S     sort by file size : 按大小降序

–sort=WORD

sort by WORD instead of name: none -U, extension -X, size -S, time -t, version -v

–time=WORD

with -l, show time as WORD instead of modification time: atime -u, access -u, use -u, ctime -c, or status -c; use specified time as sort key if –sort=time

–time-style=STYLE

with -l, show times using style STYLE: full-iso, long-iso, iso, locale, +FORMAT. FORMAT is interpreted like ‘date’; if FORMAT is FORMAT1<newline>FORMAT2, FORMAT1

applies to non-recent files and FORMAT2 to recent files; if STYLE is prefixed with ‘posix-’, STYLE takes effect only outside the POSIX locale

  • -t     sort by modification time 按时间升序
  • -u     with -lt: sort by, and show, access time with -l: show access time and sort by name otherwise: sort by access time  以文件上次被访问的时间排序。
  • -U     do not sort; list entries in directory order 不做排序
  • -v     natural sort of (version) numbers within text 
  • -X     sort alphabetically by entry extension 

ls -lS    按大小降序

ls -l | sort -n -k5     按大小升序

ls -lrt   按时间降序

ls -lnt    按时间升序

ls -l | sort -k9    按文件名升序(这是ls的默认输出方式)

ls -lr 按文件名降序

ls -l | sort -rk9   按文件名降序

附:

ls对当前目录和文件大小排序

du -s * | sort -nr

只对当前目录排序,并用直观的大小显示出来

for i in $(ls -l |grep ‘^d’ |du -s * |sort -nr|awk ‘{print $2}’);do du -sh $i;done

Vi 中文乱码

Vi ~/.vimrc 添加以下内容

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936

set termencoding=utf-8

set encoding=utf-8

命令行中打开文件后执行命令

<< EOF 是执行一命令,命令从<<EOF行开始到EOF出现的地方结束。例如:

ftp -n << EOF

open $host 21

user $user $password

cd $remote_dir

lcd $local_dir

get $file_name

bye

EOF

<< – EOF 与 << EOF 只有细微的差别(在菜单式命令中每行的开头可以不必顶格),下面这段代码使用<<EOF会出错,必须使用<<-EOF

ftp -n <<- EOF

        open $host 21

        user $user $password

        cd $remote_dir

        lcd $local_dir

        get $file_name

        bye

        EOF

EOF并不是唯一的,例如可以这样:

ftp -n <<- !

        open $host 21

        user $user $password

        cd $remote_dir

        lcd $local_dir

        get $file_name

   

   

sed变量 引号

在使用sed对日志或者其它文本进行parse的过程当中,有时候我们需要引用外部变量的值,

或者获取一个shell命令执行的结果,以便达到更加可观的输出结果。这里介绍如何做到。

sed中使用变量替换

1.sed命令使用双引号的情况下,使用$var直接引用

$ echo|sed “s/^/$RANDOM.rmvb_/g” 

29328.rmvb_ 

# 上面例子引用了一个环境变量$RANDOM的值

2.sed命令使用单引号的情况下,使用'”$var”‘引用

类似,我们可以看到

$ echo|sed ‘s/^/'”$RANDOM”‘.rmvb_/g’ 

31338.rmvb_

sed中执行外部命令

1.sed命令使用单引号的情况下使用’`shell command`’或者’$(shell command)’引用命令执行的结果

还是以上面案例分析,例子如下

$ echo|sed ‘s/^/’`echo $RANDOM`’.rmvb_/g’ 

8063.rmvb_ 

# 上面的例子使用了旧式的命令替换,也可以采用新式的命令替换方法,如下

$ echo|sed ‘s/^/’$(echo $RANDOM)’.rmvb_/g’ 

18554.rmvb_ 

# 下面例子取用当前日期作为结果的一部分,如下

$ echo|sed ‘s/^/’$(date +”%Y%m%d”)’.rmvb_/g’ 

20120108.rmvb_ 

2.sed命令使用双引号的情况下直接`shell command`或者$(shell command)引用命令执行的结果 

类似的,双引号的情况,如下

$ echo|sed “s/^/$(date +”%Y%m%d”).rmvb_/g” 

20120108.rmvb_ 

# 使用环境变量$RANDOM以及旧式命令替换的例子

$ echo|sed “s/^/`echo $RANDOM`.rmvb_/g” 

4988.rmvb_

总结

在sed语句里面,变量替换或者执行shell命令,双引号比单引号少绕一些弯子

awk 设置输入输出分隔符

awk  F=”\t” ‘{OFS=”:”;print $1,$2}’

最后如果只写print 相当于print $0,意思是输出这些文本,未使用分隔符,“,”表示使用分隔符,使用OFS定义的分隔符

腾讯云图