AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 487338
Accepted
Golar Ramblar
Golar Ramblar
Asked: 2018-12-12 05:01:53 +0800 CST2018-12-12 05:01:53 +0800 CST 2018-12-12 05:01:53 +0800 CST

为什么从标准输入读取 ZIP 存档时,libarchive 的 bsdtar 的解压缩会丢弃权限位,而不是直接?

  • 772

我遇到bsdtar包中的命令libarchive(至少在 Arch Linux 下).zip在读取时确实会丢弃 -archives中的可执行文件位stdin,但在直接处理文件时不会。

在.tar-archives 上,它在从标准输入读取时也会保留可执行位。

测试用例:

创建档案:

创建文件:

touch a.txt
chmod 644 a.txt
touch a.out
chmod 755 a.out

文件权限:

ls -ln a.out a.txt

节目

-rwxr-xr-x 1 1001 1001 0 Dec 12 11:01 a.out
-rw-r--r-- 1 1001 1001 0 Dec 12 11:01 a.txt

将文件打包成档案:

bsdtar --format=zip -cf a.zip a.out a.txt
bsdtar -cf a.tar a.out a.txt

zip(使用和tar而不是创建档案bsdtar会产生相同的结果。)

直接提取/显示存档内容:

bsdtar -tvf a.zip

或者

bsdtar -tvf - < a.zip

节目

-rwxr-xr-x  0 1001   1001        0 Dec 12 11:01 a.out
-rw-r--r--  0 1001   1001        0 Dec 12 11:01 a.txt

的可执行位在a.out此处。的权限a.out是 755 和a.txt644。

读自stdin:

cat a.zip | bsdtar -tvf -

节目

-rw-rw-r--  0 1001   1001        0 Dec 12 11:01 a.out
-rw-rw-r--  0 1001   1001        0 Dec 12 11:01 a.txt

for 的可执行位在a.out这里被丢弃。此外,这两个文件都是组可写的,它们不是这样打包的。a.out和的权限a.txt都是664。

.tar-档案:

作为比较,对于.tar-archive,从以下管道读取时也会尊重存档中的权限stdin:

bsdtar --numeric-owner -tvf a.tar

和

cat a.tar | bsdtar --numeric-owner -tvf -

都显示

-rwxr-xr-x  0 1001   1001        0 Dec 12 11:01 a.out
-rw-r--r--  0 1001   1001        0 Dec 12 11:01 a.txt

(注意,当显示 ZIP 存档的内容时,bsdtar默认显示数字所有者;对于 TAR 存档,它显示所有者的名称。)

问题是:

stdin有什么特别之处bsdtar?为什么只在从管道中读取时,而不是在时尚中bsdtar -tvf - < a.zip?为什么对-archive特别,对.zip-archive不特别.tar呢?

zip executable
  • 2 2 个回答
  • 1319 Views

2 个回答

  • Voted
  1. mosvy
    2018-12-12T07:15:00+08:002018-12-12T07:15:00+08:00

    [这还不是真正的答案,但我会照此发布,因为无法在评论中格式化任何内容]

    zip不是从不可搜索的文件中提取时产生问题的唯一格式。这是一个带有多会话 iso 图像的示例,但至少bsdtar打印了一条错误消息并且以非零状态退出。它应该对 zip 文件做同样的事情;恕我直言,默默地弄乱权限是不可接受的。

    $ echo a.out > a.out
    $ genisoimage -quiet -R -o a.iso a.out
    $ chmod 755 a.out
    $ growisofs -M a.iso -R -quiet a.out
    Executing 'genisoimage -C 16,176 -M /dev/fd/3 -R -quiet a.out | builtin_dd of=a.iso obs=32k seek=11'
    Rock Ridge signatures found
    builtin_dd: 176*2KB out @ average infx1352KBps
    a.iso: copying volume descriptor(s)
    
    $ cat a.iso | bsdtar xf -
    bsdtar: Ignoring out-of-order file @19 (a.out) 51200 < 411648
    bsdtar: Error exit delayed from previous errors.
    $ ls -l a.out; hd a.out
    -rwxr-xr-x 1 ahq ahq 6 Dec 11 19:15 a.out
    00000000  00 00 00 00 00 00                                 |......|
    00000006
    
    $ bsdtar xf a.iso
    $ ls -l a.out; hd a.out
    -rwxr-xr-x 1 ahq ahq 6 Dec 11 19:15 a.out
    00000000  61 2e 6f 75 74 0a                                 |a.out.|
    00000006
    
    • 0
  2. Best Answer
    Golar Ramblar
    2018-12-12T07:57:06+08:002018-12-12T07:57:06+08:00

    这里的错误跟踪libarchive器是答案:

    Zip 档案包含两种不同的方式来描述内容:

    1. 每个条目的标题
    2. zip 文件末尾的中央目录。

    如果可以对输入进行搜索,libarchive(以及扩展的 bsdtar)将使用中央目录,否则它将回退到仅流式处理逻辑。正如您在测试用例中发现的那样,这些条目不一定一致。对此,我们能做或想做的实在不多。请注意,您可以将 wget 替换为普通的 cat,它仍然会显示相同的行为。

    简短的版本是,这是 zip 文件流的固有问题,并且无法修复。

    • 0

相关问题

  • 仅压缩路径中的最后一个目录[重复]

  • 使用 unzip [关闭] 仅解压缩 zip 文件的特定层/级别

  • 如何部分提取压缩的巨大纯文本文件?

  • zip 命令不忽略由 -x 标志标记的项目

  • 更改可能缺少 shebang 的文件的默认可执行文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve