LINUX.ORG.RU

Shell, пути с символами пробела.


0

0

Здравствуй, All.

Возник вопрос такой, делаю:

BINARY="/home/asm/space space space/binary/dosemu"
OPTS="$FIRST $SECOND"
COMMAND="$SUDO $BINARY $OPTS"

$COMMAND "$INSTALL" "-I $STRING_I" "$@"

Получаю типо:
./dosemu: line 221: /home/asm/space: Нет такого файла или каталога

Вопрос: как с этим бороться?

★★

COMMAND="$SUDO \"$BINARY\" $OPTS"

Slavaz ★★★★★
()
Ответ на: комментарий от sdio

Ну да, получаю:

./dosemu: line 221: "/home/asm/space: Нет такого файла или каталога
вместо
./dosemu: line 221: /home/asm/space: Нет такого файла или каталога

Было бы всё так просто, не спрашивал бы...

ASM ★★
() автор топика
Ответ на: комментарий от sdio

Нашел ответ:

COMMAND="$SUDO \"$BINARY\" \"$OPTS\""

eval $COMMAND
а не просто
$COMMAND

Всем спасибо, все свободны.

ASM ★★
() автор топика
Ответ на: комментарий от sin_a

Как выяснилось позже, к сожалению, dosemu не может сожрать что то типо: --Flibdir "space space" (и аналогично 'space space', 'space\ space')

Так что хоть проблема и решена, но нужно(если нужно конечно) копать глубже в DOSEMU.

Кстать проблема возникла отсюда:
вот кусок кода для запуска dosemu.bin (поставляется с dosemu):

eval "set -- $SUFFIX"
COMMAND="$SUDO $BINARY $IGNORE_DOSEMU_CONF"
DOSEMU_INVOKED_NAME="$0"
export DOSEMU_INVOKED_NAME
if [ -n "$INSTALL" ] ; then
  if [ -n "$STRING_I" ] ; then
    $COMMAND "$INSTALL" "-I $STRING_I" "$@"
  else
    $COMMAND "$INSTALL" "$@"
  fi
elif [ -n "$STRING_I" ] ; then
  $COMMAND "-I $STRING_I" "$@"
else
  $COMMAND "$@"
fi

ASM ★★
() автор топика
Ответ на: комментарий от mqspi

> Ужасный ответ, возможны shell-инъекции.

Возможны, конечно, но мало вероятно что кто-то будет работать в каталоге /home/`rm -Rf ~`/.

> Правильный ответ - использовать функции.

Не совсем себе представляю, как мне решить свою задачу с помощью них.

ASM ★★
() автор топика
Ответ на: комментарий от ASM

> Возможны, конечно, но мало вероятно что кто-то будет работать в каталоге /home/`rm -Rf ~`/.

Не обязательно деструктивная инъекция, элементарное ' в имени файла вызовет syntax error. То, что это маловероятно - не оправдание.

> Не совсем себе представляю, как мне решить свою задачу с помощью них.


Очень просто:
BINARY="/home/asm/space space space/binary/dosemu"
OPTS="$FIRST $SECOND"
run_binary() {
$SUDO "$BINARY" $OPTS $@
}

run_binary "$INSTALL" "-I $STRING_I" "$@"

mqspi
()

В баше можно командные строки обрабатывать массивами:
BINARY="/home/asm/space space space/binary/dosemu"
OPTS=( "$FIRST" "$SECOND" )
COMMAND=( "$SUDO" "$BINARY" "${OPTS[@]}" )
"${COMMAND[@]}" "$INSTALL" "-I" "$STRING_I" "$@"
Не очень удобно, непереносимо на другие шеллы и многими лоровцами, но зато никаких инъекций :)

const86 ★★★★★
()

Похожая проблема

Есть похожая проблема, бью с ней насмерть уже третий день.


Есть скрипт, который принимает ряд параметров.
Одним из параметров является набор опций.


while getopts "u:p:t::n:c:o:s:m:e:a:r:" opt
do
case $opt in
....
....
o ) options=$OPTARG
....
....


после чего выполняется команда


args="$someArgs $options $alsoSomeArgs"
$commandName $args


Опций при этом передаётся не мало, но недавно возникла проблема, что некоторые опции могут содержать пробел:
( C++ код )
cstr<<"-o \"option1 value1\" \"option2 \\\"value with space\\\"\"";


Если кто-то поможет - буду сильно благодарен
зы. shell - ksh

darkrip
()
Ответ на: комментарий от mqspi

шелл-инъекции - это когда строчка, которая должна пойти на eval, злоумышленно подправляется, чтобы получить в результате выполнения какой-нибудь непредусмотренный эффект? На сколько такая опасность реальна?

А то мучаюсь с подобной проблемой второй день. С помощью функции, с помощью массивов никак не выходит - дело в не фиксированном количестве параметров. Ну плюс в моих слабых скиллах скриптописателя, конечно. Но этот способ с evalом - единственный, который сработал.

Каковы возможные последствия?

indi
()
Ответ на: комментарий от dilmah

>не нужен тут eval

Обоснуйте.

Как из строки-единого блока сделать исполняемую строку с параметрами, сохранив внутренние двойные кавычки?

indi
()
Ответ на: комментарий от indi

да, это я влопрос не прочел.. Так выпьем же за то, чтобы такие вопросы перед нами не стояли.

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.