python - samba 将文件名算法(hash2)修改为 python 中的 unix 文件名
问题描述
我的任务很简单,我有一个文件列表,其中一些文件被 samba 破坏,我必须使用一些 python 脚本在 linux 环境中处理这些文件。我想构建一个将 samba hash2 损坏的形式转换为原始 unix 路径的函数。
读取服务器的 smb 配置后,使用 hash2 和 1 个字符前缀 + 魔术字符 '~' 生成损坏的文件。
在 samba 文档中:https : //www.samba.org/samba/docs/current/man-html/smb.conf.5.html 没有提到如何计算 hash2,我在其他地方找不到任何答案.
此外,是用于计算 hash2 的完整路径还是仅最后一个目录名称?例如:
Z:/aaa/bbb/ccc/T3XBGA~5/3 - Two Shell - LabBaby™.mp3 //mangled form
/aaa/bbb/ccc/Two Shell - SoulCity E.P./3 - Two Shell - LabBaby™.mp3 //original unix path
如您所见,由于该文件夹中只有一个文件使用了 unicode 字符,因此发生了重整,但是 unix 路径的哪一部分用于计算此哈希?以及如何进行反向转换?
提前致谢
编辑: 在阅读 samba 源代码时,我意识到我说 dir name 由于 unicode ™ 字符而被破坏是错误的,在这种情况下,它被破坏是因为目录名称有 2 个点并以 '.' 结尾
// mangle_hash2.c
if (dot_p) {
/* if the extension contains any illegal characters or
is too long or zero length then we treat it as part
of the prefix */
for (i=0; i<4 && dot_p[i+1]; i++) {
if (! FLAG_CHECK(dot_p[i+1], FLAG_ASCII)) {
dot_p = NULL;
break;
}
}
if (i == 0 || i == 4) {
dot_p = NULL;
}
解决方案
推荐阅读
- django - 视图 blogapp.views.blogpost 没有返回 HttpResponse 对象。它返回 None 而不是
- php - 在 Laravel 7 中匹配工厂值
- python - Pandas 设计了一个函数
- flutter - 颤动的底部导航栏不改变屏幕
- python - 使用带有多个方程和输入的curve_fit进行联合拟合-甚至可能吗?
- python - Tensorflow 2.3:如何并行读取大文件中的文本?
- javascript - 从 cypress 下载问题处理文件
- database - 在开源 GreenPlum 6.x 中更改 WAL 目录
- html - 使用纯 CSS 创建一行六边形
- spring - Spring environment.getActiveProfiles(); 始终为空