卸载VMware之后,原来的VM内部还保留着VMWare Tools,每次开机的时候客户机系统会报错.

  1. 优选方式是在卸载VMWare前先打开客户机系统, 卸载对应的VMWare Tools.

  2. 如果已经卸载了VMWare Workstation, 可以在客户机系统内运行下面这个脚本, 运行后重启客户机系统即可.

remove_vmware_tools.ps1 以管理员身份运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# This script will manually rip out all VMware Tools registry entries and files for Windows 2008-2019
# Tested for 2019, 2016, and probably works on 2012 R2 after the 2016 fixes.

# This function pulls out the common ID used for most of the VMware registry entries along with the ID
# associated with the MSI for VMware Tools.
function Get-VMwareToolsInstallerID {
foreach ($item in $(Get-ChildItem Registry::HKEY_CLASSES_ROOT\Installer\Products)) {
If ($item.GetValue('ProductName') -eq 'VMware Tools') {
return @{
reg_id = $item.PSChildName;
msi_id = [Regex]::Match($item.GetValue('ProductIcon'), '(?<={)(.*?)(?=})') | Select-Object -ExpandProperty Value
}
}
}
}

$vmware_tools_ids = Get-VMwareToolsInstallerID

# Targets we can hit with the common registry ID from $vmware_tools_ids.reg_id
$reg_targets = @(
"Registry::HKEY_CLASSES_ROOT\Installer\Features\",
"Registry::HKEY_CLASSES_ROOT\Installer\Products\",
"HKLM:\SOFTWARE\Classes\Installer\Features\",
"HKLM:\SOFTWARE\Classes\Installer\Products\",
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\"
)

$VMware_Tools_Directory = "C:\Program Files\VMware"
$VMware_Common_Directory = "C:\Program Files\Common Files\VMware"

# Create an empty array to hold all the uninstallation targets and compose the entries into the target array
$targets = @()

If ($vmware_tools_ids) {
foreach ($item in $reg_targets) {
$targets += $item + $vmware_tools_ids.reg_id
}
# Add the MSI installer ID regkey
$targets += "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{$($vmware_tools_ids.msi_id)}"
}

# This is a bit of a shotgun approach, but if we are at a version less than 2016, add the Uninstaller entries we don't
# try to automatically determine.
If ([Environment]::OSVersion.Version.Major -lt 10) {
$targets += "HKCR:\CLSID\{D86ADE52-C4D9-4B98-AA0D-9B0C7F1EBBC8}"
$targets += "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9709436B-5A41-4946-8BE7-2AA433CAF108}"
$targets += "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{FE2F6A2C-196E-4210-9C04-2B1BC21F07EF}"
}

# Add the VMware, Inc regkey
If (Test-Path "HKLM:\SOFTWARE\VMware, Inc.") {
$targets += "HKLM:\SOFTWARE\VMware, Inc."
}

# Add the VMware Tools directory
If(Test-Path $VMware_Tools_Directory) {
$targets += $VMware_Tools_Directory
}

# Thanks to @Gadgetgeek2000 for pointing out that the script leaves some 500mb of extra artifacts on disk.
# This blob removes those.
If(Test-Path $VMware_Common_Directory) {
$targets += $VMware_Common_Directory
}

# Create a list of services to stop and remove
$services = Get-Service -DisplayName "VMware*"
$services += Get-Service -DisplayName "GISvc"

# Warn the user about what is about to happen
# Takes only y for an answer, bails otherwise.
Write-Host "The following registry keys, filesystem folders, and services will be deleted:"
If (!$targets -and !$services ) {
Write-Host "Nothing to do!"
}
Else {
$targets
$services
$user_confirmed = Read-Host "Continue (y/n)"
If ($user_confirmed -eq "y") {

# Stop all running VMware Services
$services | Stop-Service -Confirm:$false

# Cover for Remove-Service not existing in PowerShell versions < 6.0
If (Get-Command Remove-Service -errorAction SilentlyContinue) {
$services | Remove-Service -Confirm:$false
}
Else {
foreach ($s in $services) {
sc.exe DELETE $($s.Name)
}
}

# Remove all the files that are listed in $targets
foreach ($item in $targets) {
If(Test-Path $item) {
Remove-Item -Path $item -Recurse
}
}
Write-Host "Done. Reboot to complete removal."
}
Else {
Write-Host "Failed to get user confirmation"
}
}

