服务器被DDoS攻击,怎么破?

news2024/10/7 20:37:03

文章目录

    • 前言
    • 网站受到DDoS的症状
    • 判断是否被攻击
      • 查看网络带宽占用
      • 查看网络连接
      • TCP连接攻击
      • SYN洪水攻击
    • 防御措施
      • TCP/IP内核参数优化
      • iptables 防火墙预防
      • 防止同步包洪水(Sync Flood)
      • Ping洪水攻击(Ping of Death)
      • 控制单个IP的最大并发连接数
      • 禁止外部ping
    • 一个实用的防御脚本
    • 安装nginx版安全狗
    • 参考链接

前言

开互联网公司的主要成本是服务器和带宽。产品形态主要是网站和app。搞网站一是软件产品本身的研发,而是防DDoS攻击。为何DDoS是网上主要的攻击手段?因为它成本低,不需要破解。

网站受到DDoS的症状

1.服务器CPU被大量占用
如果服务器某段时期能突然出现CPU占用率过高,那么就可能是网站受到CC攻击影响。
服务器无响应了:
在这里插入图片描述

2.带宽被大量占用
,占用带宽资源通常是DDoS攻击的一个主要手段,毕竟对很多小型企业或者个人网站来说,带宽的资源可以说非常有限,网络的带宽被大量无效数据给占据时,正常流量数据请求很很难被服务器进行处理。如果服务器上行带宽占用率达到90%以上时,那么你的网站通常出现被DDoS攻击的可能。

3服务器连接不到,网站也打不开
如果网站服务器被大量DDoS攻击时,有可能会造成服务器蓝屏或者死机,这时就意味着服务器已经连接不上了,网站出现连接错误的情况。当然出现这种请求时我们最好是确认一下服务器是否是硬件故障等所导致出现的问题,否者在进行服务器连接时就要做好相关的防御首段。

4.域名ping不出IP
可能这种情况站长们可能会比较少考虑到,这其实也是DDoS攻击的一种表现,只是攻击着所针对的攻击目标是网站的DNS域名服务器。在出现这种攻击时,ping服务器的IP是正常联通的,但是网站就是不能正常打开,并且在ping域名时会出现无法正常ping通的情况。

判断是否被攻击

查看网络带宽占用

安装工具nethogs:

apt-get install nethogs

使用:

nethogs eth0

也可以安装iftop工具。
在这里插入图片描述

查看网络连接

netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n

netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
输出:
ESTABLISHED 4
TIME_WAIT 3

netstat -na命令观察到有大量的SYN_RECEIVED、TIME_WAIT、FIN_WAIT_1等状态存在,而ESTABLISHED很少,则可判定肯定是遭受了资源耗尽攻击。

如果ESTABLISHED非常地高,那么可能是有人在恶意攻击,进一步判断,可以把下面命令保存为脚本执行一下:

for i in `netstat -an | grep -i ':80 '|grep 'EST' | awk '{print $5}' | cut -d : -f 1 | sort | uniq -c | awk '{if($1 > 50) {print $2}}'`

do
   echo $i
   echo $i >> /tmp/evilip
done

如果输出了多个结果,那么可能表示有人在企图进行DDOS攻击,想用TCP连接来拖死你的服务器,输出的ip就是发出请求的服务器地址,并且保存在了/tmp/evilip里面。如果没有结果,可以调整一下阈值,把50改成40试一试。

如果SYN_RECV非常高,那么表示受到了SYN洪水攻击。

如果上面的值看不出什么异常的话,我们来抓包分析下,可能并非基于TCP的攻击。抓包命令:

tcpdump -w tmp.pcap port not 22

抓包感觉差不多了就ctrl+c结束,结果在保存在当前目录下的tmp.pcap文件中,我们可以使用命令

tcpdump -r tmp.pcap -nnA

来查看,也可以拖回本地用wireshark打开分析等,个人喜好了。如果出现大量的ICMP包或者大量的UDP包,那么可能就是针对性的ICMP洪水以及UDP洪水了。

TCP连接攻击

TCP连接攻击算是比较古老的了,防御起来也相对比较简单,主要是利用大量的TCP连接来消耗系统的网络资源,通常同一个IP会建立数量比较大的TCP连接,并且一直保持。应对方法也比较简单,可以将以下命令保存为脚本,定时ban掉那些傀儡机ip

for i in `netstat -an | grep -i ':80 '|grep 'EST' | awk '{print $5}' | cut -d : -f 1 | sort | uniq -c | awk '{if($1 > 50) {print $2}}'`

