I'm XuéChūn - Linux
type: channel
link: https://www.xuechun.vip/tag/Linux/
items: typecho图片压缩和缩放大小
items: 从1panel推送SSL证书到PVE主机
items: 1Panel证书同步到其他服务器
items: Linux SSH免密登录
items: Ubuntu常用命令

typecho图片压缩和缩放大小
type: item
date: 2025-06-25T04:20:00+00:00
description: 手机拍的照片都很大，如果不压缩显示会很慢。安装typecho-MyUpload插件，上传图片时可以自动压缩。在原插件基础上稍微修改代码，实现调整图片尺寸功能（网页显示没必要整高清图片）。安装typecho-MyUpload插件地址 GitHub: https://github.com/jlice/typecho-MyUpload下载解压后放入usr/plugins/目录下，插件运行需要安装jpegoptim（jpg压缩）和pngquant（png压缩），debian/ubuntu安装命令：apt install jpegoptim pngquant插件启用后，如果上传图片失败，检查一下插件目录权限，调整为www-data用户可写可执行。缩放图片尺寸安装ImageMagick，debian/ubuntu安装命令：apt install imagemagicktypecho-MyUpload插件增加缩放宽度选项。打开MyUpload/Plugin.php文件，找到config()函数，增加以下代码：$resizeWidth = new Typecho_Widget_Helper_Form_Element_Text( 'resizeWidth', NULL, '800', _t('图片缩放最大宽度'), _t('当图片宽度超过此值时，等比例缩放到指定宽度，值为0时不缩放。') ); $form->addInput($resizeWidth);然后就可以在后台插件管理设置需要的宽度：修改compressImage()函数，最前面增加以下代码，获取插件面板设置的缩放宽度： // 等比例缩放到指定宽度（小于指定宽度不缩放） $resizeWidth = htmlspecialchars(Typecho_Widget::widget('Widget_Options')->plugin('MyUpload')->resizeWidth); $resizeWidth = is_numeric($resizeWidth) ? intval($resizeWidth) : 0;继续修改compressImage()函数，调用compress_png_inplace和compress_jpg_inplace时增加刚获取的缩放宽度$resizeWidth，修改后的代码：if ($ext === "png") { compress_png_inplace($path, $resizeWidth); } elseif ($ext === "jpg" || $ext === "jpeg") { compress_jpg_inplace($path, $resizeWidth); }增加图片缩放功能实现：打开MyUpload/functions.php文件，对于jpg缩放，找到compress_jpg_inplace()函数，修改为以下代码，函数形参增加$max_width：function compress_jpg_inplace($jpg_path,$max_width=0,$max_quality = 90){ shell_exec("jpegoptim --max=$max_quality --preserve --all-progressive $jpg_path"); // 以下新增 if($max_width>0){ return shell_exec("mogrify -resize '$max_width>' $jpg_path "); } }png缩放修改compress_png_inplace()函数。function compress_png_inplace($png_path, $max_width=0, $max_quality = 90) { $min_quality = 60; shell_exec("pngquant --skip-if-larger --ext .png --force --quality=$min_quality-$max_quality $png_path"); if($max_width>0){ return shell_exec("mogrify -resize '$max_width>' $png_path "); } }

从1panel推送SSL证书到PVE主机
type: item
date: 2025-06-18T14:58:00+00:00
description: 公网和内网用同一个域名访问局域网PVE主机时，避免浏览器证书错误提示。其他用途自己扩展，比如scp同步文件（据说性能比rsync好）。✅进度：已完成初版，要求能够ssh免密登录远程主机。要求：需要在云主机上配置好SSH免密登录PVE。传送门 Linux SSH免密登录实现：脚本其实很简单，自动推送1panel申请好的证书到pve相应目录就可以（/etc/pve/nodes/n100/）。代码已发布到 https://github.com/noyboy/1panel/blob/main/ssl/sync-pve-cert.sh#!/bin/bash # 功能：1panel自动申请证书后，同步到内网pve主机； # 使用：sync-pve-cert.sh [证书存放路径] # 如：sync-pve-cert.sh '/path/to/cert' #指定pem证书存放目录 # 或者 sync-pve-cert.sh #证书与当前脚本在同一目录 # 要求：需要搭配ssh免密登录pve主机； # 远程主机IP，这里代理内网主机192.168.31.254:22到本机127.0.0.1:28122 REMOTE_USER_IP="root@127.0.0.1" # 默认root用户可以不填写 # 远程主机ssh端口号 REMOTE_PORT=28122 # 证书文件，有脚本参数时用参数指定的目录，无参数时用当前脚本目录 PEM_PATH=${1:-$(dirname "$(readlink -f "$0")")} #证书目录 FULLCHAIN_PEM="$PEM_PATH/fullchain.pem" #证书文件 PRIVKEY_PEM="$PEM_PATH/privkey.pem" #密钥文件 # 如果证书不存在则退出 [ ! -f "$FULLCHAIN_PEM" ] && { echo "证书文件：${FULLCHAIN_PEM}未找到" ; exit 1 ; } [ ! -f "$PRIVKEY_PEM" ] && { echo "密钥文件：${PRIVKEY_PEM}未找到" ; exit 2 ; } # 检测目标主机免密登录是否可用 res=`ssh -p $REMOTE_PORT $REMOTE_USER_IP -o PreferredAuthentications=publickey -o StrictHostKeyChecking=no "date" |wc -l` if [ ! $res -eq 1 ] ; then echo "错误：目标主机 $REMOTE_USER_IP:$REMOTE_PORT 免密连接异常，请检测公钥设置是否正确。" exit 1 fi # 推送证书到pve主机 # 语法：scp -P 端口号 -p 文件路径 用户名@远程主机IP:目标目录 # 确保-P参数紧跟在scp命令之后，否则可能会出现错误。 # -p(小写) 保留文件的修改时间、访问时间和权限信息 # 在传输文件或目录时，需要确保源文件或目录具有可读权限，目标目录具有可写权限。 # 如果需要传输的是目录，可以使用-r参数来递归复制整个目录。 # 注意需要把密钥后缀.pem改为.key # 同步证书 scp -P $REMOTE_PORT $FULLCHAIN_PEM ${REMOTE_USER_IP}:/etc/pve/nodes/n100/pveproxy-ssl.pem [ ! $? -eq 0 ] && { echo "${FULLCHAIN_PEM} 同步到远程主机 [$REMOTE_USER_IP:$REMOTE_PORT] 失败！" ; exit 1 ; } # 同步私钥 scp -P $REMOTE_PORT $PRIVKEY_PEM ${REMOTE_USER_IP}:/etc/pve/nodes/n100/pveproxy-ssl.key [ ! $? -eq 0 ] && { echo "${PRIVKEY_PEM} 同步到远程主机 [$REMOTE_USER_IP:$REMOTE_PORT] 失败！" ; exit 1 ; } # 检测文件传输是否正确 ssh -p $REMOTE_PORT $REMOTE_USER_IP "cd /etc/pve/nodes/n100/; ls -l; " # 重启服务，经测试会自动刷新 # ssh -p ${REMOTE_PORT} root@${REMOTE_PORT} "systemctl restart pveproxy;" echo "证书已同步到远程主机 $REMOTE_USER_IP:$REMOTE_PORT." exit 0