参考

broestls/Remove_VMwareTools.ps1 - Github Gist Force removal of VMware Tools, Program Files, and Windows Services

这一排音乐感觉氛围非常的相似…

VXLLAIN, iGRES, ENXK - Crystal Skies (Sped Up)

VØJ, Narvent - Memory Reboot (4K Music Video)

Narvent - Fainted (4K Music Video)

VXLLAIN, iGRES, ENXK - Amber Skies

Xalv - Oblivion | Ana de Armas (Music Video)

Goth (Slowed + Reverb)

Navjaxx, VXLLAIN - Distant Memories (4K Official Music Video)

Lonely Lies, GOLDKID$ - Interlinked (Official Slowed Audio)

Narvent - Her Eyes (4K Music Video)

Sleepwalker (Slowed)

MONTAGEM KOE [EXTENDED]

这一堆也一样, 甚至我都没注意到是不同的歌曲, 好像能自动连在一起

我们俩DJ 2026 (戴羽彤) | Hai Chúng Ta Remix 2026 - DJFeng Remix | Hot TikTok - Douyin

Stereo Love x On The Floor Remix 2026 - DJ细粒 Remix | Hot TikTok - Douyin

一点点 (DJ抖音版) - 董唧唧、芊芊龍『My heart 请你在靠近我一点点,我又不是坏人你干嘛离我那么远。』♪ || 一听就上头的神曲 | 抖音热门歌曲 | 抖音 | TikTok ♪

落空 (抖音DJ版) - 印子月『你说完了的话还在心头汹涌,笑着挥手 还没回头 泪水比我坦诚。』♪ || 年度最佳抖音歌曲 | 抖音最火歌曲音 | 抖音 | TikTok •|• Douyin

空白DJ 2026 (Void - Pank) | Khoảng Trống Remix 2026 - DJ小智 Remix | Hot TikTok - Douyin

喜欢DJ 2026 (阿肆) | Thích Remix - A Tứ (Hot TikTok 2026) - DJZW Remix | Hot TikTok - Douyin

Sa Vào Nguy Hiểm Ver4 (Thazh x Đông Remix Tiktok 2025) 葛东琪 - 悬溺 (越南鼓卡点舞) || Hot Tiktok Douyin DJ抖音版

MƯỜI NĂM NHÂN GIAN 十年人間 - GNAB REMIX 这个旋律还不错,但是他们remix的大部分歌曲好像都是这个调

BÁI NGUYỆT 拜月 - GNAB REMIX

NHÂN GIAN KINH HỒNG KHÁCH 人间惊鸿客 - GNAB REMIX

NAN GIẢI 难解 - GNAB REMIX

往期优秀作品推荐

2026年2月-4月

查看表压缩率

1
2
3
4
5
6
7
8
9
10
11
SELECT
database,
table,
sum(rows) AS row_count,
formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed, formatReadableSize(sum(data_compressed_bytes)) AS compressed,
round(sum(data_compressed_bytes) / sum(data_uncompressed_bytes) * 100, 2) AS compression_ratio
FROM
system.parts
WHERE database != 'system' and active
GROUP BY database, table
ORDER BY compression_ratio ASC

统计字段压缩率

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
name,
table,
formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed,
formatReadableSize(sum(data_compressed_bytes)) AS compressed,
sum(data_compressed_bytes) as compressed_bytes,
round(sum(data_compressed_bytes) / sum(data_uncompressed_bytes) * 100, 2) AS compression_ratio
FROM
system.columns
WHERE
database = '...' and table = '...'
GROUP BY table, name
ORDER BY name, compressed_bytes ASC

无损音乐粤语经典-林子祥《数字人生》 | 林子祥 - 數字人生『3 0624700』【動態歌詞Lyrics】

陈慧娴《千千阙歌》百万豪装录音棚大声听

VXLLAIN, iGRES, ENXK - Crystal Skies (Sped Up) | 循环歌单|《何意味の小曲》《我xxの小曲》Crystal Skies(Sped Up)

一小时单曲循环~《喽他》の【纯享版】