do
	echo $i
	echo $i >> /tmp/banip
	/sbin/iptables -A INPUT -p tcp -j DROP -s $i
done

banip文件里面记录了所有被ban的ip地址信息,方面进行反渗透以及证据保存等等。为了更好地加固系统,我们可以使用iptables来限制一下,单个ip的最大连接数。

iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT

限制每个ip的连接数为10。如果是大些业务系统的话,需要注意,上面的做法可能导致一些共用IP的用户访问中断。需要谨慎。

SYN洪水攻击

SYN洪水是利用TCP/IP协议的设计缺陷来进行攻击的,采用一些策略以及配置可以适当的降低攻击的影响,但并不能完全消除。

sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_syn_retries = 0
sysctl -w net.ipv4.tcp_max_syn_backlog=2048

tcp_syncookies设置为1表示启用syncookie,可以大大降低SYN攻击的影响,但是会带来新的安全缺陷。

tcp_syn_retries 表示syn重试次数,重传次数设置为0,只要收不到客户端的响应,立即丢弃该连接,默认设置为5次。

tcp_max_syn_backlog表示syn等待队列,改小这个值,使得SYN等待队列变短,减少对系统以及网络资源的占用。

当攻击者的资源非常的多,上面这些方法限制可能就没有什么防护效果了,面对大流量DDoS攻击还是要考虑采用多机负载或者选择墨者安全高防来应对了,一般来说多机负载的成本可能更高,所以大部分人还是选择高防硬防产品来防御。

防御措施

目前没有一招制敌的办法。只能多措并举,多管齐下。

  • 网站静态化
  • 备份网站,方便切换。有点靠谱。
  • 隐藏真实IP,采用CDN。源服务器前面有 CDN。如果攻击域名,CDN 可以挡住;如果直接攻击源服务器,可以考虑采用弹性 IP。

cdn的全称是Content Delivery Network,即内容分发网络。 cdn是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。 cdn的关键技术主要有内容存储和分发技术。

CDN已经从过去的网页缓存、网页动态加速的功能到如今兼具着保护网站不被攻击的使命和责任。一旦遇到CDN存在被DDoS攻击的情况,CDN整个系统就能够将被攻击的流量分散开,节省了站点服务器的压力以及节点压力。

  • 加大带宽,说了白说,小公司哪买得起那么大的带宽?
  • 安装专业抗DDoS防火墙。装不起。
  • 尽量避免NAT的使用。不明白。
  • 买阿里或华为的DDoS高防服务。太贵,买不起。

当然,针对Linux服务器,还是能做一些基本防护的。

TCP/IP内核参数优化

net.ipv4.tcp_max_syn_backlog = 4096      #表示SYN队列的长度,加大队列长度可以容纳更多等待连接的网络连接数
net.ipv4.tcp_syncookies = 1              #表示开启SYN Cookies功能。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭,1表示打开;
net.ipv4.tcp_synack_retries = 2          #下面这两行表示定义SYN重试次数
net.ipv4.tcp_syn_retries = 2      
 
#提高TCP连接能力
net.ipv4.tcp_rmem = 32768
net.ipv4.tcp_wmem = 32768
net.ipv4.tcp_sack = 0     #打开tcp_sack功能,1表示"关闭",0表示"打开"

然后运行 sysctl -p 使上面配置生效

iptables 防火墙预防

先查看服务器上连接web端口(比如80端口)的哪个ip是最多的,如果发现可疑ip,就果断将其断开与服务器连接

查看80端口的连接情况
[root@test3-237 ~]# netstat -an | grep “:80” | grep ESTABLISHED

下面的命令表示获取服务器上ESTABLISHED连接数最多的前10个ip,排除了内部ip段192.168|127.0开头的。
[root@test3-237 ~]# /bin/netstat -na|grep ESTABLISHED|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -rn|head -10|grep -v -E ‘192.168|127.0’
4001 140.205.140.205
2388 124.65.197.154
1807 111.205.224.15
18 10.51.58.16

将上面140.205.140.205、124.65.197.154、111.205.224.15的这三个ip的包丢弃
[root@test3-237 ~]# iptables -A INPUT -s 140.205.140.205 -p tcp -j DROP
[root@test3-237 ~]# iptables -A INPUT -s 124.65.197.154 -p tcp -j DROP
[root@test3-237 ~]# iptables -A INPUT -s 111.205.224.15 -p tcp -j DROP
[root@test3-237 ~]# service iptables save
[root@test3-237 ~]# service iptables restart

