Передача исполняемой команды с использованием переменной окружения USER

Если эти файлы находятся в одной папке, вы можете просто загрузить их следующим образом:

put /path/to/files/*

-1
10.09.2019, 03:48
1 ответ

Вы можете передать шелл-код в переменной окружения в скрипт, нет проблем, но скрипт должен ожидать шелл-код в переменной и оценивать его как таковой:

См., например,. разница между

$ env USER='$(echo hello)' bash -c 'echo "$USER"'
$(echo hello)

и

$ env USER='$(echo hello)' bash -c 'eval "echo \"$USER\""'
hello

В обеих вышеуказанных командах часть кода передается в $USERсценарию bash -c. Код представляет собой простую подстановку команд, которая при оценке выводит строку hello, а вызывающая оболочка будет , а не оценивать подстановку команд, поскольку это строка в одинарных кавычках. Первый скрипт bash -cне оценивает строку, поэтому печатает шелл-код. Второй скрипт bash -cоценивает переданную строку как часть вызова echoи, следовательно, печатает echo(, он в основном выполняет echo "$(echo hello)".

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

Я думаю, что вы хотите передать строку , а не шелл-код:

$ env USER="$(echo hello)" bash -c 'echo "$USER"'
hello

Здесь переменная USERустанавливается в строку helloперед вызовом сценария bash -c(, поскольку оболочка расширит подстановку команд в двойных кавычках ). Затем скрипт берет строку и повторяет ее. В вашем случае скрипт возьмет строку и будет использовать ее как часть имени пути.

Дело в том, что строка вычисляется пользователем до того, как скрипт получит ее.

0
28.01.2020, 05:11

Теги

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