Chess Type Beat | joyful - chess (slowed) | 循环歌曲 |《老鼠舞の小曲》Chess Type Beat(Slowed)

Sleeping City 白菜对我笑(超燃FUNK) (TTW21 Remix Tiktok Proghouse Mix 2026) 情绪回收站 (DJ抖音版) || Hot Douyin | “白菜对我笑”の小曲是怎么创作出来的?“白菜对我笑”的不同版本! | 《白菜对我笑の小曲》《骷髅跳舞の小曲》Sleeping City Funk

《聚财咒》完整版,急急那如律令嘛咪呗呗哄!

Maduk - Alone (feat. Marianna Ray)

恋人心 (抖音DJ版) - 魏新雨「化作风化作雨化作春走向你,梦如声梦如影梦是遥望的掌印。」 ♪ || 快手热门摇BGM | 抖音熱門 | 最近热门音乐 | 抖音 | TikTok ♪

You & Me (feat. Nikolett)

《唐嘉琦の小曲》《赏金猎人の小曲》《剪辑の小曲》——MONTAGEMALQUIMIA | MONTAGEM ALQUIMIA [EXTENDED]

【循环歌单】|《幻昼4.0》“【伏黑甚尔の小曲】【天与暴君の小曲】”

《恐怖直立猿の小曲》“我发现他们好像都对石头过敏”【The King】

「我见过许多忧郁之人」【忧郁の小曲】&【生化危机の小曲】《Una Mattina (DJ纯享版)》-深夜电台

【循环歌曲】· 禅者行脚の小曲 清冷佛子の小曲《TRILLIUM HARDTEKK》 | 跳跃不是罪过 | TRILLIUM HARDTEKK - S3RL | 原版 Trillium - S3RL feat Sara

循环音乐|《海阔天空尾奏》”见过花开就好 何必在意花为谁开”

I Don’t Want to Set the World on Fire 辐射的小曲

Ramba Ho | Dhurandhar | Ranveer Singh, Shashwat Sachdev, Madhubanti Bagchi 不知道唱的什么但是很燃

MONTAGEM HIKARI [EXTENDED]

⟪Ai Đưa Em Về⟫ 中文翻译 Low Cortisol Song

往期优秀作品推荐

2025年11月

两年前写过一篇关于容器流量重定向的文章, 当时对网络了解还不是非常深刻, 加上当时podman使用的是cni插件式网络堆栈, 配置起来似乎较为复杂, Podman 4.0后已经使用netavark显得之前的配置已经有一些过时了.

Podman版本: 4.9.3

整体的目标还是一致的, 需要创建一个单独的Podman network, 挂在这个网络下的容器的出网流量默认都走到一个GRE隧道里.

先创建GRE隧道

1
2
3
4
sudo ip link add dev gre12 mtu 1380 type gre local <本地网卡地址> remote <远端网卡地址>
sudo ip addr add 10.66.4.2/30 dev gre12
sudo ip link set dev gre12 up
sudo iptables -t nat -A POSTROUTING -o gre12 -j MASQUERADE

在对端也要创建GRE隧道

1
2
3
4
5
6
7
sudo ip link add dev gre12 mtu 1380 type gre local <对端网卡地址> remote <本地网卡地址>
sudo ip addr add 10.66.4.1/30 dev gre12
sudo ip link set dev gre12 up

# 注意这里 eth0 要根据对端机器上出网网卡来决定
sudo iptables -t nat -A POSTROUTING -i gre12 -o eth0 -j MASQUERADE
sudo sysctl -w net.ipv4.ip_forward=1

然后创建容器网络

1
2
sudo podman network create --ip-range=10.89.0.0/24 overseas
sudo podman network update overseas --dns-add <目标网络DNS服务器>

配置网络转发规则

1
2
3
4
5
6
# 不是发往本地网络的, 一律添加fwmark并转发
sudo iptables -t mangle -A PREROUTING -s 10.89.0.0/24 ! -d 192.168.0.0/16 -j MARK --set-mark 0x2

# 添加标记的流量, 通过GRE隧道转发
sudo ip rule add fwmark 2 lookup 55
sudo ip route add default via 10.66.4.1 table 55

Podman版本: 4.9.3

