Косвенное присвоение переменных в bash
Кажется, что рекомендуемый способ установки косвенных переменных в bash - это использоватьeval
:
var=x; val=foo
eval $var=$val
echo $x # --> foo
Проблема обычная сeval
:
var=x; val=1(и поскольку это рекомендуется во многих местах, мне интересно, сколько сценариев уязвимо из-за этого ...)
В любом случае очевидное решение использования (экранированных) кавычек на самом деле не работает:
var=x; val=1\"Дело в том, что bash имеет косвенную ссылку на переменную, запеченную в${!foo}
), но я не вижу такого способа сделать косвенное назначение - есть ли какой-нибудь вменяемый способ сделать это?
Для протокола, я нашел решение, но это не то, что я бы посчитал "вменяемым" ...:
eval "$var='"${val//\'/\'\"\'\"\'}"'"
\n'pwd
eval $var=$val # bad output here
(и поскольку это рекомендуется во многих местах, мне интересно, сколько сценариев уязвимо из-за этого ...)
В любом случае очевидное решение использования (экранированных) кавычек на самом деле не работает:
var=x; val=1\"$'\n'pwd\"
eval $var=\"$val\" # fail with the above
Дело в том, что bash имеет косвенную ссылку на переменную, запеченную в${!foo}
), но я не вижу такого способа сделать косвенное назначение - есть ли какой-нибудь вменяемый способ сделать это?
Для протокола, я нашел решение, но это не то, что я бы посчитал "вменяемым" ...:
eval "$var='"${val//\'/\'\"\'\"\'}"'"
\n'pwd\"
eval $var=\"$val\" # fail with the above
Дело в том, что bash имеет косвенную ссылку на переменную, запеченную в${!foo}
), но я не вижу такого способа сделать косвенное назначение - есть ли какой-нибудь вменяемый способ сделать это?
Для протокола, я нашел решение, но это не то, что я бы посчитал "вменяемым" ...:
eval "$var='"${val//\'/\'\"\'\"\'}"'"
\n'pwd
eval $var=$val # bad output here
(и поскольку это рекомендуется во многих местах, мне интересно, сколько сценариев уязвимо из-за этого ...)
В любом случае очевидное решение использования (экранированных) кавычек на самом деле не работает:
var=x; val=1\"$'\n'pwd\"
eval $var=\"$val\" # fail with the above
Дело в том, что bash имеет косвенную ссылку на переменную, запеченную в${!foo}
), но я не вижу такого способа сделать косвенное назначение - есть ли какой-нибудь вменяемый способ сделать это?
Для протокола, я нашел решение, но это не то, что я бы посчитал "вменяемым" ...:
eval "$var='"${val//\'/\'\"\'\"\'}"'"