服务器生成登陆密钥证书

在你的电脑上执行一下命令:

ssh-keygen -t rsa -b 4096 -C "bandwagonhost_dc3"

ssh-copy-id -i ~/.ssh/bandwagonhost_dc3.pub -p 22  server-user@server-ip

如果默认端口不是22,需要调整为响应的端口号。

如果本地的私钥丢失了,可以再次执行该命令,重新生成。

上述命令在 Mac 上验证通过,Windows 有待验证。

华为云debian12服务器更新系统报错

错误信息:

E: Failed to fetch https://packages.sury.org/php/pool/main/p/php-defaults/php-common_96%2b0%7e20250402.56%2bdebian12%7e1.gbp84a5b7_all.deb  Temporary failure resolving 'packages.sury.org'
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-bcmath_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Could not connect to packages.sury.org:443 (151.101.111.52), connection timed out
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-zip_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-xml_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-readline_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-opcache_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-mysql_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-mbstring_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-intl_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-gd_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-cli_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-fpm_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-curl_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-common_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php-imagick/php8.3-imagick_3.8.0%7erc2-3%2b0%7e20250408.50%2bdebian12%7e1.gbpd16435_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/d/debsuryorg-archive-keyring/debsuryorg-archive-keyring_2025.03.13_all.deb  Unable to connect to packages.sury.org:https:
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
错误信息截图

问题分析:

这个错误说明 Debian 12 在更新或安装 PHP 包时,无法连接到 packages.sury.org。这是 PHP 的一个常用第三方源(由 Ondřej Surý 提供),经常用于安装更新版本的 PHP。但现在遇到了类似 DNS 解析失败或连接超时的问题。

解决办法:

出现这个问题的原因,大概率是因为packages.sury.org在国内访问不畅,可以使用以下方法尝试解决:

尝试切换服务器DNS,执行/etc/resolv.conf,添加以下内容:

nameserver 8.8.8.8
nameserver 1.1.1.1

然后再执行:

sudo apt update
sudo apt upgrade

如果还是不能解决,可以那么只能挂代码,或者切换源,不过 sury.org 很少有完整镜像,可能需要手动下载 .deb 包安装。

最后如果都无法解决,可以暂时注释掉 Sury 源。

我是通过修改DNS解决的问题。

debian 清理内核

1、查看已安装的内核:

dpkg --list | grep linux-image

输出类似于:

root@localhost:~# dpkg --list | grep linux-image
rc  linux-image-5.10.0-15-amd64    5.10.120-1                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-16-amd64    5.10.127-2                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-17-amd64    5.10.136-1                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-19-amd64    5.10.149-2                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-20-amd64    5.10.158-2                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-21-amd64    5.10.162-1                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-22-amd64    5.10.178-3                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-23-amd64    5.10.179-3                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-24-amd64    5.10.179-5                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-26-amd64    5.10.197-1                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-27-amd64    5.10.205-2                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-8-amd64     5.10.46-5                                      amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-6.1.0-17-amd64     6.1.69-1                                       amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-18-amd64     6.1.76-1                                       amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-20-amd64     6.1.85-1                                       amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-21-amd64     6.1.90-1                                       amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-22-amd64     6.1.94-1                                       amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-23-amd64     6.1.99-1                                       amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-25-amd64     6.1.106-3                                      amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-26-amd64     6.1.112-1                                      amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-27-amd64     6.1.115-1                                      amd64        Linux 6.1 for 64-bit PCs (signed)
ii  linux-image-6.1.0-28-amd64     6.1.119-1                                      amd64        Linux 6.1 for 64-bit PCs (signed)
ii  linux-image-6.1.0-33-amd64     6.1.133-1                                      amd64        Linux 6.1 for 64-bit PCs (signed)
ii  linux-image-amd64              6.1.133-1                                      amd64        Linux for 64-bit PCs (meta-package)

标记 ii表示已安装
​标记 rc表示已卸载但残留配置

2、确定当前已安装的内核:

uname -r

3、如果使用的不是最新的内核,需要重启应用新内核:

sudo reboot

4、清理内核:

sudo apt autoremove --purge

5、清理rc状态的内核:

sudo apt purge $(dpkg --list | grep '^rc' | awk '{print $2}')

清理后内核列表如下:

