SnappyMail重置管管理密码

找到配置文件application.ini删除admin_password配置,然后刷新/?admin页面

/data/_data_/_default_/configs/application.ini 

新的初始密码在admin_password.txt里面

/data/_data_/_default_/admin_password.txt

然后再登录进去重置新的密码。

 

本文引用自https://luxing.im/reset-snappymail-admin-portal-password/

https://snappymail.eu/documentation/admin-configuration

inotify+rsync 自动同步systemctl服务

安装inotify

sudo apt update
sudo apt install inotify-tools rsync -y

centos/RHEL系列用dnf安装

 

mkdir /opt/rsync_watch/
cat >/opt/rsync_watch/rsync_watch.sh<<'EOF'
#!/bin/bash

# 加载配置文件
ENV_FILE="/opt/rsync_watch/rsync_watch.env"
if [ -f "$ENV_FILE" ]; then
    export $(grep -v '^#' "$ENV_FILE" | xargs)
fi

# 检查必需变量
if [ -z "$LOCAL_DIR" ] || [ -z "$REMOTE_USER" ] || [ -z "$REMOTE_HOST" ] || [ -z "$REMOTE_DIR" ] || [ -z "$RSYNC_PORT" ]; then
    echo "请先在 $ENV_FILE 配置 LOCAL_DIR, REMOTE_USER, REMOTE_HOST, REMOTE_DIR, RSYNC_PORT"
    exit 1
fi

# RSYNC SSH 参数
RSYNC_SSH="ssh -p ${RSYNC_PORT}"

# RSYNC 默认选项
RSYNC_OPTS=${RSYNC_OPTS:-"-az --delete --exclude='.git/'"}

echo "Starting initial sync..."
rsync $RSYNC_OPTS -e "$RSYNC_SSH" --progress --itemize-changes "$LOCAL_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"

echo "Watching for changes in $LOCAL_DIR ..."
inotifywait -m -r -e modify,create,delete,move --format '%w%f' "$LOCAL_DIR" |
while read -r FILE; do
    echo "$(date '+%F %T') Detected change: $FILE"
    rsync $RSYNC_OPTS -e "$RSYNC_SSH" --progress --itemize-changes "$LOCAL_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
done
EOF

 

/opt/rsync_watch/rsync_watch.env配置文件

LOCAL_DIR=/path/to/local/dir
REMOTE_USER=user
REMOTE_HOST=remote.host.com
REMOTE_DIR=/path/to/remote/dir
RSYNC_PORT=2222
RSYNC_OPTS="-az --exclude='.git/'"

 

systemd配置

cat>/etc/systemd/system/rsync_watch.service<<EOF
[Unit]
Description=Rsync Watcher for Directory
After=network.target

[Service]
Type=simple
ExecStart=/opt/rsync_watch/rsync_watch.sh
Restart=always
RestartSec=5
User=root
WorkingDirectory=/opt/rsync_watch
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload # 重新加载 systemd 配置
sudo systemctl enable rsync_watch --now # 开机自启
sudo systemctl status rsync_watch # 查看状态

思科配置回顾备忘录

#查看邻居
show ip bgp neighbors <peer-ip>

#拒收默认路由规则
ip prefix-list DEFAULT-ROUTE-v4 seq 5 deny 0.0.0.0/0
ipv6 prefix-list DEFAULT-ROUTE-v6 seq 5 deny ::/0

#刷新收取路由
clear ip bgp <peer-ip> soft in

#查看BGP连接状态
show ip bgp summary
show bgp ipv6 unicast summary

#筛选配置内容
show running-config | section router bgp

#查看bgp邻居
show bgp ipv6 unicast neighbors <peer-ipv6>
show bgp ipv4 unicast neighbors <peer-ipv4>

#查看网卡状态信息
show ip interface brief

#查看宣告路由表
show bgp ipv6 unicast neighbors <peer-ipv6>  advertised-routes
show bgp ipv4 unicast neighbors <peer-ipv4> advertised-routes

router bgp 65000
no bgp enforce-first-as  #关闭拒收一个as非peer as的路由
neighbor <peer-ipv4> default-originate #BGP发送默认路由

思科路由不收IX路由表问题