Ubuntu版本: Ubuntu 24.04.3 LTS

ufw版本: 0.36.2

问题描述

Rootful Podman容器创建后无法访问外网, 通过 -p 暴露的端口也无法直接被外部访问.

解决方案

  1. 暴露端口无法访问
1
sudo ufw allow <端口>
  1. 容器无法访问外网 (同样适用于通过podman network create创建的bridge类型网络)
1
2
sudo ufw allow in on podman0
sudo ufw route allow in on ens18 out on podman0

形成的原理是因为ufw会把filter表的INPUT, FORWARD policy都设置为 DROP, 如果没有单独配置的话从内部进来的流量(其实算forward)会被drop掉.

参考资料

UFW blocks Podman connections #27273 只搜到了这么一个issue, 但是里面并没有提到什么好的解决方案

前景提要

电信提供了公网IPv6地址, 一般情况下无需改动光猫配置. 有时需要通过管理员密码(找宽带安装师傅要)登录光猫后台启用IPv6功能.

根据观测, 大部分家庭宽带默认开启了较高等级的防火墙, 会禁止外部发起IPv6链接. 需要通过管理员密码登录光猫后台找到防火墙配置, 改为更低等级的防护或关闭防火墙.

注意, 对于家庭网络中光猫-路由器-其他设备的场景, 路由器IPv6配置方式可能需要改为 Native 才能使局域网设备也获得公网IPv6. 某些路由器(比如华硕)的 Stateless 配置似乎存在Bug导致只有路由器本身能获取到v6而下级设备无法正确获取地址.

另外根据观测, 不同ISP(例如联通和电信)之间的公网IPv6地址无法实现互通.

问题概述

两个小区之间都接入了电信的家庭宽带, 其中一端(下称A)开启了允许公网访问. 由另一端(下称B)向开启公网访问的这一端发起WireGuard连接.

电信提供的公网IPv6地址似乎在一段时间之后会失效, 但是在失效前一段时间, 会同时并存多个IPv6公网地址, 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ip a
...
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
altname enp0s18
inet 192.168.xx.xx/24 brd 192.168.xx.255 scope global ens18
valid_lft forever preferred_lft forever
inet6 240e:xx:xx:xx::xx/128 scope global dynamic noprefixroute
valid_lft 25044sec preferred_lft 25044sec
inet6 240e:xx:321a:xx:xx:xx:xx:xx/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 177778sec preferred_lft 91378sec
inet6 240e:xx:3216:xx:xx:xx:xx:xx/64 scope global dynamic mngtmpaddr noprefixroute <--- 注意这个地址
valid_lft 91395sec preferred_lft 4995sec
inet6 fe80::xx:xx:xx:xx/64 scope link
valid_lft forever preferred_lft forever
...

大部分情况下这种情况不会持续太久, 但是有时候老的地址会在 valid_lft 之前实际上失效, 即无法通过该IPv6地址收到来自外部的回包, 但仍然能够通过该地址发送IPv6数据包.

由于WireGuard并不能设置ListenAddress这样的东西, 导致从tcpdump看到远端A能够正常收到来自 240e:xx:3216:xx:xx:xx:xx:xx 的握手包且发送了回包, 但是本端(B)无法正常收到回包导致握手失败.

进一步排查, Linux允许同一个接口有多个IPv6地址, 并且会根据 RFC 6724 来选择出网的IPv6地址的. 可以看到其中并不会根据 preferred_lftvalid_lft 进行选择. 而对比到目标地址 240e:xx:3211:... 的最长前缀, 可以发现两个地址到目标地址的最长前缀都是一样的 (0x3211=11001000010001, 0x3216=11001000010110, 0x321a=11001000011010) 因此似乎Linux内核的选择并没有问题, 但实际上会导致通讯一直中断, 直到 240e:xx:3216:xx:xx:xx:xx:xx 这条地址所指定的 valid_lft 归零才会恢复.

解决办法

解决办法有两种:

  1. 手动(或者通过定时任务)删除 valid_lft 更小的IPv6地址
1
sudo ip addr del 240e:xx:3216:xx:xx:xx:xx:xx/64 dev ens18
  1. 强制该接口重新配置IPv6, 这会立刻删除掉该接口的所有IPv6地址, 内核会重新创建 link-local address, 并完成SLAAC配置.
