curl 无法写入用户拥有的 /tmp 目录

curl 无法写入用户拥有的 /tmp 目录

我尝试按照中的说明运行脚本https://docs.docker.com/engine/security/rootless/:

$ curl -fsSL https://get.docker.com/rootless | sh

但脚本在以下行中崩溃了:

curl -L -o docker.tgz "$STATIC_RELEASE_URL"

随着消息:

Warning: Failed to create the file docker.tgz: Permission denied
curl: (23) Failure writing output to destination

我将问题范围缩小到curl尝试写入tmp由 创建的文件夹mktemp -d,但我不明白为什么它失败。

一些背景:

$ whoami
thiago

$ uname -a
Linux thiago-acer 5.8.0-55-generic #62~20.04.1-Ubuntu SMP Wed Jun 2 08:55:04 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

$ mktemp -d
/tmp/tmp.U1nPTN5dlS

$ cd /tmp/tmp.U1nPTN5dlS

$ ls -la
total 8
drwx------  2 thiago thiago 4096 Jun 17 18:20 .
drwxrwxrwt 25 root   root   4096 Jun 17 18:20 ..

运行上面的命令后,我尝试了:

# this fails with the same message as above
curl https://download.docker.com/linux/static/stable/x86_64/docker-20.10.7.tgz -O

# this works just fine
curl https://download.docker.com/linux/static/stable/x86_64/docker-20.10.7.tgz -o - > docker-20.10.7.tgz

# this also works
wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.7.tgz

curl -O如果我在其他文件夹(例如我的主文件夹)上尝试该命令,该命令也可以工作。

任何帮助表示赞赏。

答案1

我不知道这会帮助多少人,但分享以防万一它可以帮助别人。对我来说,我有Failure writing output to destination错误,但不是Permission denied错误。

这是因为我的/tmp目录已满

$ df -h /tmp
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           7.8G  7.8G     0 100% /tmp

清理我的/tmp目录解决了我的问题。

答案2

如果由于某种原因,可执行文件在其权限中具有 setuid 位并且由或curl以外的用户拥有,则可以解释该行为。rootthiago

如:

$ ls -ld /usr/bin/curl
-rwsr-xr-x 1 nobody nogroup 260328 Mar 14 16:37 /usr/bin/curl*

curl -o file会失败,因为由谁file没有对该目录的写访问权限,而会工作,因为文件是由 shell 打开的,运行为,而不是。open()ednobodycurl -o - > filethiagocurl

另一种可能的解释可能是某些apparmor/SELinux 或其他 MAC 安全系统拒绝curl/tmp.

在这种情况下,系统或审核日志应该包含更多信息。

相关内容