帮人配置个思科路踩到个坑:翻了半天文档才发现ASR默认开启了 bgp enforce-first-as,导致路由表里首个 AS 不是peer AS 的前缀都在Local Policy Denied Prefixes里面。

router bgp 65536
 no bgp enforce-first-as

IX在发送交换路由的时候把自身AS过滤掉了,导致无法收表。

之前也用了chatgpt寻找答案,关键点也提到了IX在as-path过滤掉了自生AS,但是仍然没有正确解决思路都没提到,反而一直让route-map的规则里面找配置问题和重新配置BGP Session。

Linux暂停进程,恢复进程,接管进程备忘录

在运行的命令下按Ctrl+Z可以暂停进程运行

fg            #恢复到前台继续运行
jobs        # 查看后台任务
fg %1     # 恢复 jobs 列表里的 1 号任务
bg          #后台继续运行(不挂起)
bg %1   #默认恢复最后一个挂起的任务
disown -h %1  #挂起后转后台长期运行

 

reptyr接管pid

apt install reptyr -y # Debian/Ubuntu
yum install reptyr -y # CentOS/RHEL


reptyr 12345  #12345是pid进程

 

这样可以把一个长期运行需要观察输出的进程丢进screen\tmux里面挂机运行了

xpath选择器技巧备忘

position定位去除第一个和最后一个标签

//*[@id="list"]/li[position() > 1 and position() < last()]/text()

position定位从第二个标签开始

//*[@id="list"]/li[position() >= 2]/text()

多个或选用|作为或选

//*[@id="list1"]/p//text() | //*[@id="list2"]/p//text() | //*[@id="list3"]/p//text()

过滤最后一个标签

//*[@id="list"]//p[position() < last()]/text()

获取meta的property, 也可以获取name

//meta[@property="og:title"]/@content

获取img标签scr

//*[@id="info"]/div[1]/img/@src

从dom内选关键词开始

//span[contains(b/text(), "开始的地方")]//a//text()

<span><b>这是开始的地方</b>内容</span>

 

获取div dom内的所有内容

//div[@class="list"]/node()

screen常用命令参数备忘录

screen -S  name。 创建screen会话
screen -Ls 显示进程列表
screen -r sid 恢复某个进程
screen -X -S sid quit 终止某个进程
ctrl+a  d 离开当前进程
ctrl+a k 终止当前进程
screen -S 原始任务名 -X sessionname 修改后的任务名

thinkphp给控制台增加错误显示方法

路径vendor/topthink/framework/src/think/Console.php

 

在 public function run()的 $output->renderException($e);下面增加

 $output->error($e->getTraceAsString());

thinkphp在model里面切换分表

最近开始玩各种上TB的数据库,为了提升性能使用了分表
<?php
namespace app\model;
use think\Model;
class Blog extends Model
{
    protected $name = 'blog;
    protected $suffix = '0000';
    public static int $blog_id = 1;

    public static function shard(?int $id = null)
    {
        if (is_null($id)) {
            $id = self::$blog_id ;
        }
        $table = sprintf('%04d', intdiv($id, 10000));
        return self::suffix($table);
    }
}

读取数据

$blog = Blog::suffix('0001')->find(1);
$blog->name = 'test';
$blog->save();
print_r($blog);

 简化一下

Blog::$blog_id =100000;
Blog::shard()->find(1);

 

批量更新必须初始化才能使用

$data = new Blog;
$data->setSuffix('0002')->saveAll($updateList);

目前基本实现了在blog_0000 blog_0001 blog_0002 等各种分表里面读写数据

感觉thinkphp的model DB切换不是很灵活。

 

还有一些坑,翻烂了doc文档库都没找到,待更新。

php使用browscap判断浏览器客户端类型

官方项目地址:https://github.com/browscap/browscap

官方网站:https://browscap.org/

下载配置

wget "https://browscap.org/stream?q=PHP_BrowsCapINI' -O  /etc/php/browscap.ini

php.ini里面加入

browscap = /etc/php/browscap.ini

 

测试代码

        $browser = get_browser(null, true);
        print_r($browser);

测试结果