root@localhost:~# dpkg --list | grep linux-image
ii  linux-image-6.1.0-28-amd64     6.1.119-1                                      amd64        Linux 6.1 for 64-bit PCs (signed)
ii  linux-image-6.1.0-33-amd64     6.1.133-1                                      amd64        Linux 6.1 for 64-bit PCs (signed)
ii  linux-image-amd64              6.1.133-1                                      amd64        Linux for 64-bit PCs (meta-package)

注意:系统会自动保留一个旧内核作为回退,不要强制删除。

Debian 12 包安全机制变更简述

Debian 12 包安全机制变更简述

在新版本 Debian 12 (Bookworm) 中,安全签名验证机制有了一些重要的改进,目的是提高包管理的安全性,避免设备因为不可靠源而遭到渗透。

主要的变更包括:

1. 静态 keyring 文件

以前,系统通过 /etc/apt/trusted.gpg 和 /etc/apt/trusted.gpg.d/中的可信签名密钥来校验所有包源,但这种方式存在风险,文件权限过于宽松,可能被权限高的进程修改,而且对全部包源通用,有很大的风险面。

在 Debian 12 里,每个 APT 包源建议都使用独立的 keyring,并通过 sources.list或 .list 文件中的 signed-by 参数指定,如:

deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ bookworm main

这种写法可以确保:

  • 仅仅信任指定源,避免全局性影响
  • 便于维护和检查,提高安全性

2. 公钥管理方式改变

对于新添包源,得自行下载并存放公钥(而不再是直接 apt-key add),如:

wget -O /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg

这种做法是更安全的,避免未来 apt-key 废弃后造成乱。

3. 实际环境中的关键问题

实际使用过程中,如果包源没有按要求指定 signed-by,而又缺少对应公钥,就会出现类似:

The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B188E2B695BD4743

遇到这种错误,需要按照源网站提供的方式下载公钥,且放至正确的 keyrings 目录,然后重新扫描系统:

sudo apt update

总结

Debian 12 安全机制的改进,令包管理更加井井有条,就是多了一些初始配置工作,但也为全体系统的安全性打下了更坚实的基础。

在最近有设备升级到 Debian 12 或者添加了第三方包源时,记得检查 signed-by配置,并确保 keyring 是最新版本!

debian 12 通过 pip 安装 pdf2docx

在 Debian 12 上安装 pdf2docx,可以通过 Python 的包管理工具 pip 来安装。为了避免影响系统的环境,建议在一个 Python 虚拟环境中安装该工具。下面是详细的安装步骤:

1. 安装 Python 3 和 pip

首先,确保你的系统已经安装了 Python 3 和 pip。可以通过以下命令检查:

python3 --version
pip3 --version

如果没有安装,可以通过以下命令安装:

sudo apt update
sudo apt install python3 python3-pip

2. 创建 Python 虚拟环境

虚拟环境可以隔离不同项目所需的依赖包。创建虚拟环境的步骤如下:

python3 -m venv myenv

这将创建一个名为 myenv 的虚拟环境,所有的包将会安装在这个目录下,而不会影响系统环境。

3. 激活虚拟环境

要使用虚拟环境中的 Python 和 pip,你需要先激活它。使用以下命令来激活虚拟环境:

source myenv/bin/activate

激活后,你的终端提示符会发生变化,通常会看到虚拟环境的名称(myenv)出现在命令行前缀处,表明你当前处于该虚拟环境中。

4. 安装 pdf2docx

在虚拟环境中,你可以使用 pip 安装 pdf2docx:

pip install pdf2docx

安装完成后,pdf2docx 将只会安装在 myenv 目录下,而不会影响系统环境。

5. 使用 pdf2docx

安装完成后,你就可以在虚拟环境中使用 pdf2docx 进行 PDF 转 DOCX 的转换了。例如,使用以下命令:

from pdf2docx import Converter

cv = Converter('input.pdf')
cv.convert('output.docx', start=0, end=None)
cv.close()

6. 退出虚拟环境

当你完成工作后,可以通过以下命令退出虚拟环境:

deactivate

这样,你就成功在 Debian 12 上通过 pip 安装了 pdf2docx,并且使用了 Python 虚拟环境来隔离依赖,避免对系统环境的影响。

Debian 12 下 pip 更换国内源