1
2
sudo sysctl -w net.ipv6.conf.ens18.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.ens18.disable_ipv6=0

上述命令会使Linux内核创建 fe80::... 这样的 link-local 地址.

如果没有自动获得公网IPv6地址, 对于使用 systemd-networkd 的系统, 可通过 networkctl 触发配置:

1
2
3
4
5
6
7
$ sudo networkctl
IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier unmanaged
2 ens18 ether routable configured

$ sudo networkctl reload
$ sudo networkctl reconfigure ens18

完成后接口将获取到新的IPv6地址. (不一定和之前的不一样, 但只会有一个)

除了使用 networkctl, 还可以使用 rdisc6 (sudo apt install ndisc6) 命令触发 SLAAC:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ rdisc6 -1 ens18
Soliciting ff02::2 (ff02::2) on ens18...

Hop limit : 255 ( 0xff)
Stateful address conf. : No
Stateful other conf. : Yes
Mobile home agent : No
Router preference : medium
Neighbor discovery proxy : Yes
Router lifetime : 1800 (0x00000708) seconds
Reachable time : unspecified (0x00000000)
Retransmit time : unspecified (0x00000000)
Prefix : 240e:xx:xx:xx::/64
On-link : Yes
Autonomous address conf.: Yes
Valid time : 2993 (0x00000bb1) seconds
Pref. time : 2993 (0x00000bb1) seconds
Recursive DNS server : 240e:xx:xx:xx:xx:xx:xx:xx
DNS server lifetime : infinite (0xffffffff)
MTU : 1500 bytes (valid)
Source link-layer address: xx:xx:xx:xx:xx:xx
from fe80::f22f:xx:xx:xx

生成临时密码

1
openssl rand -base64 48

会生成类似如下的字符串 6/4tsW7PR4bYjdY+zzZWEGIsuUz8RIwrNc8FTeQLoeouGO/C3RK/JeqNi8E6nR1l

1
tr -dc 'A-Za-z0-9!?%=' < /dev/urandom | head -c 16; echo

这样生成出来的字符串更适合需要特殊字符的场景, 例如 SYqx!6J3=M8jrUeh

流式加解密

1
2
3
4
5
6
7
8
9
10
# 加密

cat input.raw | openssl enc -aes-256-cbc -e -pbkdf2 -iter 100000 -salt > output.raw
enter AES-256-CBC encryption password:
Verifying - enter AES-256-CBC encryption password:

# 解密

cat output.raw | openssl enc -aes-256-cbc -d -pbkdf2 -iter 100000 -salt > decrypted.raw
enter AES-256-CBC decryption password:

分块传输(对网盘上传比较友好)

1
2
3
4
5
6
7
8
9
10
# 加密后分块

cat input.raw | openssl enc -aes-256-cbc -e -pbkdf2 -iter 100000 -salt | split -b 1G -d -a 3 - chunk_
enter AES-256-CBC encryption password:
Verifying - enter AES-256-CBC encryption password:

# 合并后解密

cat chunk_* | openssl enc -aes-256-cbc -d -pbkdf2 -iter 100000 -salt > decrypted.raw
enter AES-256-CBC decryption password:

CBC加密后分块可以配合tar命令使用, tar可以保证缺块的情况下仍然能够最大限度的提取出可用的文件.

split 命令, -d 为使用数字结尾(而不是aaa,aab这样), -a 2 表示补全到两位, 需要预估总输入大小确保不会出现 01, 02, ..., 99, 100 这样的情况. 否则 cat 的时候可能会错乱.

基于GPG的对称流式加解密

gpg能做非对称加解密已经是老生常谈了, 但是对称加密之前用到的不多

1
2
3
4
5
6
7
8
9
10
11
# 加密后分块
passphrase=$(openssl rand -base64 128 | tr -d '\n')
echo "Passphrase: $passphrase"
exec {passfd}<<<"$passphrase"
tar -cvf - input_dir | pv | gpg --symmetric --s2k-cipher-algo AES256 --s2k-digest-algo SHA512 --s2k-count 65536 --no-compress --batch --pinentry-mode loopback --passphrase-fd $passfd | split -b 1G -d -a 3 - chunk_
unset passphrase
exec $passfd>&-