Array
(
    [browser_name_regex] => ~^mozilla/5\.0 \(.*linux.*android.4\.2.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*version/.*safari.*$~
    [browser_name_pattern] => Mozilla/5.0 (*Linux*Android?4.2*)*applewebkit*(*khtml*like*gecko*)*Version/*Safari*
    [parent] => Android Browser Generic
    [comment] => Android Browser Generic
    [browser] => Android
    [browser_maker] => Google Inc
    [platform] => Android
    [ismobiledevice] => 1
    [device_type] => Mobile Phone
    [device_pointing_method] => touchscreen
    [version] => 0.0
    [majorver] => 0
    [minorver] => 0
    [istablet] =>
    [crawler] =>
)

fstab生成脚本

index=1
fstab=fstab
for dev in /dev/nvme2n1p*; do
  eval $(blkid -o export "$dev" | grep -E 'UUID=|TYPE=')
  [ -z "$UUID" ] && continue

  case "$index" in
    1)
      mount_point="/boot/efi"
      fs_pass=1
      ;;
    2)
      mount_point="/boot"
      fs_pass=2
      ;;
    3)
      mount_point="none"
      fs_type="swap"
      options="sw"
      fs_pass=0
      ;;
    4)
      mount_point="/"
      fs_pass=1
      ;;
    *)
      mount_point="/mnt/$(basename "$dev")"
      fs_pass=2
      ;;
  esac

  # 类型判断
  fs_type="${TYPE}"
  options="defaults"

  # 如果是 swap 类型,单独处理
  if [ "$TYPE" = "swap" ] || [ "$fs_type" = "swap" ]; then
    echo "UUID=$UUID none swap sw 0 0" >> $fstab
  else
    mkdir -p "$mount_point"
    echo "UUID=$UUID $mount_point $fs_type $options 0 $fs_pass" >> fstab
  fi

  index=$((index+1))
done
[root@

解决 postfix 拒收邮件问题

sed -i 's/^smtpd_banner=.*/smtpd_banner=$myhostname ESMTP/' /etc/postfix/main.cf
sed -i 's/^smtpd_recipient_restrictions=.*/smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination/' /etc/postfix/main.cf

Another Looking-glass Server 魔改版

wget dl.kvm.la/linux/als.tgz -O - | tar zx
cd als; ./install.sh

修改了源码config/load_from_env.go为自动获取网卡IP

修改了ui/src/components/Speedtest/FileSpeedtest.vue 隐藏了IPv6下载文件,去掉了默认IP下载用于兼容绑定域名链接下载

IPXE alpine-ipxe启动自动脚本

#!ipxe
set mirror https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/boot/
set autoinstall  http://your-ip/alpine-ipxe    #http://your-ip/alpine-ipxe/autoinstall 

kernel ${mirror}/vmlinuz-lts alpine_dev=httpfs:${autoinstall} modules=loop,squashfs,sd-mod,usb-storage quiet
initrd ${mirror}/initramfs-lts
boot

使用rinse构建Linux系统

rinse是为 Debian/Ubuntu 开发的,专用于 Xen PV创建 (如 CentOS、AlmaLinux)的最小根文件系统,类似debootstrap构建deb系的操作系统。

项目官方地址https://salsa.debian.org/debian/rinse

在Alpine Docker容器部署

apk add docker
service docker start
docker run -it debian bash
apt update
apt install rinse  -y

安装完后在/etc/rinse目录可以看到支持

# ls  /etc/rinse
alma-9.packages  centos-7.packages  centos-8.packages  fedora-36.packages  fedora-37.packages  opensuse-15.2.packages  opensuse-15.4.packages  rinse.conf  rocky-8.packages  rocky-9.packages

Mirror源等配置

cat /etc/rinse.conf

 

构建AlmaLinux

mkdir  /alma-root
rinse --arch amd64 --distribution alma-9    --directory  /alma-root

 

构建完系统后,要对安装上内核以及grub引导等等, 当然在构建之前可以预先将分区处理好,

将 boot和boot/efi提前挂载好, 将网络配置还有 fstab hostname 等等通过chroot 进行部署调好。

 

反正 Linux 归根结底就是文件一把梭了,带上内核和 grub 设置完就行了, 理解通透后就是简单非常的简单。

另外还有mock  lorax livemedia-creator 等方案可用,甚至用 dnf 就能打包rhel系的系统, 类似Kickstart/Anaconda可以归类为原生安装了。