不过上面的方法对于伪造源IP地址的SYN FLOOD攻击就无效了!

防止同步包洪水(Sync Flood)

防止同步包洪水(Sync Flood),可以缩短SYN-Timeout时间:

[root@test3-237 ~]# iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
[root@test3-237 ~]# iptables -A INPUT -i eth0 -m limit --limit 1/sec --limit-burst 5 -j ACCEPT
 

其中:
–limit 1/s 限制syn并发数每秒1次,可以根据自己的需要修改防止各种端口扫描

[root@test3-237 ~]# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

Ping洪水攻击(Ping of Death)

[root@ ~]# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

控制单个IP的最大并发连接数

如下设置表示:允许单个IP的最大连接数为 30

[root@test3-237 ~]# iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT

控制单个IP在一定的时间(比如60秒)内允许新建立的连接数。
如下设置表示:单个IP在60秒内只允许最多新建30个连接

[root@test3-237 ~]# iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT
[root@test3-237 ~]# iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT

如果出现报错:

iptables: Invalid argument. Run `dmesg’ for more information.

解决办法:

增加 xt_recent模块的参数值即可,默认是20
[root@test3-237 ~]# cat /sys/module/xt_recent/parameters/ip_pkt_list_tot
20
[root@test3-237 ~]# echo 50 > /sys/module/xt_recent/parameters/ip_pkt_list_tot
[root@test3-237 ~]# cat /sys/module/xt_recent/parameters/ip_pkt_list_tot
50
---------------------------------------------------------------------------------------------------

禁止外部ping

[root@test3-237 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

用iptables屏蔽IP(如下禁止213.8.166.237连接本机的80端口)

[root@test3-237 ~]# iptables -A INPUT -s 213.8.166.227 -p tcp -m tcp -m state --state NEW --dport 80 --syn -j REJECT
 

允许某ip连接(如下允许13.78.66.27连接本机的80端口)

[root@test3-237 ~]# iptables -A INPUT -s 13.78.66.27 -p tcp -m tcp -m state --state NEW --dport 80 --syn -j ACCEPT

DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本。它通过netstat监测跟踪创建大量网络连接的IP地址,在检测到某个结点超过预设的限制时,该程序会通过APF或IPTABLES禁止或阻挡这些IP.
DDoS deflate其实是一个Shell脚本,使用netstat和iptables工具,对那些链接数过多的IP进行封锁,能有效防止通用的恶意扫描器,但它并不是真正有效的DDoS防御工具。

DDoS deflate工作过程描述:
同一个IP链接到服务器的连接数到达设置的伐值后,所有超过伐值的IP将被屏蔽,同时把屏蔽的IP写入ignore.ip.list文件中,与此同时会在tmp中生成一个脚本文件,这个脚本文件马上被执行,但是一
运行就遇到sleep预设的秒,当睡眠了这么多的时间后,解除被屏蔽的IP,同时把之前写入ignore.ip.list文件中的这个被封锁的IP删除,然后删除临时生成的文件。
一个事实:如果被屏蔽的IP手工解屏蔽,那么如果这个IP继续产生攻击,那么脚本将不会再次屏蔽它(因为加入到了ignore.ip.list),直到在预设的时间之后才能起作用,加入到了ignore.ip.list中的
IP是检测的时候忽略的IP。可以把IP写入到这个文件以避免这些IP被堵塞,已经堵塞了的IP也会加入到ignore.ip.list中,但堵塞了预定时间后会从它之中删除。

如何确认是否受到DDOS攻击?

[root@test3-237 ~]# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
      1 Address
      1 servers)
      2 103.10.86.5
      4 117.36.231.253
      4 19.62.46.24
      6 29.140.22.18
      8 220.181.161.131   
      2911 167.215.42.88

每个IP几个、十几个或几十个连接数都还算比较正常,如果像上面成百上千肯定就不正常了。比如上面的167.215.42.88,这个ip的连接有2911个!这个看起来就很像是被攻击了!

下面就说下通过DDoS deflate脚本来自动屏蔽DDOS攻击的ip

1)下载DDoS deflate安装脚本,并执行安装。
[root@test3-237 ~]# wget http://www.inetbase.com/scripts/ddos/install.sh
[root@test3-237 ~]# chmod 0700 install.sh
[root@test3-237 ~]# ./install.sh

卸载DDos default的操作如下:

--------------------------------------------------------------------------

# wget http://www.inetbase.com/scripts/ddos/uninstall.ddos
# chmod 0700 uninstall.ddos
# ./uninstall.ddos
--------------------------------------------------------------------------

2)配置DDoS deflate下面是DDoS deflate的默认配置位于/usr/local/ddos/ddos.conf ,内容如下:

[root@test3-237 ~]# cat /usr/local/ddos/ddos.conf
##### Paths of the script and other files
PROGDIR="/usr/local/ddos"
PROG="/usr/local/ddos/ddos.sh"
IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list"         //IP地址白名单
CRON="/etc/cron.d/ddos.cron"                            //定时执行程序
APF="/etc/apf/apf"
IPT="/sbin/iptables"
 
##### frequency in minutes for running the script
##### Caution: Every time this setting is changed, run the script with --cron
#####          option so that the new frequency takes effect
FREQ=1                        //检查时间间隔,默认1分钟。设置检测时间间隔,默认是分钟,由于系统使用crontab功能,最小单位是分钟
 
##### How many connections define a bad IP? Indicate that below.
NO_OF_CONNECTIONS=150             //最大连接数,超过这个数IP就会被屏蔽,一般默认即可。默认是150,这是一个经验值,如果服务器性能比较高,可以设置200以上,以避免误杀
 
##### APF_BAN=1 (Make sure your APF version is atleast 0.96)
##### APF_BAN=0 (Uses iptables for banning ips instead of APF)
APF_BAN=0                      //使用APF还是iptables屏蔽IP。推荐使用iptables,将APF_BAN的值改为0即可。设置为1表示使用APF,如果使用APF则需要先安装,centos中默认就没有安装
 
##### KILL=0 (Bad IPs are'nt banned, good for interactive execution of script)
##### KILL=1 (Recommended setting)
KILL=1                        //是否屏蔽IP,默认即可
 
##### An email is sent to the following address when an IP is banned.
##### Blank would suppress sending of mails
EMAIL_TO="root"              //当IP被屏蔽时给指定邮箱发送邮件,推荐使用,换成自己的邮箱即可。如果不希望发送邮件,设置为空,即EMAIL_TO=""
 
##### Number of seconds the banned ip should remain in blacklist.
BAN_PERIOD=600              //禁用IP时间(锁定ip的时间),默认600秒,可根据情况调整

需要注意的是:
DDos default安装完成后在/usr/local/ddos目录下产生了ddos.conf、ddos.sh、ignore.ip.list和LICENSE这四个文件,其中:
ddos.conf是配置文件,ddos.sh是一个Shell文件,ignore.ip.list是存放忽略IP的文件,LICENSE是版权声明文件,安装完成后还在/etc/cron.d/下生产了ddos.cron文件,内容如下:

[root@test3-237 ~]# cat /etc/cron.d/ddos.cron
SHELL=/bin/sh
0-59/1 * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1

意思是每隔一分钟执行一下/usr/local/ddos/ddos.sh,这个脚本是关键!
这个cron任务是依赖ddos.conf文件中的NO_OF_CONNECTIONS变量产生的,如果修改了此值,可以通过运行如下命令更新(实际也是在安装是运行了如下命令):

[root@test3-237 ~]# /usr/local/ddos/ddos.sh -c
Stopping crond:                                            [  OK  ]
Starting crond:                                            [  OK  ]
Stopping crond:                                            [  OK  ]
Starting crond:                                            [  OK  ]
 

或者

[root@test3-237 ~]# /usr/local/ddos/ddos.sh --cron
Stopping crond:                                            [  OK  ]
Starting crond:                                            [  OK  ]
Stopping crond:                                            [  OK  ]
Starting crond:                                            [  OK  ]
 

3)DDos default选项

# /usr/local/ddos/ddos.sh -h       #查看选项
# /usr/local/ddos/ddos.sh -k n     #杀掉连接数大于n的连接。n默认为配置文件的NO_OF_CONNECTIONS
  比如:
  [root@test3-237 ~]# /usr/local/ddos/ddos.sh -k 150
      2 103.110.186.75
      1 servers)
      1 Address
# /usr/local/ddos/ddos.sh -c       #按照配置文件创建一个执行计划。使得ddos.conf文件配置后生效

一个实用的防御脚本

Linux服务器中一旦受到DDOS的攻击(比如IDC机房服务器被攻击了,关机,拔网线,降流量),目前只能通过封IP来源来暂时解决。然而IP来源变化多端,光靠手工来添加简直是恶梦,所以还是想办法写个shell脚本来定时处理,这才是比较靠谱的办法。

#!/bin/bash
/bin/netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -10|grep -v -E '192.168|127.0'|awk '{if ($2!=null && $1>4) {print $2}}'>/tmp/dropip
for i in $(cat /tmp/dropip)
do
   /sbin/iptables -A INPUT -s $i -j DROP
   echo$i kill at `date`>>/var/log/ddos
done
 

以上脚本中最重要的是第二行,即:
获取ESTABLISHED连接数最多的前10个ip并写入临时文件/tmp/dropip,排除了内部ip段192.168|127.0开头的.通过for循环将dropip里面的ip通过iptables全部drop掉,然后写到日志文件/var/log/ddos。

下面是针对连接数屏蔽IP:

#!/bin/sh 
/bin/netstat -ant |grep 80 |awk '{print $5}' |awk -F":" '{print $1}' |sort |uniq -c |sort -rn |grep -v -E '192.168|127.0' |awk '{if ($2!=null && $1>50)}' > /root/drop_ip.txt 
for i in `cat /root/drop_ip.txt` 
do 
  /sbin/iptables -I INPUT -s $i -j DROP; 
done 

安装nginx版安全狗

[root@icool ~]# wget http://safedog.cn/safedogwz_linux_Nginx64.tar.gz
[root@icool ~]# tar -zvxf safedogwz_linux_Nginx64.tar.gz
[root@icool ~]# cd safedogwz_linux_Nginx64
[root@icool safedogwz_linux_Nginx64]# chmod 755 install.py
[root@icool]# ls
install_files  install.py  uninstall.py
[root@icool]# ./install.py -A          //卸载安全狗就用uninstall.py
.......
  step 3.5, start service...                                                                      [ok]
  step 3.6, save safedog install info...                                                          [ok]
   Tips:
  (1)Run the command to setup Server Defense Module: sdui
  (2)Explore more features by tapping the command to join Cloud Management Center (fuyun.safedog.cn) with your account:  sdcloud -h
 
If you need any help about installation,please tap the command: ./install.py -h
Install Completely!

温馨提示:
1)安装完成后,记得一定要重新启动Nginx服务,网站安全狗软件即可生效。
2)运行时,安装脚本默认将自动获取Nginx服务的安装路径;若自动获取失败则将提示输入Nginx服务的安装路径(绝对路径),需要根据所安装的Nginx的目录,填写真实的安装路径。
3)当出现提示:Are you sure to uninstall?[y/n]时,输入y

参考链接

  • 防DDoS脚本
  • Nginx-Lua-Anti-DDoS
  • Anti-DDOS-Script

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的私人健身和教练的预约管理系统源码数据库论文

目 录 第一章 概述 1.1研究背景 1.2开发意义 1.3研究现状 1.4研究内容 1.5论文结构 第二章 开发技术介绍 2.1系统开发平台 2.2平台开发相关技术 2.2.1 Javar技术 2.2.2 Mysql数据库介绍 2.2.3 Mysql环境配置 2.2.4 B/S架构 2.2.5 Springboot框架 …

主动配电网故障恢复的重构与孤岛划分统一模型研究【升级版本】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

V8引擎执行原理

v8是C编写的Google开源高性能JavaScript和WebAssembly引擎,它用于Chrome和Node.js等。 它实现ECMAScript和WebAssembly。 v8可独立运行,也可嵌入到任何C应用程序中。 parse模块 parse模块会将JavaScript代码转换成AST(抽象语法树),因为解…

[LeetCode周赛复盘] 第 340 场周赛20230409

[LeetCode周赛复盘] 第 340 场周赛20230409 一、本周周赛总结二、 6361. 对角线上的质数1. 题目描述2. 思路分析3. 代码实现三、6360. 等值距离和1. 题目描述2. 思路分析3. 代码实现四、6359. 最小化数对的最大差值1. 题目描述2. 思路分析3. 代码实现五、 6353. 网格图中最少访…

【排序】排序这样写才对Ⅰ --插入排序与选择排序

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…

Axios请求(对于ajax的二次封装)——Axios请求的响应结构、默认配置

Axios请求(对于ajax的二次封装)——Axios请求的响应结构、默认配置知识回调(不懂就看这儿!)场景复现核心干货axios请求的响应结构响应格式详解实际请求中的响应格式axios请求的默认配置全局axios默认值(了解…

Debug | wget 的安装与使用(Windows)

!wget -nc http://labfile.oss.aliyuncs.com/courses/780/WeatherData.zip 报错信息: wget 不是内部或外部命令,也不是可运行的程序或批处理文件。 分析: 在jupyter notebook中做机器学习时导入数据使用!wget遇到了这个问题,查到…

轻松上手git代码版本管理工具--协同开发-冲突解决、线上分支合并以及使用pycharm操作git

一、协同开发 多人合作开发一个项目---->多人公用一个远程仓库 以后台项目为例: git init # git管理设置忽略文件.gitignore git add .git commit -m 第一次提交,写完了首页功能远程新建一个远程仓库(空) 创建一个origin git remote add origin git@gitee.com:xx…

穿戴规范智能识别系统 yolov7

穿戴规范智能识别系统通过yolov7python网络模型AI深度视觉学习算法,穿戴规范智能识别系统对工厂画面中人员穿戴行为自动识别分析,发现现场人员未按照规定穿戴着装,立即抓拍告警。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c…

垃圾满溢检测系统 yolov5

垃圾满溢检测系统通过pythonyolov5网络模型技术,垃圾满溢检测系统对控画面中小区内的垃圾桶进行7*24小时不间断监控,发现垃圾桶溢满周围有堆积物立即触发预警推送给相关人员处理。YOLOv5中在训练模型阶段仍然使用了Mosaic数据增强方法,该算法…

kubeadm方式部署k8s最新版本V1.26.2

Kubernetes核心概念 Master主要负责资源调度,控制副本,和提供统一访问集群的入口。--核心节点也是管理节点 Node是Kubernetes集群架构中运行Pod的服务节点。Node是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿…

测试7年,去过阿里也去过小公司,给你们年轻人一个忠告...

你眼中的软件测试岗位是怎样的?大部分人可能会给出这样的回答:“测试?简单啊,没什么技术含量,无非就是看需求、看业务手册、看设计文档、然后点点功能是否实现,麻烦点的就是测试下部署安装是否出现兼容性问…

分布式事务Seata原理

Seata 是一款开源的分布式事务解决方案,致力于提供高性能与简单易用的分布式事务服务,为用户提供了 AT、TCC、SAGA 和 XA 几种不同的事务模式。Seata AT模式是基于XA事务演进而来,需要数据库支持。AT 模式的特点就是对业务无入侵式&#xff0…

【故障定位】基于多元宇宙算法的主动配电网故障定位方法研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

LeetCode 37. 解数独

一、题目描述 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图&#x…

如果重回大学时光

目录如果重回大学时光1. 多参加社团活动,结交更多的朋友2. 认真考虑专业分流方向3. 根据兴趣和能力选择适合自己的出路4. 为未来做好准备,规划职业发展如果重回大学时光 当前我是一名普通的码农,还有几个月,又将有一批大学生将毕…

vue实现美观大方的动漫、cos、帖子类型网站

一、先上效果图 1.项目demo预览:点击预览 参照半次元的榜单-绘画榜、榜单-COS榜、榜单-写作榜、个人中心、登录注册页面,导航栏等,分别实现页面排版、数据交互、基础框架布局搭建以及自定义vue组件合理的封装及使用。在vue项目开发过程中&a…

梦中情树---二叉树

前言: 今天就来讲树的一种特殊结构---二叉树 当然先来给大家看一张图片 看到这棵树了吗?它从根开始,每个结点都有且仅有两个分支,这个结构就是我们的二叉树。 其实我们上次讲的堆也可以看成一棵二叉树,但是人家的本质…

【python】Jupyter的使用(python代码编辑器)

文章目录一、Jupyter的介绍1、Jupyter是什么?2、Jupyter有什么独特之处?二、Jupyter的安装1、首先要下载python2、用pip命令下载Jupyter三、Jupyter的使用1、运行Jupyter2、简要介绍Jupyter的使用方法3、快捷键的使用四、总结一、Jupyter的介绍 1、Jupy…

安卓系统软键盘初步分析

初步分析的相关日志 复现log: 11-05 14:01:24.768 7991 7991 V InputMethodManager: onViewClicked: true 11-05 14:01:24.768 7991 7991 D InputMethodManager: showSoftInput() viewandroidx.appcompat.widget.AppCompatEditText{bd0acc9 VFED..CL. .F.P..ID 0,0-900,9…