Appearance
Linux相关操作
Linux安装oracle jdk17
shell
# 从Oracle官网(https://www.oracle.com/java/technologies/downloads/)下载JDK 17
wget --no-check-certificate -c --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
tar -xvf jdk-17_linux-x64_bin.tar.gz
sudo cp -r jdk-17 /opt/
# 使用以下命令来配置默认的Java版本为jdk17
sudo alternatives --install /usr/bin/java java /opt/jdk-17/bin/java 1
sudo alternatives --set java /opt/jdk-17/bin/java
# 验证
java -version配置jdk环境
shell
# 方式一
export JAVA_HOME=/opt/jdk-17
export PATH=$PATH:$JAVA_HOME/bin
# 方式二
vim ~/.bashrc
export JAVA_HOME=/opt/jdk-17
export PATH=$PATH:$JAVA_HOME/bin
source ~/.bashrc
# 验证
echo $JAVA_HOME防火墙相关操作
firewall-cmd
shell
# 检查firewalld的状态
systemctl status firewalld
# 启动firewalld
systemctl start firewalld
# 查看当前的防火墙规则
firewall-cmd --list-all
# 开发或关闭端口
firewall-cmd --zone=public --add-port=8082/tcp --permanent # 开放5672端口
firewall-cmd --zone=public --remove-port=8090/tcp --permanent #关闭5672端口
# 重新加载防火墙
firewall-cmd --reload # 配置立即生效
# 只允许特定IP访问6379端口(--zone=public可写可不写)
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="120.231.51.225" port protocol="tcp" port="3306" accept'
# 移除规则
firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="120.239.47.247" port protocol="tcp" port="6379" accept'
# 查看防火墙所有开放的端口(--zone=public可写可不写)
firewall-cmd --zone=public --list-ports
# 关闭防火墙
systemctl stop firewalld.service
# 查看防火墙状态
firewall-cmd --state
# 查看监听的端口
netstat -lnpt
# 检查端口被哪个进程占用
netstat -lnpt |grep 8081
# 查看端口规则是否生效
netstat -an | grep 80
# 查看进程的详细信息
ps 6832IPtable
shell
# 查看当前规则(默认是 `filter`表)
iptables -L -n -v #`-v`:详细模式,显示更多信息
# 查看`nat`表的规则
iptables -t nat -L -n -v
# 列出`nat`表的规则及其编号
iptables -t nat -L OUTPUT --line-numbers -v -n #`-v`:详细模式,显示更多信息
# 添加规则
iptables -t nat -A OUTPUT -p tcp -d openai.com --dport 443 -j REDIRECT --to-ports 10811
iptables -t nat -A OUTPUT -p tcp -d platform.openai.com --dport 443 -j REDIRECT --to-ports 10811
iptables -t nat -A OUTPUT -p tcp -d chat.openai.com --dport 443 -j REDIRECT --to-ports 10811
# 添加规则,IP 地址代替域名(使用 `dig sentry.io 或 `nslookup sentry.io` 来获取 `sentry.io` 的 IP 地址,并在规则中用 IP 地址代替域名)
iptables -t nat -A OUTPUT -p tcp -d 35.186.247.156 --dport 443 -j REDIRECT --to-ports 10889
# 使用编号删除规则
iptables -t nat -D OUTPUT <规则的行号>
# 使用内容删除规则
iptables -t nat -D OUTPUT -p tcp -d openai.com --dport 443 -j REDIRECT --to-ports 10811
# 删除所有的 `nat` 表的 `OUTPUT` 链规则
iptables -t nat -F OUTPUT
# 修改 `iptables` 规则后,让这些变更在系统重启后保留,在 Red Hat 和 CentOS 上,你可能需要使用 `service iptables save` 命令
iptables-save > /etc/iptables/rules.v4iptables相关表:
filter表:默认的表,处理大多数的包过滤规则。
nat表:用于处理网络地址转换(NAT)的规则,包括端口转发。
mangle表:用于更改包头字段的规则。
raw表:用于配置不走连接跟踪的规则。
security表:用于通过 SELinux 等安全模块设置的规则。
ufw
shell
# 安装
sudo apt install ufw
# 启用
sudo ufw enable
# 禁用防火墙
sudo ufw disable
# 检查 UFW 服务状态
systemctl status ufw
# 开机自启
systemctl enable ufw
# 查看 UFW 状态
sudo ufw status
# 查看详细状态
sudo ufw status verbose
# 查看带编号的规则列表
sudo ufw status numbered
# 删除规则
sudo ufw delete [规则编号]
# 开放 TCP 端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 19999:29999/tcp
# 开放 UDP 端口
sudo ufw allow 80/udp
sudo ufw allow 443/udp
sudo ufw allow 19999:29999/udp
# 删除 TCP 规则
sudo ufw delete allow 19999:29999/tcp
# 删除 UDP 规则
sudo ufw delete allow 19999:29999/udp
# 重新加载 UFW 使规则生效
sudo ufw reload
# 首先删除现有的开放规则
sudo ufw delete allow 19999:29999/tcp
sudo ufw delete allow 19999:29999/udp
# 添加仅允许特定IP访问的规则
sudo ufw allow from 175.178.251.149 to any port 19999:29999 proto tcp
sudo ufw allow from 175.178.251.149 to any port 19999:29999 proto udp
# 删除现有的开放规则
sudo ufw delete allow from 47.79.6.104 to any port 19999:29999 proto tcp
sudo ufw delete allow from 47.79.6.104 to any port 19999:29999 proto udp重定向特定域名到特定端口
要在 Linux 中通过匹配域名(如后缀为
sentry.io的请求)来实现流量转发,通常需要使用能够解析和处理域名的代理工具。由于iptables本身不能直接基于域名操作,以下工具可以帮助你实现基于域名的流量转发
1、dnsmasq + iptables
shell
apt install dnsmasq
# 配置 dnsmasq
#在 `/etc/dnsmasq.conf` 中配置 `sentry.io` 域名解析为本地 IP 地址。
#例如,添加以下配置以将 `sentry.io` 的所有请求解析到本地(127.0.0.1):
address=/sentry.io/127.0.0.1
iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 10889
iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 443 -j REDIRECT --to-port 10889
#修改服务器的dns服务为dnsmas,将 `/etc/resolv.conf` 中的 DNS 服务器地址指向本地 `dnsmasq` 服务(通常是 `127.0.0.1`)
cp /etc/resolv.conf /etc/resolv.conf.bak
vim nano /etc/resolv.conf
# 修改为如下内容
#nameserver 127.0.0.1
# 防止 `resolv.conf` 被重写,将 `/etc/resolv.conf` 设为只读
chattr +i /etc/resolv.conf
# 取消只读属性
chattr -i /etc/resolv.conf
systemctl restart dnsmasq
# 测试解析,解析结果应该是 `127.0.0.1`
nslookup sentry.io2、Squid 代理
shell
apt install squid
#配置 Squid 规则
#编辑 Squid 的配置文件 `/etc/squid/squid.conf`,添加以下规则:
acl sentry dstdomain .sentry.io
http_access allow sentry
url_rewrite_program /usr/bin/redirect_script.sh
#编写重定向脚本 `redirect_script.sh`
#!/bin/bash
while read url; do
echo "http://127.0.0.1:10889" # 将请求重定向到本地端口
done
#启动 Squid 代理
systemctl restart squid3、HAProxy
shell
apt install haproxy
#编辑 HAProxy 配置文件 `/etc/haproxy/haproxy.cfg`
frontend sentry_frontend
bind *:80
acl sentry_domain hdr_end(host) -i sentry.io
use_backend sentry_backend if sentry_domain
backend sentry_backend
server local_sentry 127.0.0.1:10889
#启动 HAProxy
systemctl restart haproxy4、nslookup sentry.io解释出ip然后直接让iptables转发
shell相关操作
shell
# 后台启动应用
nohup java -jar /home/chatbot/start-1.0-SNAPSHOT.jar> /dev/null 2>&1 &
# 日志输出到指定文件夹并后台运行
nohup yarn start >> /home/chatgpt/logs/logfile.log 2>&1 & disown
# 代理方式
nohup proxychains node ./node_modules/.bin/next start >> /home/chatgpt/logs/logfile.log 2>&1 & disown
# 创建文件
touch /home/chatgpt/logs/logfile.log
# 查看所有正在运行的yarn进程
ps aux | grep yarn
# 只查看后台运行的yarn进程
ps aux | grep 'yarn start' | grep -v grep
# 关闭项目
pkill -f "yarn start"
# centos8换成阿里源
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
yum clean all
yum makecache
# 更改时区
timedatectl set-timezone Asia/Shanghai
# 查看当前时区
date
# 把当前目录及子目录所有文件压缩成一个gz压缩包
tar -zcvf filename.tar.gz .
# 使用 `tar` 命令进行解压
tar -zxvf filename.tar.gz
# 忽略"file changed as we read it"的警告信息,强制进行解压缩
tar --warning=no-file-changed -zxvf filename.tar.gz
# 使用 `gunzip` 命令直接解压 `.tar.gz` 文件
gunzip filename.tar.gz
# 删除当前文件夹中的所有文件,包括隐藏文件和文件夹
find . -mindepth 1 -delete
# 启用严格模式:任何命令失败都会导致脚本退出
# 注意:sh 不支持 pipefail,所以只使用 -eu
set -eu
#vim保留格式粘贴
:set paste
# 显示当前用户的所有环境变量
env
# 显示所有环境变量
printenv
# 临时设置变量
export MY_VAR="hello"
# 永久设置环境变量
在用户或系统级文件中配置export语句,然后source 文件生效
# 查看特定环境变量
echo $变量名 - 例如:echo $PATH
printenv 变量名 - 例如:printenv HOME
env | grep 变量名 - 例如:env | grep PATH
# 删除环境变量,临时删除(当前会话生效)
unset 变量名
# 永久删除环境变量
用户级别配置文件:
~/.bashrc - bash shell配置文件
~/.profile - 通用shell配置文件
~/.bash_profile - bash登录shell配置文件
系统级别配置文件:
/etc/environment - 系统环境变量
/etc/profile - 系统级shell配置
操作步骤:
编辑相应配置文件:nano ~/.bashrc
找到并删除相关的export语句
保存文件并重新加载:source ~/.bashrctail命令相关用法
shell
# 查看文件最后10行(默认)
tail filename.log
# 查看最后N行
tail -n 20 filename.log
# 或简写
tail -20 filename.log
# 实时查看文件新增内容
tail -f filename.log
# 实时查看最后20行并持续监控
tail -n 20 -f filename.log
# 当文件被删除重建后继续监控(推荐用于日志轮转)
tail -F filename.log
# 同时监控多个文件
tail -f file1.log file2.log
# 显示文件名标题
tail -f -v *.log
# 从第N行开始显示到末尾
tail -n +50 filename.log
# 结合grep过滤关键字
tail -f app.log | grep ERROR
# 显示最后N个字节
tail -c 100 filename.logdocker logs用法
shell
# 查看最后10条日志
docker logs --tail 10 container_name
# 查看最后50条日志
docker logs --tail 50 container_name
# 只查看最后1条日志
docker logs --tail 1 container_name
# 实时查看日志(类似 tail -f)
docker logs -f container_name
# 查看最后20条日志并实时监控新日志
docker logs --tail 20 -f container_name
# 实时查看并显示时间戳
docker logs -f -t container_name
# 查看指定时间之后的日志
docker logs --since 30m container_name # 最近30分钟
docker logs --since 2h container_name # 最近2小时
docker logs --since "2025-10-01T10:00:00" container_name
# 查看指定时间之前的日志
docker logs --until "2025-10-01T12:00:00" container_name
# 组合使用
docker logs --since 1h --tail 100 -f container_name
# 显示时间戳
docker logs -t --tail 50 container_name
# 查看最后100条日志并实时跟踪,同时显示时间戳
docker logs --tail 100 -ft container_name
# 查看最近1小时的最后50条日志
docker logs --since 1h --tail 50 container_name
# 结合 grep 过滤关键字
docker logs --tail 200 container_name | grep ERROR
# 查看多个容器的日志(需要多个命令)
docker logs -f container1 &
docker logs -f container2 &proxychains4
text
apt install proxychains4 -y
echo "http 127.0.0.1 10889" >> /etc/proxychains4.confTShark
shell
# 打印http协议流相关信息
tshark -s 512 -i eth0 -n -f 'tcp dst port 80' -Y 'http.host and http.request.uri' -T fields -e http.host -e http.request.uri -l | tr -d '\t'
# 打印http协议流相关信息(非root方式运行,提高安全性)
sudo -u wireshark tshark -s 512 -i eth0 -n -f 'tcp dst port 80' -Y 'http.host and http.request.uri' -T fields -e http.host -e http.request.uri -l | tr -d '\t'
注释:
-s: 只抓取前512字节;
-i: 捕获eth0网卡;
-n: 禁止网络对象名称解析;
-f: 只捕获协议为tcp,目的端口为80;
-Y: 过滤出http.host和http.request.uri;
-T,-e: 指的是打印这两个字段;
-I: 输出到命令行界面;
# 创建 wireshark 用户
sudo groupadd wireshark
sudo usermod -a -G wireshark $USER
sudo chgrp wireshark /usr/bin/dumpcap
sudo chmod 750 /usr/bin/dumpcap
sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcapPython
text
# 编译二进制包
# IMPORTANT: nDPI Bindings requires Python version >= 3.7
python3 -m pip install --upgrade pip
python3 -m pip install -r dev_requirements.txt
# 替换 python3 -m pip install . 为以下命令来构建包:
python3 -m build --wheel
# 生成源码包
python3 -m buildDebian或Ubuntu下载安装包到本地
text
#方式一
# 以离线安装sshd为例
# 创建一个目录来存放包
mkdir /home/ssh-debs && cd /home/ssh-debs
# 修改目录权限(避免警告)
chmod 777 /home/ssh-debs
cd /home/ssh-debs
# 下载openssh-server及其所有依赖
apt-get download openssh-server
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances openssh-server | grep "^\w" | sort -u)
# 安装所有deb包
dpkg -i *.deb
# 如果遇到依赖问题,尝试修复
apt-get -f install
# 创建必要目录并启动服务
mkdir -p /var/run/sshd
/usr/sbin/sshd
#设置root密码
passwd root
#方式二
#shell版本
docker run --rm -v $(pwd)/offline-deps/apk-packages:/output alpine:latest sh -c "
apk update &&
apk fetch --no-cache -o /output \
gcc musl-dev sqlite-dev build-base ca-certificates tzdata &&
ls -la /output
"
#Powershell版本及改为国内仓库
docker run --rm -v ${PWD}/apk-packages:/output alpine:latest sh -c "sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && apk update && apk fetch --no-cache -o /output gcc musl-dev sqlite-dev build-base ca-certificates tzdata && ls -la /output"Windows相关操作
powershell相关操作
shell
# 创建文件夹
New-Item -ItemType Directory -Path "C:\FolderName"运维
shell
# windows10端口被占用,无法启动(管理员方式运行以下指令)
net stop winnat
net start winnat
# 端口占用解决方案
# 使用端口4000的所有进程
netstat -ano | findstr :4000
# 按下 `Ctrl + Shift + Esc` 打开任务管理器
# 点击 `详细信息` 标签,然后找到对应 `PID` 的进程
# 选择 `结束任务`
# 查看目前「TCP 动态端口」的范围
netsh int ipv4 show dynamicport tcp
# 查看被保留的端口段
netsh interface ipv4 show excludedportrange protocol=tcp
# 防止端口被占用,这意味着系统将不会将该端口分配给任何应用程序使用。这通常用于为特定应用程序预留端口,或者避免端口冲突。
netsh int ipv4 add excludedportrange protocol=tcp startport=3000 numberofports=1
#撤销使用 `netsh` 添加的排除端口范围
netsh int ipv4 delete excludedportrange protocol=tcp startport=50051 numberofports=1
# 禁用 Hyper-V
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
# 重新启用 Hyper-V
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
# windows相关命令行工具代理设置(包括git bash)
#系统设置环境变量
HTTP_PROXY=http://proxy-server:port
HTTPS_PROXY=http://proxy-server:port前端相关
npm/yarn/pnpm相关操作
npm
shell
# 设置源
npm config set registry https://registry.npmmirror.com
# 临时设置源
npm install --registry https://registry.npmmirror.com
# 安装yarn
npm install -g yarn
# 查看当前npm的代理设置
npm config get proxy
npm config get https-proxy
# 设置代理
npm config set proxy http://127.0.0.1:10808
npm config set https-proxy http://127.0.0.1:10808
# 删除规则
npm config delete proxy
npm config delete https-proxy
# 清理缓存
npm cache clean --force
# 卸载
npm uninstall yarn -g
#重新安装 npm
npm install npm -g
# 检查源
npm config get registryyarn
shell
# 查看 Yarn 当前使用的代理设置
yarn config get https-proxy
yarn config get proxy
# 设置 Yarn 代理
yarn config set proxy http://proxy.example.com:8080
yarn config set https-proxy http://proxy.example.com:8080
yarn config set proxy http://username:password@proxy.example.com:8080
yarn config set https-proxy http://username:password@proxy.example.com:8080
# 移除代理设置
yarn config delete proxy
yarn config delete https-proxy
yarn config delete no-proxy
# 某些主机或 IP 地址不使用代理
yarn config set no-proxy "localhost,127.0.0.1,example.com"
# 设置yarn源
yarn config set registry https://registry.npm.taobao.org -g
yarn config set sass_binary_site http://cdn.npm.taobao.org/dist/node-sass -g
# yarn构建项目
yarn install
yarn build
# 清除的缓存
yarn cache clean
# 验证 Yarn 版本
yarn --version
# 升级 Yarn 项目中的依赖包
yarn upgrade
# 升级到最新主版本
yarn upgrade --latest
# 升级某个特定的依赖包
yarn upgrade package-name
# 强制升级到最新的主版本:
yarn upgrade package-name@latest
# 查看有哪些依赖包可以升级
yarn upgrade --auditpnpm
shell
# 查看可用的更新
pnpm outdated
# 更新特定包
pnpm update <package-name>
# 升级到特定的版本
pnpm add package-name@version
# 更新所有依赖
pnpm update
# 忽略 `package.json` 中指定的版本范围
pnpm update --latest
# 清理不再需要的依赖
pnpm prune
# 清除缓存,删除 `pnpm` 全局存储中未使用的软链接和文件。它会扫描项目中所有已安装的依赖项,然后删除全局存储中与这些依赖项无关的文件。
pnpm store prune
# 清除特定项目的本地缓存,在项目目录中运行,`pnpm` 将本地 `node_modules` 中的所有依赖项都视为需要的。这将删除本地 `node_modules` 中未使用的软链接和文件。
pnpm store prune --shamefully-hoist=true
# 彻底地清除缓存,包括删除全局存储中的所有内容,会删除全局存储中所有未使用的内容,而不仅仅是软链接和文件。这个命令通常用于释放磁盘空间或解决缓存相关的问题。
pnpm store prune --long-term
# 完全重置 `pnpm` 的缓存和设置,这将删除全局存储目录中的所有内容,包括缓存、元数据和配置文件。
这些命令可以帮助你清理 `pnpm` 缓存,释放磁盘空间或解决缓存相关的问题
pnpm store prune --store-dir /path/to/pnpm-store
# 查看 pnpm 当前使用的代理设置
pnpm config get proxy
# 设置或修改 pnpm 的代理
pnpm config set proxy http://proxy.example.com:8080
pnpm config set https-proxy http://proxy.example.com:8080
pnpm config set proxy http://username:password@proxy.example.com:8080
pnpm config set https-proxy http://username:password@proxy.example.com:8080
# 为某些域名或 IP 地址绕过代理
pnpm config set no-proxy "localhost,127.0.0.1,example.com"
# 移除代理设置
pnpm config delete proxy
pnpm config delete https-proxy
pnpm config delete no-proxy
# 根据pnpm-lock.yaml,锁定当前依赖版本
pnpm install --frozen-lockfilenodejs
shell
# 配置nodejs
tar xvf node-v18.16.0-linux-x64.tar.xz
mv node-v18.16.0-linux-x64 /usr/local/nodejs
ln -s /usr/local/nodejs/bin/npm /usr/local/bin/
ln -s /usr/local/nodejs/bin/node /usr/local/bin/
# 设置nodejs仓库bin包全局变量,以便可以直接使用yarn命令
export PATH="$PATH:`npm config get prefix`/bin"
# 代理方式运行
proxychains node ./node_modules/.bin/next start
# 代理方式挂起
proxychains nohup node ./node_modules/.bin/next start > /dev/null 2>&1 &git相关
centos8搭建git仓库,并在代码提交是自动构建
shell
# 相关操作
yum install git -y
useradd git -d /home/git -m -s /bin/bash
passwd git
su git
cd ~
git init --bare chatgpt_java.git
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
# 在本地客户端执行
git config --global user.name ‘c1511’
git config --global user.email ‘7661376@gmail.com’
ssh-keygen -t rsa -C "7661376@gmail.com"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
# 把本地生成的公钥复制到服务器上
su git && cd ~
cat id_rsa1.pub >> .ssh/authorized_keys
# 若推送仓库出现认证失败问题
## 方式一
ssh-keygen -R 198.13.56.106 #删除旧认证
### 重新添加认证
ssh -T git@198.13.56.106
## 方式二
### 重新添加主机公钥到你的 `known_hosts` 文件
ssh-keyscan 198.13.56.106 >> ~/.ssh/known_hosts
# 如果不想git用户可以使用终端
vim /etc/passwd
git:x:1000:1000::/home/git:/bin/bash 改成 git:x:1000:1000::/home/git:/usr/bin/git-shell
# 在服务器创建存放代码的文件夹
su git
cd ~
mkdir -p chatgpt_java_code
vim /home/git/chatgpt_java.git/hooks/post-receive #文件示例post-receive.sh
vim /home/git/chatgpt_java_code/deploy.sh
chmod +x /home/git/chatgpt_java.git/hooks/post-receive
chmod +x /home/git/chatgpt_java_code/deploy.shgit相关操作
shell
# 清除当前分支缓存头
git rm -r --cached .
git add .
# 根据.gitignore更新版本控制的文件
git commit -m "Update .gitignore file"
# 添加远程仓库,名称为chatgpt_web
git remote add chatgpt_java git@198.13.56.106:/home/git/chatgpt_java.git
# 删除远程仓库chatgpt_web
git remote rm chatgpt_web
# 推送到远程仓库chatgpt_web dev分支
git push chatgpt_web dev
# 推送到远程仓库chatgpt_web dev分支并关联起来
git push -u chatgpt_web dev
# 拉取远程仓库origin的main分支
git pull origin main
# 检查当前git的仓库有哪些
git remote -v
# 在 Git 中创建一个新的远程分支的步骤如下
# 1、检出本地分支
git checkout -b new-feature
# 2、推送分支到远程仓库
git push origin new-feature
# 3、验证远程分支是否创建成功
git branch -r
# 4、在本地也跟踪这个新的远程分支
git checkout --track origin/new-feature
# 查看Git的HTTP代理设置
git config --global --get http.proxy
# 设置全局的HTTP代理
git config --global http.proxy http://127.0.0.1:10808
git config --global https.proxy http://127.0.0.1:10808
# 为某个特定的项目设置HTTP代理
git config http.proxy http://127.0.0.1:10808
# 取消代理
git config --global --unset http.proxy
git config --unset http.proxymaven
配置Maven
shell
wget https://dlcdn.apache.org/maven/maven-3/3.9.1/binaries/apache-maven-3.9.1-bin.tar.gz
tar -xvf apache-maven-3.9.1-bin.tar.gz
cp -r apache-maven-3.9.1 /opt
export M2_HOME=/opt/apache-maven-3.9.1
export PATH=$PATH:$M2_HOME/bin
source /etc/profile
mvn -version安裝本地jar到本地maven仓库
shell
mvn install:install-file -Dfile=./itchat4j-1.1.0-jar-with-dependencies.jar -DgroupId=itchat -DartifactId=itchat4j-uos -Dversion=1.1.1 -Dpackaging=jar
mvn install:install-file -Dfile=./chatgpt-java-1.0.13-jar-with-dependencies.jar -DgroupId=com.unfbx -DartifactId=chatgpt-java -Dversion=1.0.13 -Dpackaging=jar -DgeneratePom=true相关操作
text
# mvn查询特定的依赖
mvn dependency:tree -Dverbose -Dincludes="org.slf4j:*"下载完整依赖配置
xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>Docker
相关操作
shell
# 清理这些“悬挂”的(dangling)镜像
docker image prune
# 删除所有未使用的镜像,不仅仅是悬挂的镜像
docker system prune --all
# watchtower定时更新指定docker容器
# 方式一
docker run -d \
--name <container_name> \
--label com.centurylinklabs.watchtower.enable=true \
... # 其他的运行参数
<image_name>
# Docker Compose 方案
services:
your-service:
image: your-image
labels:
com.centurylinklabs.watchtower.enable: "true"
# 其他配置...
# 方式二(推荐)
# 启动Watchtower
docker run -d \
--name watchtower --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \ #将宿主机的 Docker 套接字文件挂载到容器内,这样 Watchtower 才能与 Docker 守护进程通信并获取容器信息
-e DOCKER_API_VERSION=1.44 \ #解决新版docker启动容器报错的问题
-e TZ=Asia/Shanghai \
containrrr/watchtower nginx-xray nginx-hysteria #Watchtower 将要监控的容器名称列表
# 立即触发 Watchtower 执行更新检查
docker exec [watchtower_container_name] /watchtower --run-once
## 镜像相关
docker pull ubuntu:20.04
docker save ubuntu:20.04 > network-tools-images/ubuntu-20.04.tar
docker save ai-container:1.0.0 > ai-container.tar
docker save image1 image2 ... > images.tar
# 使用 gzip 压缩
docker save ai-container:1.0.0 | gzip > ai-container.tar.gz
# 压缩ai-container.tar为ai-container.tar.gz,且删掉ai-container.tar
gzip ai-container.tar
# 保留原文件ai-container.tar
gzip -c ai-container.tar > ai-container.tar.gz
# 把多个镜像打包到一个压缩包
docker save -o images.tar image1 image2 image3
# 导入镜像
docker load -i images.tar
# 避免解压,直接导入
gunzip -c images.tar.gz | docker load
## 操作相关
# 查看当前容器的重启策略
docker inspect <容器名或ID> | grep RestartPolicy
# 禁用自启动
docker update --restart=no <容器名或ID>
#重启策略的可选值包括:
#no: 容器退出时不要自动重启(默认值)
#always: 容器退出时总是重启
#unless-stopped: 容器退出时重启,但是手动停止的除外
#on-failure: 容器非正常退出时才重启数据库相关
MongoDB
shell
# 删除现有用户
docker exec -it my-mongo mongosh admin --eval 'db.dropUser("daivdc")'
# 创建新用户
docker exec -it my-mongo mongosh admin --eval 'db.createUser({user:"daivdc",pwd:"dmAuHT8VsdfL9",roles:[{role:"root",db:"admin"}]})'
# 进入 MongoDB 命令行界面
docker exec -it my-mongo mongosh admin
# 查看所有用户
db.getUsers()
# 查看当前用户
db.runCommand({connectionStatus: 1})Mysql
shell
## 创建新用户并设置密码
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
## 授予用户权限
-- 授予所有权限
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'host';
-- 授予特定权限
GRANT SELECT, INSERT, UPDATE ON database_name.* TO 'username'@'host';
-- 刷新权限
FLUSH PRIVILEGES;
## 允许远程访问
-- 创建允许任何IP访问的用户
CREATE USER 'remoteuser'@'%' IDENTIFIED BY 'password123';
-- 授予权限
GRANT ALL PRIVILEGES ON *.* TO 'remoteuser'@'%';
## 查看用户权限
SHOW GRANTS FOR 'username'@'host';
## 修改用户密码
ALTER USER 'username'@'host' IDENTIFIED BY 'newpassword';
## 删除用户
DROP USER 'username'@'host';K8S
shell
# k8s托管容器数据
## 首先看看是否有默认的storageclass
kubectl get storageclass
## 使用local-path-provisioner
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.24/deploy/local-path-storage.yaml
## 然后将PVC修改为
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: local-path # 使用local-path存储类
# 丢失yml文件的情况下删除相关容器
## 1如果它是 StatefulSet 或 DaemonSet,就把命令里的 deployment 换成对应的资源类型即可
kubectl get deployments 或 kubectl describe pod gitlab-6cd7b95b9f-2q4zm | grep -i "Controlled By"
## 2
kubectl delete deployment gitlab
## 3
kubectl get svc,pvc,ingress,configmap,secret | grep gitlab# 删除 Service
## 4
kubectl delete svc <service-name>
# 删除 PVC(注意:删除 PVC 后,如果 PV 策略是 Delete,数据将永久丢失)
kubectl delete pvc <pvc-name>
# 如果有其他关联配置,也一并删除
kubectl delete configmap <configmap-name>网站相关
acme.sh 自动解析并申请证书
text
# 安装 acme.sh 客户端
curl https://get.acme.sh | sh -s email=7661376@gmail.com
# 执行acme.sh,提示command not found
alias acme.sh='/root/.acme.sh/acme.sh'
# 升级 acme.sh 客户端
acme.sh --upgrade
# 自动升级
acme.sh --upgrade --auto-upgrade
# 关闭自动升级
acme.sh --upgrade --auto-upgrade 0
# 安装证书到指定目录
acme.sh --install-cert -d ilym.top -d *.ilym.top \
--key-file /home/nginx/cert/key.pem \
--fullchain-file /home/nginx/cert/cert.pem \
--reloadcmd "docker restart nginx"
# 重新生成证书
acme.sh --renew -d mydomain.com --force
# 查看acme.sh已签发证书的域名
acme.sh --list
# 查看指定的域名证书信息
acme.sh --info -d example.com
# 从acme.sh中移除不需要再次签发证书的域名
acme.sh --remove -d example.com
# 删除acme.sh
acme.sh --uninstallhttp方式
shell
#使用letsencrypt申请证书,默认是ZeroSSL
acme.sh --issue -d cloud-soft.cfd -d *.cloud-soft.cfd --server letsencrypt #--force
--webroot /home/wwwroot/mydomain.com/ # 网页目录,适合有网页的网站
--debug # 调试模式
--standalone #通过80端口完成验证,可选
--standalone --httpport 8080 # 指定端口为8080
# 完整示例
acme.sh --issue -d cloud-soft.cfd -d *.cloud-soft.cfd --server letsencrypt --standalone --httpport 9999dns方式
shell
# dnspod
export DP_Id="465134"
export DP_Key="7dcc6d05379d193fb7fbd20401d0bf14" # 先登录到 dnspod 账号, 生成你的 api id 和 api key
#使用letsencrypt申请证书,默认是ZeroSSL
acme.sh --issue
--dns dns_dp # 通过dnspod的dns完成验证
-d davidch.chat -d *.davidch.chat --server letsencrypt #--force
# cf
export CF_Token="onXxS9ffo7N3OP0E2wKdJPKOus-T4bp5yZNDY3gV"
export CF_Zone_ID="690e7331d42c074ac3fb5ed586e003b0"
acme.sh --issue --dns dns_cf -d ilym.top -d *.ilym.top --server letsencrypt
# 测试
acme.sh --issue --dns dns_cf -d ilym.top -d *.ilym.top --test --dnssleep 20
#强制
acme.sh --issue --dns dns_cf -d ilym.top -d *.ilym.top --server letsencrypt --dnssleep 20 --force
# 清除旧域名
acme.sh --remove -d cloud-soft.cfd -d *.cloud-soft.cfd自定义安装acme.sh
text
git clone --depth 1 https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install \
--home ~/myacme \ # 指定acme.sh安装的目录,默认是安装到 ~/.acme.sh
--config-home ~/myacme/data \ # 指定一个可写的文件夹,acme.sh将在其中写入所有文件(包括cert / keys,configs)。 默认情况下,它位于 --home。
--cert-home ~/mycerts \ # 指定一个目录,用于保存颁发的证书。 默认情况下,它保存在 --config-home。
--accountemail "my@example.com" \ # 指定一个用于注册Let's Encrypt帐户的电子邮箱,通过此电子邮件将收到续订等通知。
--accountkey ~/myaccount.key \ # 指定一个保存您帐户私钥的文件。 默认情况下,这个文件保存在 --config-home。
--accountconf ~/myaccount.conf \ # 指定一个帐户配置文件。 默认情况下,这个文件保存在 --config-home。
--useragent "this is my client." # 发送给Let's Encrypt的user-agent请求信息。