
У меня есть файл bash, который я сохранил удаленно, и приведенные ниже шаги работают.
curl -fsSL -o check.sh https://github.com/uday1kiran/python_deb_create/raw/testbash/tmp/check.sh
chmod 700 check.sh
sudo ./check.sh
Но если я изменю это на однострочную команду, она не будет работать/не будет показывать никаких результатов.
curl https://github.com/uday1kiran/python_deb_create/raw/testbash/tmp/check.sh | bash
Фактический код:
#!/usr/bin/env bash
count_apt=`whereis apt`
count_yum=`whereis yum`
## echo ${#count_apt} ${#count_yum}
if (( ${#count_yum} > 4 )); then
echo "---Redhat distributions are not supported---"
exit 0
fi
if (( ${#count_apt} > 4 )); then
echo "---Found Ubuntu Distribution---"
echo "---Started installation of dependencies---"
apt install -y curl
wget https://xenowulf-deb.s3.us-west-2.amazonaws.com/agentxw_1.036-1_amd64.deb
apt install -y ./agentxw_1.036-1_amd64.deb
wget https://xenowulf-deb.s3.us-west-2.amazonaws.com/xvision_0.97-1_amd64.deb
apt install -y ./xvision_0.97-1_amd64.deb
echo "---Completed installation of dependencies---"
echo "---Started installation of main package with its dependencies: xenowulf-ai---"
wget https://github.com/uday1kiran/python_deb_create/raw/testdeb2/tmp/xenowulf-ai_1.0_all.deb
apt install -y ./xenowulf-ai_1.0_all.deb
echo "---Completed installation of main pacakge: xenowulf-ai---"
fi
Пожалуйста, предложите.
решение1
Ваша первая команда, которая работает, использует -L
опцию curl, которая (из man curl
):
-L, --location
(HTTP) If the server reports that the requested page has moved
to a different location (indicated with a Location: header and
a 3XX response code), this option will make curl redo the re‐
quest on the new place. [. . .]
Похоже, ваш URL работает через такое перенаправление, поскольку без этой -L
опции вы ничего не получите:
$ url="https://github.com/uday1kiran/python_deb_create/raw/testbash/tmp/check.sh"
$ curl "$url" 2>/dev/null | wc
0 0 0
Но с ним вы получите вывод:
$ curl -L "$url" 2>/dev/null
#!/usr/bin/env bash
count_apt=`whereis apt`
count_yum=`whereis yum`
## echo ${#count_apt} ${#count_yum}
if (( ${#count_yum} > 4 )); then
echo "---Redhat distributions are not supported---"
exit 0
fi
if (( ${#count_apt} > 4 )); then
echo "---Found Debian Distribution---"
echo "---Started installation of dependencies---"
apt install -y curl
wget https://xenowulf-deb.s3.us-west-2.amazonaws.com/agentxw_1.036-1_amd64.deb
apt install -y ./agentxw_1.036-1_amd64.deb
wget https://xenowulf-deb.s3.us-west-2.amazonaws.com/xvision_0.97-1_amd64.deb
apt install -y ./xvision_0.97-1_amd64.deb
echo "---Completed installation of dependencies---"
echo "---Started installation of main package with its dependencies: xenowulf-ai---"
wget https://github.com/uday1kiran/python_deb_create/raw/testdeb2/tmp/xenowulf-ai_1.0_all.deb
apt install -y ./xenowulf-ai_1.0_all.deb
echo "---Completed installation of main pacakge: xenowulf-ai---"
fi
Поэтому все, что вам нужно сделать, это использовать опцию -L
, а затем передать ее sudo bash
(так как вам нужно запустить ее как root):
curl -L "$url" | sudo bash
Конечно, это очень рискованно, и запускать такие вещи следует только в том случае, если вы на 100% уверены, что скрипт безопасен. Кроме того, кажется странным, что вы проверяете наличие curl
в скрипте, если используете curl
для его загрузки. Вы уже знаете, curl
что доступен. В любом случае, хотя вы и проверяете наличие curl
, ваш скрипт на самом деле использует wget
вместо него. Есть и другие различные улучшения, которые вы можете сделать (обратные кавычки устарели, используйте var=$(command)
вместо var=`command`
; есть лучшие способы проверки дистрибутива, поскольку yum можно установить на дистрибутивах, не основанных на RedHat, и apt
на дистрибутивах, не основанных на Debian), но они здесь не по теме.