如何通过 nginx 提供具有可执行权限的二进制文件?

如何通过 nginx 提供具有可执行权限的二进制文件?

我正在提供位于以下位置的 Go 二进制文件/var/www/bin/binary

location ~ (binary) {
     root /var/www/bin;
}

但是,当我使用 下载它时wget http://example.com/binary,我无法立即运行它,因为它不再是可执行文件。我需要chmod +x binary先运行。

我该如何修复这个问题?谢谢。

编辑:发现了一个类似的问题,并且讨论得更广泛: https://unix.stackexchange.com/questions/82578/why-is-that-when-i-download-a-binary-from-the-web-it-doesnt-have-executable-per

答案1

在 HTTP 文件传输过程中,不会传达文件权限。它nginx所做的只是打开二进制文件、读取数据并将其传输到客户端 ( )。在客户端计算机上设置权限由客户端上的 以及您的 Web 客户端浏览器可能对其执行的其他任何操作wget决定。umask

如果您希望简化下载和执行二进制文件的步骤,可以采取以下几种方法。其中一种方法很简单:

wget -O binary http://example.com/binary && chmod +x ./binary && ./binary

或者,你可以将 shell 脚本放置在http://example.com/install.sh

#!/bin/sh

if wget -O "binary" "http://example.com/binary"; then
    chmod +x "./binary"
    echo "Successfully installed binary. To run, use: ./binary"

    # Or just run it here:
    # ./binary
else
    echo "Failed to download binary." >&2
fi

然后,您的安装可以:

wget -O - http://example.com/install.sh | sh

或者:

curl -o - http://example.com/install.sh | sh

请注意,这些安装方法都不安全。您需要计算二进制文件(和 shell 脚本)的签名并在下载时验证它们,我建议使用 HTTPS。但是,我假设这是用于某种类型的内部使用(在这种情况下,安全性通常仍然很重要)!

相关内容