在 Debian 12 上,pip 默认使用的是官方的 Python 包索引(PyPI),但由于网络原因,访问可能会较慢。为了提高下载速度,可以更换为国内的镜像源。

1. 临时使用国内源

如果只是临时使用国内源,可以在安装 Python 包时添加 -i 参数。例如:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple somepackage

2. 修改用户级别配置(推荐)

为了让 pip 默认使用国内源,可以修改用户级别的配置文件,推荐使用以下方法:

mkdir -p ~/.config/pip

echo "[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple" > ~/.config/pip/pip.conf

这样 pip 以后都会默认使用清华源,无需每次手动指定。

3. 修改全局配置(需要管理员权限)

如果希望所有用户都使用国内源,可以修改全局配置文件:

sudo mkdir -p /etc/pip

echo "[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple" | sudo tee /etc/pip/pip.conf

这种方式会影响系统中所有用户的 pip 配置。

4. 其他国内源

除了清华 TUNA 源,还可以选择其他国内镜像源,例如:

  • 阿里云: https://mirrors.aliyun.com/pypi/simple/
  • 中国科技大学: https://pypi.mirrors.ustc.edu.cn/simple/
  • 豆瓣: https://pypi.douban.com/simple/(不稳定)

可以根据个人网络情况选择合适的源。

5. 验证配置是否生效

可以运行以下命令检查当前 pip 使用的源:

pip config list

如果输出中包含 index-url = https://pypi.tuna.tsinghua.edu.cn/simple,说明配置已经生效。

这样就可以更快地安装 Python 包,提高开发效率!

Debian使用服务单元部署asp.net core

创建 /etc/systemd/system/your_app.service 文件,替换为适合你的应用的名称:

[Unit]
Description=ASP.NET Core Application

[Service]
WorkingDirectory=/path/to/your_app/publish
ExecStart=/usr/bin/dotnet /path/to/your_app/publish/your_app.dll
Restart=always
RestartSec=10
SyslogIdentifier=dotnet-your_app
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target
  • WorkingDirectory:应用程序的工作目录(发布目录)。
  • ExecStart:启动应用的命令,这里指定 dotnet 和应用的 DLL 文件路径。
  • Restart:配置应用异常退出时自动重启。
  • SyslogIdentifier:指定日志标识符,可以方便地过滤日志。
  • User:指定运行服务的用户(例如 www-data,避免使用 root 用户)。
  • Environment:指定环境变量(如 Production)。

启动并启用服务:

sudo systemctl enable your_app.service
sudo systemctl start your_app.service

查看服务状态:

sudo systemctl status your_app.service

查看服务日志:

sudo journalctl -u your_app.service

nginx 反代模板:

server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass https://notes.wujie.me:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

查看实时日志输出

要实时查看应用的日志输出,可以使用以下命令:

sudo journalctl -u your_app.service -f
  • -u your_app.service 指定服务名称,替换为你的服务文件名称。
  • -f 表示实时跟踪日志输出(类似 tail -f)。

查看全部日志

查看应用自启动以来的全部日志:

sudo journalctl -u your_app.service

这将显示该服务的全部日志记录。

按时间范围查看日志

可以按时间范围筛选日志,例如查看过去一小时的日志:

sudo journalctl -u your_app.service --since "1 hour ago"

或者查看特定日期之后的日志:

sudo journalctl -u your_app.service --since "2024-11-01"

按关键字过滤日志

如果你只想查看特定关键字的日志,例如包含错误信息的日志,可以使用 grep 命令进行过滤:

sudo journalctl -u your_app.service | grep "error"

 清除指定服务的日志

要清除特定服务(如 ASP.NET Core 应用)的日志,可以使用 journalctl 的 –vacuum 选项。虽然 journalctl 没有直接提供按服务清除的功能,但可以通过指定服务名来筛选日志,再结合清除命令:

sudo journalctl --vacuum-size=100M -u your_app.service

这将限制日志文件的总大小为 100MB,多余的日志会被删除。将 100M 替换为你期望的日志限制大小。

清除日志到指定时间点

你可以通过 –vacuum-time 参数清除指定时间之前的所有日志数据:

sudo journalctl --vacuum-time=7d

这将清除 7 天之前的所有日志数据,包括所有服务的日志(不是仅 ASP.NET Core 应用)。

