Назад | Перейти на главную страницу

Как я могу передать двоичный файл с разрешением на исполнение через 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

Права доступа к файлам не сообщаются в процессе передачи файлов HTTP. Все nginx открывает двоичный файл, читает данные и передает их клиенту (wget). Настройка разрешений на клиентском компьютере определяется umask на клиенте, и все, что ваш браузер веб-клиента может с ним сделать.

Если вы хотите упростить шаги для загрузки и выполнения двоичного файла, есть несколько подходов, которые вы можете предпринять. Можно было бы просто:

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

Или вы можете разместить сценарий оболочки в 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

Обратите внимание, что ни один из этих методов установки не является безопасным. Вам необходимо рассчитать подписи для двоичного файла (и сценария оболочки) и проверить их во время загрузки, и я рекомендую использовать HTTPS. Но я предполагаю, что это для некоторого типа внутреннего использования (в этом случае безопасность по-прежнему важна)!