关于就地验证提交给客户的代码是否修改的方法可行性及过滤命令正确性的咨询
就地验证提交给客户的代码是否修改的方法可行性及过滤命令正确性咨询
嘿,这个思路挺务实的,咱们来拆解下你的方案可行性和过滤逻辑是否正确:
先说说你的命令是否可行
你的核心逻辑是通过find ... -ls输出的文件元数据(大小、修改时间等)生成字符串,再用md5sum校验。这个方法有一定效果,但存在明显的局限性:
- 能检测到的变化:如果文件的大小、修改时间、文件名、权限这些元数据变化,或者文件内容变化导致大小/时间改变,那么
-ls的输出会变,最终的md5值也会不同,这时候能检测到修改。 - 无法检测的漏洞:如果有人修改了文件内容,但刻意把文件大小改回原样,并且手动修改了修改时间(比如用
touch命令对齐原时间),那么-ls的输出不会变,你的md5校验就会漏掉这个修改。反过来,如果文件内容没变,但inode号变了(比如删除后重建同名文件),你的方法会误判为文件被修改。 - 跨系统风险:不同系统的
find -ls输出格式可能有细微差别(比如GNU find和BSD find的字段顺序、空格数量),如果你和客户用的不是同一种系统工具链,可能会出现同一组文件生成不同md5的情况。
再看你的过滤规则是否正确
你的find命令过滤逻辑是没问题的:
find . -type d \( -path ./data -o -path ./dbms-data -o -path ./log \) -prune -o -type f ! -name "*.json" ! -name "*.txt" -ls | md5sum
- 用
-prune跳过./data、./dbms-data、./log三个目录及其子内容,这个写法是正确的,不会遍历这些目录里的文件。 - 只选择普通文件(
-type f),并排除.json和.txt后缀的文件,这个逻辑完全符合你的需求。如果需要大小写不敏感的匹配(比如排除.JSON或.TXT),可以把! -name换成! -iname。
更可靠的改进方案
既然你的核心需求是验证文件内容是否被修改,不如直接基于文件内容计算哈希,再整体校验。推荐这个改进版命令:
find . -type d \( -path ./data -o -path ./dbms-data -o -path ./log \) -prune -o -type f ! -name "*.json" ! -name "*.txt" -exec md5sum {} + | sort | md5sum
这个方案的优势:
- 直接基于文件内容生成哈希,不管元数据怎么篡改,只要内容变了,哈希就会变,彻底避免漏判或误判。
- 加入
sort命令,确保文件遍历顺序不影响最终的md5值(find的输出顺序可能因系统或目录结构变化而不同),保证你和客户生成的校验值一致。 - 如果担心相对路径的问题(比如你在
./project下运行,客户在./myapp下运行),可以调整md5sum的输出,只保留哈希和文件名(去掉前缀路径),比如用-exec sh -c 'md5sum "$1" | sed "s|$(pwd)/||"' _ {} +来处理路径,确保两边路径表示一致。
备注:内容来源于stack exchange,提问作者chi11ax
相关产品推荐
相关产品推荐

