领客空间 - Lincrow - 专注于分享SEO网络营销、建站技术的自媒体博客 - 代码片段
type: channel
link: https://www.lincrow.com/index.php/category/code/
description: 代码片段
items: centos9设置多张网卡默认网关
items: 宝塔面板邮局 Postfix的Sqlite包异常，修复不了问题解决
items: 网页添加 Live2D 看板娘
items: Gitlab升级
items: Alist V3版本 API使用文档
items: Alist常用样式代码
items: Win11多用户同时登录远程桌面方法
items: Windows子系统（WSL）通过桥接网络实现被外部局域网主机直接访问
items: Windows 子系统（wsl）ip映射配置详解
items: PHP实现企业微信群机器人推送-代码

centos9设置多张网卡默认网关
type: item
date: 2024-03-12T11:12:44+08:00
description: 今天，使用centos9+宝塔搭建服务器，遇到了一个很有趣的问题：服务器是两张网卡，两个不同的网段，并且都接入了公网。A网段IP需要映射外网。B网端只需要内网访问即可。但实际情况却是：A网段和B网段内网访问都正常。但是A网段在公网访问服务器却不能访问。检测端口，80、443等端口都是关闭的。 经过多次排查，都找不到具体根结。后来突然想到，是不是和网关有关系。查看默认网关，发现系统默认B网关为默认。改A为默认网关即可。 在Linux中，当你为多张网卡配置了不同的网关时，系统默认只会选择一个作为默认网关。而不是每张网卡都会使用它自己的网关。所以，在这样的配置下，通常有一个主要的考虑因素决定哪一个网关被选择为默认网关，那就是网卡或路由的度量（metric）值。 在nmcli和其他网络配置工具中，度量值通常用来决定路由的优先级。具有最低度量值的路由将被选为默认路由。如果两张网卡的度量值相同，那么其它因素，如接口的激活顺序，可能会起作用。 我们如果想查看当前的路由设置和默认网关，可以使用命令： ip route show 如果是安装了NetworkManager route -n 然后，使用route命令来进行设置： route add default gw 192.168.1.1 如果要使用IP-Route2工具，那么请先安装iproute2工具： dnf install iproute2 接着，为网络接口设置IPv4地址： ip addr add 192.168.1.x dev eth0

宝塔面板邮局 Postfix的Sqlite包异常，修复不了问题解决
type: item
date: 2024-01-07T21:53:22+08:00
description: 宝塔邮局出问题，提示，Postfix的Sqlite包异常，请检查。 重新安装之后、修复也不行，后来子网上找到一个重新下载postfix3-sqlite的方法，标记下。 1、首先在https://rhel.pkgs.org/7/ghettoforge-plus-x86_64/ 网站找到最新postfix3-sqlit版本地址。 例如：postfix3-sqlite-3.8.4-1.gf.el7.x86_64.rpm 在Download下找到下载地址： 运行命令： wget http://mirror.ghettoforge.org/distributions/gf/el/7/plus/x86_64/postfix3-sqlite-3.8.4-1.gf.el7.x86_64.rpm yum install postfix3-sqlite-3.8.4-1.gf.el7.x86_64.rpm -y 完成！！

