В чем разница между `curl | sh` и `sh -c« $ (curl) »`?

Ваша политика по умолчанию для таблицы фильтров должна быть DROP, а не ACCEPT, иначе вы пересылаете все пакеты по умолчанию.

iptables -P FORWARD DROP
25
23.01.2017, 03:58
4 ответа

Есть практическая разница.

curl -sSL https://get.docker.com/ | sh запускает curl и sh одновременно, соединяя выход curl с входом sh . curl выполнит загрузку (примерно) так же быстро, как sh сможет запустить скрипт. Сервер может обнаруживать нарушения в синхронизации и вводить вредоносный код, невидимый при простой загрузке ресурса в файл или буфер или при просмотре его в браузере.

В sh -c "$ (curl -sSL https://get.docker.com/)", curl запускается строго перед sh ] запускается. Все содержимое ресурса загружается и передается в вашу оболочку до запуска sh . Ваша оболочка запускает sh только после завершения работы curl и передает ей текст ресурса. Сервер не может обнаружить вызов sh ; он запускается только после завершения соединения. Это похоже на загрузку сценария в файл.

(Это может не иметь отношения к случаю докера, но может быть проблемой в целом и подчеркивает практическую разницу между двумя командами.)

50
27.01.2020, 19:40

Я считаю, что они практически идентичны. Однако бывают редкие случаи, когда они разные.

$ (cmd) заменяется результатами cmd . Если длина этой результирующей команды превышает максимальное значение длины аргумента, возвращаемое getconf ARG_MAX , она усекает результат, что может привести к непредсказуемым результатам.

У варианта трубы нет этого ограничения. Каждая строка вывода команды curl будет выполняться bash по мере поступления из конвейера.

Но ARG_MAX обычно находится в диапазоне 256 000 символов. Для установки докера я был бы уверен, что использовал бы любой метод. : -)

13
27.01.2020, 19:40

In curl -sSL https://get.docker. com/ | sh:

  • Обе команды, curl и sh, будут запущены одновременно, в соответствующих подоболочках

  • STDOUT от curl будет передан как STDIN в sh (именно это делает pipe, |)

Тогда как в sh -c "$(curl -sSL https: //get. docker. com/)":

  • Подстановка команды, $(), будет выполнена первой, то есть. curl будет запущен первым в подшивке

  • Подстановка команды, $(), будет заменена STDOUT от curl

  • sh -c (неинтерактивный, shell без логина) выполнит STDOUT из curl

9
27.01.2020, 19:40

Одно из различий между двумя (, взятыми из других ответов в Интернете ), заключается в том, что если вы не загрузите весь сценарий сразу, он может прерваться на половине пути сценария в неизвестном месте и измениться. смысл выполняемой команды. Таким образом, кажется, что лучше сначала загрузить весь файл, а затем оценить его.

1
27.01.2020, 19:40

Теги

Похожие вопросы