Выполнение Bash не работает с одной строкой, как это исправить?

Выполнение Bash не работает с одной строкой, как это исправить?

У меня есть файл 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), но они здесь не по теме.

Связанный контент