网页添加 Live2D 看板娘
type: item
date: 2023-12-14T13:27:00+08:00
description: 支持 切换 Live2D 模型了（暂时只有 Pio 和 Tia 酱 支持 随机换装 和 顺序换装（收集了截至目前的 Pio、Tia 全套服装 *需要根据 自身情况 进行定制，不能直接套用（其他资源文件见 打包下载 ** waifu-tips.js 的详细设置说明，和 waifu-tips.json 节点说明，见 Live2D 看板娘小样 ReadMe waifu.css .waifu { position: fixed; bottom: 0; z-index: 1; font-size: 0; -webkit-transform: translateY(3px); transform: translateY(3px); } .waifu:hover { -webkit-transform: translateY(0); transform: translateY(0); } .waifu-tips { opacity: 0; margin: -20px 20px; padding: 5px 10px; border: 1px solid rgba(224, 186, 140, 0.62); border-radius: 12px; background-color: rgba(236, 217, 188, 0.5); box-shadow: 0 3px 15px 2px rgba(191, 158, 118, 0.2); text-overflow: ellipsis; overflow: hidden; position: absolute; animation-delay: 5s; animation-duration: 50s; animation-iteration-count: infinite; animation-name: shake; animation-timing-function: ease-in-out; } .waifu-tool { display: none; color: #aaa; top: 50px; right: 10px; position: absolute; } .waifu:hover .waifu-tool { display: block; } .waifu-tool span { display: block; cursor: pointer; color: #5b6c7d; transition: 0.2s; } .waifu-tool span:hover { color: #34495e; } .waifu #live2d{ position: relative; } @keyframes shake { 2% { transform: translate(0.5px, -1.5px) rotate(-0.5deg); } 4% { transform: translate(0.5px, 1.5px) rotate(1.5deg); } 6% { transform: translate(1.5px, 1.5px) rotate(1.5deg); } 8% { transform: translate(2.5px, 1.5px) rotate(0.5deg); } 10% { transform: translate(0.5px, 2.5px) rotate(0.5deg); } 12% { transform: translate(1.5px, 1.5px) rotate(0.5deg); } 14% { transform: translate(0.5px, 0.5px) rotate(0.5deg); } 16% { transform: translate(-1.5px, -0.5px) rotate(1.5deg); } 18% { transform: translate(0.5px, 0.5px) rotate(1.5deg); } 20% { transform: translate(2.5px, 2.5px) rotate(1.5deg); } 22% { transform: translate(0.5px, -1.5px) rotate(1.5deg); } 24% { transform: translate(-1.5px, 1.5px) rotate(-0.5deg); } 26% { transform: translate(1.5px, 0.5px) rotate(1.5deg); } 28% { transform: translate(-0.5px, -0.5px) rotate(-0.5deg); } 30% { transform…

Gitlab升级
type: item
date: 2023-11-21T15:16:00+08:00
description: （1）gitLab版本升级，是先小版本升级到最高版本，在升级到下一个大版本，进行依次升级 （2）比如：16.4.0->16.4.1->16.4.2->16.4.0 小版本升级到最高级，在向下一个版本升级 （3）升级前需要备份，或者做镜像、快照等操作 （4）升级完成后，重启服务，查看响应版本号是否正确 一、升级前备份 1、手动备份 gitlab-rake gitlab:backup:create 注意：gitlab升级的时候，会自动备份 2、配置文件备份 配置文件须备份 /etc/gitlab/gitlab.rb 二、检测最新版本 检测最新版本，若相邻版本可直接升级。 yum install gitlab-ce 三、开始升级 查看现版本：GitLab -> 帮助 查看官方版本： 查看 官方源：查看 清华源：查看 四、跨版本升级 逐步小版本升级 1.下载安装包 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-15.2.4-ce.0.el7.x86_64.rpm gitlab-ce-15.2.4-ce.0.el7.x86_64.rpm 为需要下载升级的版本 2.关闭部分gitlab服务（不要全关，因为升级中可能需要部分服务） gitlab-ctl stop unicorn gitlab-ctl stop sidekiq gitlab-ctl stop nginx 3.安装新版本 rpm -Uvh gitlab-ce-15.2.4-ce.0.el7.x86_64.rpm gitlab-ce-15.2.4-ce.0.el7.x86_64.rpm 为需要下载升级的版本 4.刷新配置 gitlab-ctl reconfigure 五、其他命令 1、停止所有服务 gitlab-ctl stop 2、GitLab停止某服务 gitlab-ctl stop 服务名 3、GitLab打开服务 gitlab-ctl start 4、GitLab停止某服务 gitlab-ctl start 服务名 5、查看Gitlab状态 gitlab-ctl status 6、恢复备份 gitlab-rake gitlab:backup:restore BACKUP=/var/opt/gitlab/backups/1665366086_2022_10_10_15.4.0_gitlab_backup.tar /var/opt/gitlab/backups/1665366086_2022_10_10_15.4.0_gitlab_backup.tar 为备份文件

Alist V3版本 API使用文档
type: item
date: 2023-06-21T10:50:00+08:00
description: [scode type="share"]Alist V3是一个支持多种存储，支持网页浏览和 WebDAV 的文件列表程序，由 gin 和 Solidjs 驱动。 Alist的官方文档提供了V2版本的API说明，但对于最新的V3版本并没有，这里个人整理了一些V3版本的常用API和参数设置，返回示例供有需要的朋友参考。[/scode] token获取 [scode type="blue"]POST /api/auth/login[/scode] 请求参数 名称 位置 类型 必选 说明 Password query string 是 密码 Username query string 是 用户名 返回数据结构 状态码 200 名称 类型 必选 约束 中文名 说明 code integer true none 状态码 message string true none 信息 data object true none data token string true none token 返回示例 { "code": 200, "message": "success", "data": { "token": "abcd" } } 获取文件列表 [scode type="blue"]POST /api/fs/list[/scode] 请求参数 名称 位置 类型 必选 说明 Authorization header string 是 用户token Content-Type header string 否 none body body object 否 none page body integer 否 当前页数 password body string 否 密码 path body string 否 路径 per_page body integer 否 每页文件数 refresh body boolean 否 强制刷新 返回数据结构 名称 类型 必选 约束 中文名 说明 » code integer true none 状态码 » message string true none 信息 » data object true none none »» content [object] true none none »»» name string true none 文件名 »»» size integer true none 文件大小 »»» is_dir boolean true none 是否为目录 »»» modified string true none 修改时间 »»» sign string true none 访问密钥 »»» thumb string true none 缩略图地址 »»» type integer true none none »» total integer true none 总文件数 »» readme string true none none »» write boolean true none 写入权限 »» provider string true none 存储类型 返回示例 { "code": 200, "message": "success", "data": { "content": [ { "name": "201311", "size": 0, "is_dir": true, "modified": "2021-11-30T15:41:43.004Z", "sign": "", "thumb": "", "type": 1 }, { "name": "201312", "size": 0, "is_dir": true, "modified": "2021-11-30T15:42:26.839Z", "sign": "", "thumb": "", "type": 1 }, { "name": "201401", "size": 0, "is_dir": true, "modified": "2021-11-30T15:42:37.344Z", "sign": "", "thumb": "", "type": 1 }, { "name": "201402", "size": 0, "is_dir": true, "modified": "2021-11-30T15:41:35.053Z", "sign": "", "thumb": "", "type": 1 }, { "name": "201403", "size": 0, "is_dir": true, "modified": "2021-11-30T15:41:51.271Z", "sign": "", "thumb": "", "t…

Alist常用样式代码
type: item
date: 2023-03-01T11:41:00+08:00
description: 自定义头部代码 自定义内容代码 <meting-js fixed="true" autoplay="false" theme="#409EFF" list-folded="true" auto="QQ音乐或者网易云的链接"></meting-js> " "人生最大的遗憾,就是在最无能为力的时候遇到一个想要保护一生的人." " —— Anwen's Cloud QQ | 邮箱 | 博客 | 留言 | 云盘 | 管理 | Alist <!-- --> 其他代码： 黑猫： 白猫： 鼠标点击出随机颜色的爱心: Document 隐藏右上角复制直链、下载切换布局等: 全白无框： 备案信息： 2023 LINCROW.COM | 鄂ICP备xxxxxx号-x | 由Alist驱动 底部网站运行时间： 载入天数...载入时分秒... 自定义背景：替换url即可: 去掉底部的管理文字： 去掉底部的 Powered by Alist： 去掉底部Powered by Alist和管理文字： 其他总结： 其他背景混合渐变色彩 /* 背景混合色彩1 / .chakra-ui-light{ background-image: linear-gradient( 102.7deg,#fddaff 8.2%,#dfadfc 19.6%,#adcdfc 36.8%,#adfcf4 73.2%,#caf8d0 90.9%); background-attachment: fixed; } /* 背景混合色彩2 */ .chakra-ui-light{ background-image: linear-gradient(310deg, #7ec4e9 10%, #fff, #eee); background-attachment: fixed; }

Win11多用户同时登录远程桌面方法
type: item
date: 2022-10-27T11:27:00+08:00
description: [scode type="blue"]Windows server系列系统是支持多用户同时连接远程桌面独立使用互不影响的，但是常规版本并未直接支持。如果您使用Windows Vista、Windows 7/8/8.1/10的配置参考：https://github.com/stascorp/rdpwrap。`win11中无需安装此软件`。[/scode] 在Win11中配置多用户同时登陆远程桌面（并发远程桌面RDP）之前，请先确保已开启远程桌面并单用户访问运行正常。 配置远程桌面服务 打开编辑组策略应用，进入本地计算机策略-计算机配置-管理模板-Windows组件-远程桌面服务-远程桌面会话主机-连接。 启用允许用户通过使用远程桌面服务进行远程连接，启用限制连接的数量并按自己需求修改数量，启用将远程桌面服务用户限制到单独的远程桌面服务会话，这样设置的目的是使得多用户链接的时候重新链接能恢复之前的工作而不是新开启一个会话（丢失桌面）。另外，推荐客户端为MacOS的用户启用选择 RDP 传输协议并选择同时使用UDP和TCP，同时使用Microsoft Remote Desktop Beta优化使用体验。 复制系统文件 多用户同时使用远程桌面，会提示必须下线对端用户，为了实现多用户同时使用且互不干扰，需要修改win11操作系统的C:\Windows\System32\termsrv.dll文件。 先将该文件复制出来，此DLL文件可以使用任何HEX编辑器（例如 Tiny Hexer ）进行修改。 为方便大家使用，工具已打包提供下载：修改及使用.zip 解压并进入文件夹内，右击并以管理员权限运行。 运行完毕后，文件夹内会将C:\Windows\System32\termsrv.dll进来，并已更改可编辑权限。 手工修改方法 HEX编辑器查找（注意，查找的最后四组XX可以是任何数字）： 39 81 3C 06 00 00 0F 84 XX XX XX XX 替换为： B8 00 01 00 00 89 81 38 06 00 00 90 替换系统文件 以管理员权限运行运行附件文件夹里面的2_替换.bat文件，即可（运行文件会重启，请注意保存文件）。

Windows子系统（WSL）通过桥接网络实现被外部局域网主机直接访问
type: item
date: 2022-10-18T16:47:00+08:00
description: 实现方法 思路就是将wsl2自建的虚拟NAT网络桥接到windows主机网卡上，主要参考这篇文章 1、开启hyper-v 桥接功能需要windows的hyper-v组件支持，但是win10/11家庭版是不包含hyper-v的，专业版才包含。网上也有文章提到家庭版安装hyper-v的方法，但是我没有测试，以下内容都是在win11专业版上进行的测试，win10专业版应该也是一样的。 首先，进入控制面板—程序—启用或关闭windows功能，勾选hyper-v，确认后重启电脑。 2、桥接网络 WSL2 默认采用了一个 NAT 网络，这对于大多数情况而言都是没有问题的，但是如果想要把 WSL 中的服务直接暴露出来，就不得不考虑做端口转发等问题。以及如果要使用 IPv6，自带的 NAT 方案也不能满足。 因此，这种时候如果能让 WSL2 使用直接接在 NIC 上自然是最好的，可惜 Windows 中没有直接提供这样的配置选项，如果在 Hyper-V 管理器中配置 WSL 网卡为外部网络则会直接报错。 万幸的是，可以使用 PowerShell 直接进行配置，本文则记录使用 PowerShell 让 WSL2 用上桥接网络的方法。 以下内容需要以管理员身份在PowerShell内执行。 一切开始之前首先需要启动 WSL，直接运行 wsl 即可，这样 WSL 的网卡才会被自动创建出来。 重启后首先运行wsl2（这样才能出现WSL的虚拟网卡），以管理员方式打开powershell，执行Get-NetAdapter，可以列出系统所有的网卡，记住想要桥接的网卡名称，比如我想桥接到有线网络其名称为“以太网”。 桥接网卡输入以下代码： Set-VMSwitch WSL -NetAdapterName 以太网 将wsl虚拟网络和主机有线网络桥接起来。 3、手动修改WSL网络 接下来进入 WSL 配置 IP 地址和网关，假设WSL的有线网络为eth0，网关为 192.168.1.1，IP 设置为 192.168.1.150/24： ip addr del $(ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | head -n 1) dev eth0 ip addr add 192.168.148.64/24 broadcast 192.168.148.255 dev eth0 ip route add 0.0.0.0/0 via 192.168.148.1 dev eth0 接下来更新名称解析服务器地址，执行 nano /etc/resolv.conf，修改其中内容为 nameserver 192.168.1.1，然后按 Ctrl+X保存退出即可。 4、取消桥接 在windows中管理员方式打开powershell，执行以下指令： Set-VMSwitch WSL -SwitchType Internal 然后执行 wsl --shutdown 重启wsl，即可恢复原有的虚拟内部网络。 一键脚本 上述步骤太繁琐，为了简单操作，我编写了两个powershell脚本，可以一键执行网络桥接和取消网络桥接 1、wsl linux配置网络脚本 进入wsl，在wsl的home目录下新建一个脚本文件，例如set_eth0.sh，其内容如下： #!/bin/bash new_ip=192.168.148.64 brd=192.168.148.255 gateway=192.168.148.1 nameserver=192.168.148.1 net_dev=eth0 echo "password" | sudo -S ip addr del $(ip addr show $net_dev | grep 'inet\b' | awk '{print $2}' | head -n 1) dev $net_dev sudo ip addr add $new_ip/24 broadcast $brd dev $net_dev sudo ip route add 0.0.0.0/0 via $gateway dev $net_dev sudo sed -i "\$c nameserver $nameserver" /etc/resolv.conf 注意将new_ip、brd、nameserver、gateway、net_dev分别修改为实际想要设定的值，另外将echo "password" | 中的password替换为wsl的用户密码。 2、powershell桥接网络脚本 在windows中新建一个ps1文件，例如wsl-bridge-on.ps1（ps1是powershell的脚本，其脚本语言和以前的bat是不一样的） …

Windows 子系统（wsl）ip映射配置详解
type: item
date: 2022-10-18T15:33:00+08:00
description: 开篇 我们都知道，wsl安装完成后，通过命令行输入wsl即可进入系统，但是Windows cmd窗口真的不太友好，那么，我们有没有办法通过xshell等sshclient工具来进行连接进行操作呢？那么，本篇我们一起来学习一下吧。 那么，这里我们一般有2种方式来建立ssh连接。 ssh client连接 （一）生成密匙 这里需要注意的是，如果wsl不存在ssh服务，则直接跳到第二种方式进行操作，如果存在，建议先执行该种方式进行体验，若不成功，则再跳到第二种方式将会更明白个中道理。 一般wsl自带ssh服务，首先我们启动服务 service ssh restart 此时可能报错 sshd: no hostkeys available -- exiting. 这里可能有2种原因，一是当前用户非root用户，此时切换到root用户执行即可，二是可能缺少密匙文件，可进入/etc/ssh查看是否存在下图中2个文件，若不存在，执行以下命令生成即可。 $ sudo ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key $ sudo ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key 服务启动成功后，通过命令行以下方式进行连接 ssh jack@localhost The authenticity of host 'localhost (127.0.0.1)' can't be established. RSA 即可登录，但这里是使用密匙登录，要想通过账号密码登录，则需要修改配置文件。 修改完配置文件后，通过 输入密码即可登录。 这里需要注意的是，这里既可以通过local host也可以通过ip来进行访问，并不像其他教程里所说的一样需要进行端口转发，端口转发并不是用在这种情况下的，后面会讲解。 （二）删除并重新安装sshopen-server 这种方法网上随处可见，为了全面，我这里也记录一下，基本上分为以下几步。 1.卸载openssh-server apt remove openssh-server 2.安装openssh-server apt install openssh-server 3.修改配置文件 # 编辑/etc/ssh/sshd_config文件。 vi /etc/ssh/sshd_config 修改ip和port 修改允许root访问 修改允许用户名密码登录 4.重启 sudo service ssh restart 此时即可通过ssh进行连接或通过xshell等工具进行连接 （三）完成以上连接后，是否可以通过其他电脑来访问wsl? 毫无疑问是可以的！！!那么这步我们就需要配置防火墙出入站规则以及端口转发规则了 如果防火墙开启，那我们需要配置防火墙规则同时需要配置端口转发规则 1.配置端口转发规则 意思就是，访问到物理机的22端口的请求，转发到wsl的22端口，[IP]为wsl的ip [PORT]为wsl的端口 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=[IP] connectport=[PORT] 2.配置防火墙出入站规则 这是安全规则，如果防火墙关闭的话则不用配置， netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=22 配置完以上两步后，我们则可以通过外网来访问我们的wsl （例如，本机ip是1.2.3.4，wsl地址是172.16.12.1） 那么，远程访问时，通过 ssh root@1.2.3.4 -p 22 即可连接到wsl。 网上说，要连接到wsl时，wsl必须保持打开状态，也就是命令行窗口不能关闭，其实这是一个误区！！！ 经过验证，即使所有的命令行都关闭，只要wsl不是shutdown状态，ssh服务正常开启，那么就可以通过ssh进行连接！！！ 其实，通过这一步可以自由的配置本地端口与wsl端口的映射，也就是可以通过物理机来进行网站或应用程序的访问，比如，我们再wsl部署一个网站，我们可以直接将该网站的端口xxxx映射到物理机的8080（举例），那么我们通过本机ip:8080即可访问该网站，大大提高我们的易操作性。 但是不是到这里就万事大吉了呢？并不是，因为wsl每次重启，ip地址都会变化，也就是说通过以上步骤添加的映射规则再wsl重启后就失效了！【刚开始不知道，第一次配置好wsl后，第二天来开机就懵逼了，一通瞎操作才整明白】，所以，我们还的想办法来固定wsl的ip地址，以…

PHP实现企业微信群机器人推送-代码
type: item
date: 2022-03-23T13:28:00+08:00
description: 调用 $webhook = '机器人地址'; //推送地址 $webhookdata = array( 'msgtype' => 'text', //文本类型 'content' => '测试消息', // 文本内容 'mentioned_list' => '', //@某个人 "@all"为全员 'mentioned_mobile_list' => '' //@手机号 "@all"为全员 ); $this->WorkRoboot($webhook,$webhookdata); 推送 public function WorkRoboot($webhook,$webhookdata){ $postdata['msgtype'] = $webhookdata['msgtype']; //接收类型 $postdata[$postdata['msgtype']]['content'] = $webhookdata['content']; //接收内容 if (!empty($webhookdata['mentioned_list'])) { $postdata[$postdata['msgtype']]['mentioned_list'] = $webhookdata['mentioned_list']; } if (!empty($webhookdata['mentioned_mobile_list'])) { $postdata[$postdata['msgtype']]['mentioned_mobile_list'] = $webhookdata['mentioned_mobile_list']; } // 初始化 $curl = curl_init(); // 设置url curl_setopt($curl, CURLOPT_URL, $webhook); // 设置头文件的信息作为数据流输出 curl_setopt($curl, CURLOPT_HEADER, true); // 设置获取的信息以文件流的形式返回，而不是直接输出。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 设置提交方式是utf8编码 curl_setopt($curl, CURLOPT_HTTPHEADER,array('Content-Type: application/json;charset=utf-8')); // 设置post方式提交 curl_setopt($curl, CURLOPT_POST, true); // 设置允许 cURL 函数执行的最长秒数 curl_setopt($curl, CURLOPT_TIMEOUT, 500); // 设置post数据 curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($postdata)); // 关闭就行 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 执行命令 $data = curl_exec($curl); // 关闭URL请求 curl_close($curl); }