Я обслуживаю двоичный файл 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. Но я предполагаю, что это для некоторого типа внутреннего использования (в этом случае безопасность по-прежнему важна)!