1Panel证书同步到其他服务器
type: item
date: 2025-06-18T11:15:00+00:00
description: 利用1panel的证书申请成功后，利用执行脚本功能，实现远程SSL证书推送到其他服务器。✅目前初版已完成，足够自用了。不想再增加其他乱七八糟的功能。说明：1panel 推送证书到远程主机有两种方法：直接上传证书内容到远程主机（推荐）先上传证书文件到远程主机，再执行api调用关键代码(在线仓库地址在文章末尾)# 构建上传证书的请求数据： # - type参数：值为paste为远程上传证书内容，需要privateKey和certificate指定证书文本内容。 # 值为local则读取远程主机内的文件，用privateKeyPath和certificatePath指定，证书在远程主机的文件路径 # UPLOAD_DATA=$(cat <<EOF { "privateKey": "$PRIVATE_KEY_CONTENT", "certificate": "$CERTIFICATE_CONTENT", "type": "paste", "sslID": $SSL_ID, "description": "${DESCRIPTION} ${current_time}" } EOF ) # 生成1panel需要的Token：md5(1panel+SECRET+unix_stamp) TIMESTAMP=$(date +%s); TOKEN_MD5=$(echo -n "1panel${API_SECRET}${TIMESTAMP}"|md5sum |cut -d" " -f1); # 发送证书上传请求 UPLOAD_RESPONSE=$(curl -s -X POST "${PANEL_URL}{$API_SSL_UPLOAD}" \ -H "Content-Type: application/json" \ -H "1Panel-Token: $TOKEN_MD5" \ -H "1Panel-Timestamp: $TIMESTAMP" \ -d "$UPLOAD_DATA") # 输出上传结果 echo "证书上传响应: $UPLOAD_RESPONSE"使用方法：下载脚本，保存到本地，如/root/sync-1panel-cert.sh，记下路径/root，后面要用到。修改参数，一共三个：PANEL_URL: 1panel访问url（例https://1panel.xxx.cn），不需要加安全入口API_SECRET：API接口，在1panel系统设置里面开启，建议添加IP白名单并定期更换。SSL_ID：这个要手动获取，先上传一遍要同步的证书，再开启浏览器开发者工具，点击打开刚上传证书详情，就可以从开发者工具网络选项看到一个数字，就是这个SSL_ID。这个较为麻烦，暂不知道更简单方法。利用1panel证书自动续签功能，选择证书推送到本地目录，路径选刚才保存脚本的路径/root/。勾选申请证书之后执行，下面的脚本内容中填入以下内容，然后确认保存即可。chmod +x /root/sync-1panel-cert.sh /root/sync-1panel-cert.sh保存确认后，1panel会自动执行一次，有异常及时反馈我。其他可在运行脚本时，用参数指定证书路径，调用方法：/root/sync-1panel-cert.sh /path在线仓库地址：https://github.com/noyboy/1panel/blob/main/sync-1panel-cert.sh同类脚本：1panel更新证书后同步到pve

Linux SSH免密登录
type: item
date: 2025-06-18T09:02:00+00:00
description: 目标：客户端(C)免密SSH登录服务器(S)。前置条件：两台设备均开启SSH服务，服务端(S)启用公钥认证。[...]

Ubuntu常用命令
type: item
date: 2024-12-26T08:49:00+00:00
description: 一些Ubuntu常用命令，pve建立容器后初始化系统。但现在所有程序都跑docker了，1panel 搭配 Portainer CE可以更好实现备份和恢复，再装一个飞牛，基本上够用了。更改时区为上海：sudo timedatectl set-timezone Asia/Shanghai查看当前时区设置： timedatectl查看正在监听的端口： sudo netstat -anlp | grep -w LISTEN服务自启动/启动，或者停止：sudo systemctl disable systemd-resolved sudo systemctl stop systemd-resolved sudo systemctl enable systemd-resolved sudo systemctl start systemd-resolved查看所有docker容器IP地址列表docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)公网服务器上DoT服务搭建继续失败，SmartDns也不能用了，周末继续折腾。