# 合并后解密
exec {passfd}<<<"$passphrase"
cat chunk_* | gpg --decrypt --batch --pinentry-mode loopback --passphrase-fd $passfd | pv | tar -xvf -

GnuPG使用的是 aes-256-cfb 模式进行的加密(不能调整模式). exec {passfd}<<<"$passphrase" 是从字符串创建一个fd, 需要注意的是bash/zsh实际上会创建一个 /tmp/tmp.XXXXXX 的文件然后立刻删除. exec $passfd>&- 会关闭这个fd. 可以使用这个命令查看当前shell打开的fd: ls -l /proc/$$/fd

需要注意要加 --no-compress 选项. gpg默认是开启压缩的, 但是内部的压缩组件似乎有问题, 会导致莫名其妙的报错比如: gpg: Fatal: zlib inflate problem: invalid distance code. 在网上翻了一下没看到有什么特别好的解法, 大部分都是说数据本身出现了错乱才会报错. 在流式加密的场景里, 可以换成其他的压缩方式, 例如 tar ... | pv | zstd -19 -T0 | gpg ...

如果磁盘空间不能同时容纳 tar chunks 和提取出来的东西, 但是足够容纳部分 tar chunks 和全部提取出来的东西, 可以考虑FIFO:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建命名管道(named pipe)
mkfifo $(mktemp -u | tee /dev/tty)

# 会返回类似 /tmp/tmp.iblsCdwJJo 的输出

file /tmp/tmp.iblsCdwJJo
# /tmp/tmp.iblsCdwJJo: fifo (named pipe)

# 先开启读端
cat /tmp/tmp.iblsCdwJJo | gpg --decrypt --batch --pinentry-mode loopback --passphrase-fd $passfd | pv | tar -xvf -

# 再开启写端
exec {chunkfd}>/tmp/tmp.iblsCdwJJo
cat chunk_000 >&3
cat chunk_001 >&3
cat chunk_002 >&3
...
# 关闭写端口
exec $chunkfd>&-

注意不能直接 cat chunk_000 > pipe 因为cat结束之后会关闭STDOUT, 进而导致读端收到EOF.

手动cat chunk这个过程可以使用一个简单的python脚本来半自动化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os
import time

print("Opening pipe...")
pout = open("/tmp/tmp.iblsCdwJJo", "wb")

for i in range(0, 115): # 这里需要提前知道一共有多少个chunk
while True:
fname = "chunk_{:03d}".format(i)
if os.path.exists(fname.format(i)):
print("chunk {} exists".format(i))
time.sleep(3)
print("reading chunk {}...".format(i))
with open(fname, "rb") as f:
content = f.read()
print("{} bytes read".format(len(content)))
pout.write(content)
print("chunk {} written".format(i))
break
else:
print("chunk {} not exists, wait...".format(fname))
time.sleep(5)

# 记得关闭FIFO
pout.close()

参考资料

split(1) — Linux manual page

GnuPG - ArchWiki

GPG(1) manpage

【少帅进行曲】折风渡夜(DJ名龙版) - 泽国同学“斑驳的岁月 从不肯忘却”2024抖音热门音乐

DJ楓楓《特別的愛給特別的你》DJ版 #农人dj枫枫 #柳州dj楓楓 #djfengfeng

lucky小阳 - 游京 (抖音热播DJ版) Du Kinh (Remix) - Tiểu Dương『我走在长街中,听戏子唱京城,人杂乱戏小丑,叶黄退入长秋』【抖音火流行歌曲推荐TikTok】

Lazer Boomerang - Time To Pretend (Official Audio) | 【哈基米音乐】Time to Pretend

VØJ, Narvent - Memory Reboot (4K Music Video) | 【哈基米音乐】Memory Reboot

MONTAGEM MIAU | 【完整版】哈基米:Montagem Miau🐱

任素汐-胡广生 (抖音DJ铁柱版 2024) | 胡广生 (DJ阿樂版)

“Hey!My girl 我请你再靠近我一点点~”|《一点点dj》1.03x 网红烂歌,但是前奏还不错

往期优秀作品推荐

2025年8月