Выполнение оператора if в сценарии оболочки в виде одной строки с параметром docker - c - PullRequest
0 голосов
/ 10 апреля 2020

Мне нужно запустить следующий код в виде одной строки в docker Выполнить -it image_name - c \ bin \ bash - скрипт с --script ниже (dir и dockerImageName являются параметрами)

'''cd ''' + dir+ ''' \
&& if make image ''' + dockerImageName''' 2>&1 | grep -m 1 "No rule to make target"; then
exit 1
fi'''

Как это можно запустить одной строкой?

1 Ответ

1 голос
/ 10 апреля 2020

Вы можете абстрагировать все эти логи c в ваше приложение более высокого уровня. Если вы не можете этого сделать, напишите стандартный сценарий оболочки и COPY в свой образ.

Тройные кавычки выглядят как синтаксис Python. Вы можете разбить это на три части:

  1. Часть cd $dir определяет рабочий каталог для подпроцесса;
  2. make ... - фактическая команда для запуска;
  3. Вы проверяете его вывод на наличие каких-либо условий.

В Python вы можете вызвать subprocess.run() с массивом аргументов и указать эти различные вещи в уровень приложения. Массив аргументов не интерпретируется оболочкой и защищает вас от этой конкретной проблемы безопасности. Вы можете запустить:

completed = subprocess.run(['make', 'image', dockerImageName],
                           cwd=dir,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.STDOUT)
if 'No rule to make target' in completed.stdout:
  ...

Если вам нужно сделать это как скрипт оболочки, сделайте это как правильный скрипт оболочки и убедитесь, что вы снова цитируете свои аргументы, защищает вас.

#!/bin/sh
set -e
cd "$1"
if make image "$2" 2>&1 | grep -m 1 "No rule to make target"; then
  exit 1
fi

Вы никогда не должны создавать командную строку, комбинируя строки так, как вы показали. Это делает вас уязвимым для атаки с помощью инъекции оболочки . Особенно, если злоумышленник знает, что у пользователя есть права на запуск команд docker, он может установить

dir = '.; docker run --rm -v /:/host busybox cat /host/etc/shadow'

и получить файл с зашифрованными паролями, которые они могут взломать на досуге. Практически все остальное возможно, если злоумышленник использует эту технику, чтобы получить неограниченный root -уровневый доступ для чтения / записи к файловой системе хоста.

...