Skip to content

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 6832

IPtable

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.v4

iptables相关表:

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.io

2、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 squid

3、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 haproxy

4、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 ~/.bashrc

tail命令相关用法

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.log

docker 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.conf

TShark

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/dumpcap

Python

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 build

Debian或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 registry

yarn

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 --audit

pnpm

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-lockfile

nodejs

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.sh

git相关操作

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.proxy

maven

配置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 --uninstall

http方式

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 9999

dns方式

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请求信息。