首页 文章 精选 留言 我的

精选列表

搜索[错误检测],共10000篇文章
优秀的个人博客,低调大师

网络状态检测的利器 - ss命令

ss命令,它是 socket statistic的缩写,用于统计Linux系统中socket连接相关的信息,和其他的工具相比,ss命令可以显示更多关于 TCP和状态相关的信息 语法 ss [ OPTIONS ] 在Linux系统中,默认已经安装了 ss 命令,下面介绍该命令常用的一些功能 ss 和 netstat 命令 netstat 命令和 ss 命令比较类似,主要功能也是统计系统中socket相关信息,和 netstat相比,ss 命令在跟踪TCP连接和套接字方面速度更快,功能更强大,下面是 ss 和 netstat 统计速度的对比 [cgyx@cghost35 ~]$ time ss -a | wc -l439real 0m0.014suser 0m0.004ssys 0m0.010s[cgyx@cghost35 ~]$ time netstat -a | wc -l366real 0m0.029suser 0m0.005ssys 0m0.008s 从上面例子可以看出,ss 统计439条socket信息花费了0.014s, netstat 统计366条socket信息花费了0.029s,ss 统计信息的速度更快,所以实际使用中一般都是用 ss 替代 netstat 显示套接字摘要 列出当前已经连接、关闭、等待的TCP连接,当系统中已经存在大量的套接字连接的时候,通过查看套接字摘要信息可以快速了解系统中套接字的总体情况 [root@ecs-centos-7 ~]# ss -sTotal: 185 (kernel 264)TCP: 7 (estab 2, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0Transport Total IP IPv6* 264 - -RAW 0 0 0UDP 7 4 3TCP 7 4 3INET 14 8 6FRAG 0 0 0 显示网络连接 当不使用任何选项时,ss将显示已建立连接的处于非监听状态的套接字列表,由于原始结果太长,下面的例子只截取了一部分 [root@ecs-centos-7 ~]# ssNetid State Recv-Q Send-Q Local Address:Port Peer Address:Portu_str ESTAB 0 0 /run/dbus/system_bus_socket 12050 * 11962tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.56:ssm-csspstcp ESTAB 0 4200 192.168.0.9:ssh 27.38.240.56:rsmtptcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.56:pearldoc-xact 上面例子中列说明: Netid socket类型,在上面的例子中,有 TCP、u_str(unix流)等套接字 State 套接字处于什么状态,下面是TCP套接字的所有状态及说明, 实际上就是TCP的三次握手和四次挥手的所有状态 LISTEN: 服务端侦听套接字等待客户端的连接SYN-SENT: 客户端已发送套接字连接请求报文,等待连接被服务器接收SYN-RECEIVED: 服务器端接收连接请求报文后,等待客户端的确认连接的回复报文ESTABLISHED: 服务端和客户端之间成功建立了一条有效的连接,可以互相传输数据FIN-WAIT-1: 服务器或客户端调用close函数主动向对方发出终止连接的请求报文,同时等待对方确认终止连接的回复报文FIN-WAIT-2: 主动关闭连接端收到对方确认终止连接的回复报文,同时等待对方连接终止的请求报文,这时的状态是TCP连接的半关闭状态,可以接受数据,但是不能发送数据CLOSE-WAIT: 被动关闭端收到主动关闭端终止连接的请求报文后,向主动关闭端发送确认终止连接的回复报文,同时被动关闭端等待本地用户终止连接,这时被动关闭端的状态是TCP连接的半关闭状态,可以发送数据,但是不能接收数据CLOSING: 服务器和客户端同时向对方发送终止连接(调用close函数)请求报文,并且双方都是在收到对方发送的终止连接回复报文之前收到了对方的发送的终止连接请求报文,这个时候双方都进入了CLOSING状态,进入CLOSING状态之后,只要收到了对方对自己终止连接的回复报文,就会进入TIME-WAIT状态,所以CLOSING状态的持续时间会特别短,一般很难捕获到LAST-ACK: 被动关闭端发送完全部数据之后,向主动关闭端发送终止连接的请求报文,等待主动关闭端发送终止连接的回复报文TIME-WAIT: 主动关闭端收到被动关闭端终止连接的请求报文后,给被动关闭端发送终止连接的回复报文,等待足够时间以确保被动关闭端收到了主动关闭端发送的终止连接的回复报文CLOSED: 完全没有连接,套接字连接已经终止了 Recv-Q 在 ESTAB 状态下,表示内核中还有多少字节的数据没有被上层应用读取,如果这里数值很大,应用程序可能发生了阻塞 Send-Q 在 ESTAB 状态下,表示内核发送队列中还有多少字节的数据没有收到确认的ACK,如果这个数值很大,表明接收端的接收以及处理需要加强 Local Address:Port 本地地址和端口 Peer Address:Port 远程地址和端口 显示侦听状态的套接字 使用-l选项可以列出所有处于侦听(LISTEN)状态的套接字 [root@ecs-centos-7 ~]# ss -lNetid State Recv-Q Send-Q Local Address:Port Peer Address:Porttcp LISTEN 0 100 127.0.0.1:smtp *:* tcp LISTEN 0 128 *:ssh *:* tcp LISTEN 0 100 [::1]:smtp [::]:* tcp LISTEN 0 254 [::]:mysql [::]:* tcp LISTEN 0 128 [::]:ssh [::]:* 显示所有的套接字 使用-a选项可以列出所有的状态的套接字,由于所有的套接字列表太多,下面的例子中只列出了少许的数据 [root@ecs-centos-7 ~]# ss -aNetid State Recv-Q Send-Q Local Address:Port Peer Address:Porttcp LISTEN 0 100 127.0.0.1:smtp *:*tcp LISTEN 0 128 *:ssh *:*tcp ESTAB 0 16644 192.168.0.9:ssh 27.38.240.99:21669 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.103:kyoceranetdevtcp LISTEN 0 100 [::1]:smtp [::]:*tcp LISTEN 0 254 [::]:mysql [::]:*tcp LISTEN 0 128 [::]:ssh [::]:* 根据协议类型显示 可以通过 TCP、UDP、Unix、Raw、IPV4、IPV6 这些协议类型显示套接字,下面以常用的TCP/UDP/IPV4协议举例说明 ss -ua : 显示Unix套接字ss -wa : 显示Raw套接字ss -6a : 显示IPV6套接字 TCP套接字 使用-t选项(TCP), 让结果只列出TCP套接字 [root@ecs-centos-7 ~]# ss -a -tState Recv-Q Send-Q Local Address:Port Peer Address:PortLISTEN 0 100 127.0.0.1:smtp *:*LISTEN 0 128 *:ssh *:*ESTAB 0 52 192.168.0.9:ssh 27.38.240.99:21787 ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:21669 ESTAB 0 0 192.168.0.9:ssh 27.38.240.103:kyoceranetdevLISTEN 0 100 [::1]:smtp [::]:*LISTEN 0 254 [::]:mysql [::]:*LISTEN 0 128 [::]:ssh [::]:* UDP套接字 使用-u选项(UCP), 让结果只列出UCP套接字 [root@ecs-centos-7 ~]# ss -a -uState Recv-Q Send-Q Local Address:Port Peer Address:PortUNCONN 0 0 *:bootpc *:*UNCONN 0 0 192.168.0.9:ntp *:*UNCONN 0 0 127.0.0.1:ntp *:*UNCONN 0 0 *:ntp *:*UNCONN 0 0 [fe80::f816:3eff:fee0:4fb8]%eth0:ntp [::]:*UNCONN 0 0 [::1]:ntp [::]:*UNCONN 0 0 [::]:ntp [::]:* ipv4 套接字 使用-4选项(IPV4), 让结果只列出IPV4的套接字 [root@ecs-centos-7 ~]# ss -4aNetid State Recv-Q Send-Q Local Address:Port Peer Address:Portudp UNCONN 0 0 *:bootpc *:*udp UNCONN 0 0 192.168.0.9:ntp *:*udp UNCONN 0 0 127.0.0.1:ntp *:*udp UNCONN 0 0 *:ntp *:*tcp LISTEN 0 100 127.0.0.1:smtp *:*tcp LISTEN 0 128 *:ssh *:*tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:21787 识别进程名字 有时我们查询到指定的套接字了,但是无法知道套接字是哪个应用程序在使用,这时可以使用-p选项 [root@ecs-centos-7 ~]# ss -a -t -pState Recv-Q Send-Q Local Address:Port Peer Address:PortLISTEN 0 254 [::]:mysql [::]:* 上面的例子中,从Local Address:Port列可以知道,这个套接字是mysql在使用,如果没有加-p选项的话,这里显示的是mysql的端口号3306 通过端口和进程名筛选 有时候我们启动应用程序的时候,发现端口已经被占用了,此时先要查找出占用目标端口的应用程序,然后关闭它,在启动我们自己的应用程序 通过端口筛选 [root@ecs-centos-7 ~]# ss -ap sport eq 3306Netid State Recv-Q Send-Q Local Address:Port Peer Address:Porttcp LISTEN 0 254 [::]:mysql [::]:* 上面的例子中,sport 表示源,对应的 dst 表示目标,命令查找端口3306是被哪个进程使用了,最终发现3306是mysql在使用 通过端口筛选还支持小于、大于、小于等于、大于等于、不等于,具体的说明如下: ss -ap sport le 3306 : 筛选出源端口小于等于3306的套接字ss -ap sport lt 3306 :筛选出源端口小于3306的套接字ss -ap sport ge 3306 : 筛选出源端口大于等于3306的套接字ss -ap sport gt 3306 : 筛选出源端口大于3306的套接字ss -ap sport ne 3306 : 筛选出源端口不等于3306的套接字 通过进程名筛选 [root@ecs-centos-7 ~]# ss -an sport eq mysqlNetid State Recv-Q Send-Q Local Address:Port Peer Address:Porttcp LISTEN 0 254 [::]:3306 [::]:* 上面的例子中筛选出进程名为mysql的套接字, 执行的命令中-n选项是不解析服务名字,加了此选项就显示成端口了,不会解析成服务名称了 通过IP地址筛选 通过目标地址筛选 下面例子是筛选出目标IP地址为27.38.240.99的套接字,dst 是目标地址 [root@ecs-centos-7 ~]# ss -a dst 27.38.240.99Netid State Recv-Q Send-Q Local Address:Port Peer Address:Porttcp ESTAB 0 52 192.168.0.9:ssh 27.38.240.99:21907 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:21787 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:23260 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:22810 通过源地址筛选 下面例子是筛选出源IP地址为192.168.0.99的套接字,src 是源地址 [root@ecs-centos-7 ~]# ss -a src 192.168.0.9Netid State Recv-Q Send-Q Local Address:Port Peer Address:Portudp UNCONN 0 0 192.168.0.9:ntp *:*tcp ESTAB 0 52 192.168.0.9:ssh 27.38.240.99:21907 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:21787 tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:23260 本文分享自微信公众号 - Linux开发那些事儿(LinuxThings)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

