嵌入式机器上的gunzip

嵌入式机器上的gunzip

我在嵌入式 Linux 机器(内核 v3.10.31)上使用 BusyBox 1.24.1,解压缩文件时出现我无法理解的行为。该gunzip命令(经常但并非总是)失败,没有输出(甚至没有错误消息),即使给出了“已知良好”的.gz文件(即我刚刚gzip在同一系统上使用命令创建的文件)。很难找到一个真正可以解压的文件。有人得到“尤里卡!”吗?当看这个的时候?

文本文件中的某些内容似乎导致gunzip命令失败,但我不知道是什么。见下文:

# ls -l
-rw-------    1 root     root            65 Sep 13 10:02 cantunzip
-rw-------    1 root     root            64 Sep 13 10:01 canunzip
more cantunzip 
fsdgafjklsdfasdsdjfhjafasdohfkl asdfas a fsd a

2132313 12 51515
# more canunzip 
fsdgafjklsdfasdsdjfhjafasdohfkl asdfas a fsd a
2132313 12 51515
# hexdump cantunzip 
0000000 7366 6764 6661 6b6a 736c 6664 7361 7364
0000010 6a64 6866 616a 6166 6473 686f 6b66 206c
0000020 7361 6664 7361 6120 6620 6473 6120 0a0a
0000030 3132 3233 3133 2033 3231 3520 3531 3531
0000040 000a                                   
0000041
# hexdump canunzip 
0000000 7366 6764 6661 6b6a 736c 6664 7361 7364
0000010 6a64 6866 616a 6166 6473 686f 6b66 206c
0000020 7361 6664 7361 6120 6620 6473 6120 320a
0000030 3331 3332 3331 3120 2032 3135 3135 0a35
0000040
# gzip canunzip 
# gzip cantunzip 
# ls -l
-rw-------    1 root     root            77 Sep 13 10:04 cantunzip.gz
-rw-------    1 root     root            77 Sep 13 10:03 canunzip.gz
# gunzip canunzip.gz 
# echo $?
0
# gunzip cantunzip.gz
# echo $?
1
# ls -l
-rw-------    1 root     root            77 Sep 13 10:04 cantunzip.gz
-rw-------    1 root     root            64 Sep 13 10:04 canunzip

答案1

您可以检查gunzip命令解压失败的错误代码。

echo $?

这可以为您提供失败的线索。

获取两个文件的十六进制转储并比较它们也可能有所帮助。

答案2

就其价值而言,忙碌盒子新闻页面列出了 1.24.0 和 1.32.0 之间除 1.28.0 之外的每个小版本中 gzip 小程序的更新,因此我对无法使用 busybox 1.35.0 在 Debian 系统上重现此内容并不感到惊讶。当前稳定版本是 1.34.1。您最好的选择是升级。

如果升级不是一个选项,这个 shell 包装函数至少应该让该命令具有一定的理智性:

gzip() {
  local target
  for target in "$@"; do true; done
  cp -p "$target" "$target.temp" || return $?
  busybox gzip "[email protected]"

  gunzip < "$target.temp.gz" > "$target.temp"
  if [ $? = 0 ] && diff -q "$target" "$target.temp" >/dev/null 2>&1; then
    rm -f "$target" "$target.temp"
    mv "$target.temp.gz" "$target.gz"
    return 0
  fi
  echo "gzip: failure" >&2
  rm -f "$target.temp.gz" "$target.temp"
  return 1
}

将其放入文件中(如~/.bashrc)并获取它(如source ~/.bashrc),然后您应该能够正常使用 gzip。该函数假设您的最后一个参数是要压缩的目标文件,循环遍历您的命令参数仅将最后一个参数保存为$target.因为您的 BusyBox 版本早于 1.27.0(当它添加gzip -k支持时),我们首先复制该文件,然后gzip使用副本上的所有参数运行 busybox 的小程序。剩下的就是审查和内务管理。

为了验证该文件,我们只需使用管道对其进行解压缩以保留 .gz 版本,然后确保成功($?是上一个命令的退出代码,在运行时为零)并且它与原始目标没有不同文件。在这种情况下,由于 .gz 已验证,因此删除测试文件和原始文件,然后返回成功值0。否则,在标准错误上宣布失败并删除测试文件和有问题的 .gz 文件(如果存在)并返回错误值1

您也可以将其设为脚本。只需删除前两行和最后一行并添加一个新的第一行#!/bin/sh,然后使文件可执行并将其放在您$PATHgzip.

相关内容