清除所有 journald 日志

如果你希望彻底清除所有 journald 日志数据(适用于开发或测试环境,生产环境需谨慎),可以使用以下命令:

sudo journalctl --vacuum-size=1M

这会将日志数据限制为 1MB,基本相当于清空所有日志数据。

如果你希望彻底清除所有 journald 日志数据(适用于开发或测试环境,生产环境需谨慎),可以使用以下命令:

sudo journalctl –vacuum-size=1M

删除 journal 日志文件

可以手动删除存储在 /var/log/journal/ 目录下的日志文件。这样会清空所有服务的日志,建议谨慎使用。

sudo rm -rf /var/log/journal/*
sudo systemctl restart systemd-journald

定期清理

可以在 journald 配置文件 /etc/systemd/journald.conf 中设置日志的最大保留大小或时间,定期清理旧日志。

Debian12安装dotnet sdk

安装微软源:

wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

sudo dpkg -i packages-microsoft-prod.deb

rm packages-microsoft-prod.deb

安装 SDK

sudo apt-get update && sudo apt-get install -y dotnet-sdk-9.0

安装运行时

sudo apt-get update &&  sudo apt-get install -y aspnetcore-runtime-9.0

作为 ASP.NET Core 运行时的一种替代方法,你可以安装不包含 ASP.NET Core 支持的 .NET 运行时:将上一命令中的 aspnetcore-runtime-9.0 替换为 dotnet-runtime-9.0:

sudo apt-get install -y dotnet-runtime-9.0

使用 apt 更新 .NET

当有新的小版本更新时,只需使用以下命令通过 apt 进行升级:

sudo apt-get update
sudo apt-get upgrade

参考:https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-debian?tabs=dotnet9

Debian 安装 killall 命令

昨天部署一台 Debian 12 服务器,发现竟然没有killall命令,那么就来安装一下吧。

执行apt install psmisc命令安装 psmic 包,这个包的官方仓库是 https://gitlab.com/psmisc/psmisc ,描述是“一组使用 proc 文件系统的小型实用程序”,包含以下六个实用工具:

  • fuser – 使用文件或套接字识别进程
  • killall – 根据名称终止进程,例如 killall -HUP named
  • prtstat – 打印进程的统计信息
  • pslog – 打印进程的日志路径
  • pstree – 以树的形式显示当前正在运行的进程
  • peekfd – 显示通过文件描述符传输的数据

安装完成后,就可以使用killall命令根据进程名称终止进程了。

后记:

2025年了,时间仿佛飞一般,一年转瞬即逝,新的一年已经到来,等过完了春节就到了阳历二月,再有十个月就是 2026 年了。所以,不要蹉跎岁月,有什么想法要抓紧时间去干。

查看Debian开机启动项

查看所有启用的服务:

systemctl list-unit-files --type=service

该命令会列出所有服务的启动状态,其中标记为 enabled 的服务会在开机时自动启动。

查看当前正在运行的服务:

systemctl list-units --type=service

这个命令会列出当前正在运行的服务,已启动的服务会标记为 running。

systemctl list-unit-files --type=service 输出 列表太长,如果不想看整个列表,只想简单地查看启用的服务,可以运行以下命令:

systemctl list-unit-files --type=service | grep enabled

这个命令会列出所有启用(enabled)的服务,只有那些会在系统启动时自动启动的服务会被显示。

查看当前运行的服务

systemctl list-units --type=service --state=running

这个命令会显示当前正在运行的服务,但它不会直接列出所有已配置为开机启动的服务。它只会列出系统启动后当前处于运行状态的服务。

检查特定服务是否设置为开机启动

systemctl is-enabled <service-name>

例如,要查看 ssh 服务是否在开机时启动:

systemctl is-enabled ssh

如果返回 enabled,则表示该服务已配置为开机启动。

使用 grep 筛选开机启动的服务(更简洁的命令)

systemctl list-unit-files --type=service | awk '$2=="enabled" {print $1}'

这个命令会只输出那些标记为 enabled 的服务名称,避免显示其他无关的服务信息。

最后,也可以查看/etc/init.d/目录(SysVinit 脚本,这个适合于老旧的系统,新系统中也会有这个目录,但不太推荐使用了)

ls /etc/init.d/