Можем ли мы запустить bash скрипт из репо? - PullRequest
1 голос
/ 09 апреля 2020

Я на начальном уровне. Я не уверен, возможно ли это или нет. У меня есть сценарий bash в репозитории Bitbucket, который выполняет какую-то настройку. Чтобы запустить этот скрипт bash, я должен загрузить его локально и запустить файл. sh. Можно ли как-нибудь запустить скрипт через репозиторий Bitbucket без загрузки?

1 Ответ

3 голосов
/ 09 апреля 2020

Вам всегда нужно будет загружать файл (т.е. извлекать его с сервера), но вы можете создать линию для извлечения и выполнения в одном. Самым простым будет:

curl ${url} | bash

Вам нужно будет найти URL, который представляет необработанный файл (а не веб-страницу HTML). Для BitBucket это будет выглядеть примерно так: Вместо этого вы можете заменить ${commit_id} на имя ветви или тега.

https://bitbucket.org/${user}/${repo}/raw/${commit_id}/${file}

Однако остерегайтесь того, что это часто вызывает удивление с точки зрения безопасности, особенно при извлечении файла через HTTP (скорее чем HTTPS), так как вы в основном запускаете неизвестный код на вашем компьютере. Использование sudo в этом конвейере еще более актуально.

Пользователь должен быть готов доверять всему, что хранится в хранилище, поэтому убедитесь, что вы разрешаете только доверенным пользователям pu sh (или объединяете ), и убедитесь, что вы внимательно просматриваете изменения в рассматриваемом файле.


Вы также должны знать, что при запуске такого скрипта (в равной степени для bash ${file} или bash < ${file}) shebang не будет соблюдаться - он будет рассматриваться как комментарий и игнорируется.

Если, например, ваш скрипт начинается так, как показано ниже (-e для выхода из ошибки и -u для обработки неопределенных переменных как ошибки), тогда эти флаги не будут установлены.

#!/bin/bash -eu

# ... body of script ...

Когда " выполняет " файл напрямую (т.е.: chmod +x ./my_script.sh, ./my_script.sh) ядро обрабатывает shebang и вызывает /bin/bash -eu ... но при выполнении сценария с помощью одного из вышеперечисленных методов вызов bash находится в конвейере.

Вместо этого предпочтительно установить эти флаги в теле вашего скрипта, чтобы метод исполнения не имеет значения:

#!/bin/bash

set -eu

# ... body of script ...
...