过滤器实栗 登录检测

项目结构 ![](https://melovemingming-1253878077.cos.ap-chengdu.myqcloud.com/blog-image/2019/03/2019-03-17%2004-56-15%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE.png) 代码如下 登录servlet package com.ming.servlrt; import com.ming.factory.DAOFactory; import com.ming.vo.User; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String path = "login.jsp"; // 接收userid内容 String userid = req.getParameter("userid"); // 接收userpass内容 String userpadd = req.getParameter("userpass"); // 保存返回信息 List<String> info = new ArrayList<String>(); if(userid == null || "".equals(userid)){ info.add("用户id不能为空"); } if(userpadd == null || "".equals(userpadd)){ info.add("密码不能为空"); } // 报错信息为0进行验证 if(info.size() == 0){ User user = new User(); user.setUserid(userid); user.setPassword(userpadd); try{ if(DAOFactory.getIuserDAOInstance().findLogin(user)){ info.add("登录成功!" + user.getName()); // 增加session会话 HttpSession session = req.getSession(); session.setAttribute("id", userid); }else{ info.add("登录失败"); } }catch (Exception e){ e.printStackTrace(); } } // 使用服务器端跳转, 保存数据 req.setAttribute("info", info); req.getRequestDispatcher(path).forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } } 对于登录的servlet增加了session 过滤器如下 package com.ming.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; // 首页过滤器 public class LoginFile implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 转型 因为默认的ServletRequest中未提供相关的方法,需要向下转型 HttpServletRequest request = (HttpServletRequest)servletRequest; // 获取到session HttpSession session = request.getSession(); // 判断登录 if(session.getAttribute("id") != null){ // 已经登录 filterChain.doFilter(servletRequest, servletResponse); }else{ // 跳转登录页登录 request.getRequestDispatcher("login.jsp").forward(servletRequest, servletResponse); } } @Override public void destroy() { } } 配置文件如下 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <filter> <filter-name>LoginFile</filter-name> <filter-class>com.ming.filter.LoginFile</filter-class> </filter> <filter-mapping> <filter-name>LoginFile</filter-name> <url-pattern>/index.jsp</url-pattern> </filter-mapping> <servlet> <servlet-name>login</servlet-name> <servlet-class>com.ming.servlrt.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping> </web-app> jsp文件如下 涉及 前端的js验证采用拦截click事件 <%@ page import="java.util.List" %> <%@ page import="java.util.Iterator" %><%-- Created by IntelliJ IDEA. User: ming Date: 19-3-16 Time: 下午11:07 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h2>用户登录程序</h2> <% List<String> info = (List<String>)request.getAttribute("info"); if(info != null){ Iterator<String> iterator = info.iterator(); while(iterator.hasNext()){ %> <h4><%=iterator.next()%></h4> <% } } %> <form action="loginServlet" method="post"> 用户id <input type="text" name="userid" id="uname"/> 密码 <input type="password" name="userpass" id="password"/> <input type="submit" value="登录" id="submit"/> <input type="reset" value="重置"/> </form> <script> let submit = document.getElementById("submit"); submit.onclick = (event) => { let uname = document.getElementById("uname").value; let password = document.getElementById("password").value; if(!(/^\w{1,15}/.test(uname))){ alert("用户id为5-15位"); return false; } if(!(/^\w{1,15}/.test(password))){ alert("密码必须为5-15位"); return false; } return true; } </script> </body> </html>

优秀的个人博客,低调大师

通过shell脚本检测MySQL服务信息

今天改了一版脚本,对于MySQL的基本信息的获取有了一个相对比较清晰的收集方式。 我简单解释下脚本。 整体是分为两部分 第一部分是通过系统层面来解析MySQL的基本信息,方式是通过ps -ef|grep mysql得到的信息来解析。 第二部分是通过登录MySQL得到的信息,基本信息包括server_id,log_bin等。 脚本内容如下: ps -ef|grep mysql |grep -w mysqld|grep -v grep |awk -F'--' '{for (i=2;i<=NF;i++) {printf $i" "}printf " "}' > info_from_sys.tmp function get_info_from_sys() { while read line do array=$line port_str='port=' socket_str='socket=' for arr_tmp in ${array[*]}; do if [[ $arr_tmp =~ $port_str ]];then port_tmp=`echo $arr_tmp|sed 's/port=//g'` fi if [[ $arr_tmp =~ $socket_str ]];then socket_tmp=`echo $arr_tmp|sed 's/socket=//g'` fi done if [ -z "$port_tmp" ];then port_tmp=3306 fi echo $port_tmp $socket_tmp >> info_from_sys.lst done < info_from_sys.tmp } function get_info_from_db() { while read line do port=`echo $line|awk '{print $1}'` #echo $port /usr/local/mysql/bin/mysql -udba_admin -p$dec_passwd -h127.0.0.1 -P${port} -N -e "select @@port,@@log_bin,@@innodb_buffer_pool_size,@@gtid_mode,@@datadir,@@character_set_server,@@server_id,version();" >> info_from_db.lst # echo $port_tmp $socket_tmp done < info_from_sys.lst } function decrypt_passwd { tmp_passwd=$1 dec_passwd=`echo $tmp_passwd|base64 -d` } ##MAIN get_info_from_sys sec_password='RHB6TEST1d1c5TTEzZGIwSgo=' --这个是数据库密码的base64加密串,可以根据需求来定制 dec_passwd='' decrypt_passwd $sec_password get_info_from_db sort info_from_db.lst > info_from_db.tmp sort info_from_sys.lst > info_from_sys.tmp rm info_from_db.lst info_from_sys.lst join -j 1 info_from_sys.tmp info_from_db.tmp 最后送波福利。现在加群即可获取Java工程化、高性能及分布式、高性能、高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限及领取相关资料,群号:835638062 点击链接加入群聊【Java高级架构】:https://jq.qq.com/?_wv=1027&k=5S3kL3v

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册