Esto no está realmente relacionado con las citas, sino con el procesamiento de argumentos.
Considere el ejemplo arriesgado:
find -exec sh -c "something {}" \;
Esto es analizado por el shell y dividido en seis palabras :find
, -exec
, sh
, -c
,something {}
(ya no hay comillas ), ;
. No hay nada que ampliar. El shell ejecuta find
con esas seis palabras como argumentos.
Cuando find
encuentra algo para procesar, digamos foo; rm -rf $HOME
, reemplaza {}
con foo; rm -rf $HOME
y ejecuta sh
con los argumentos sh
, -c
y something foo; rm -rf $HOME
.
sh
ahora ve -c
y, como resultado, analizasomething foo; rm -rf $HOME
(el primer argumento de opción no -)y ejecuta el resultado.
Ahora considere la variante más segura:
find -exec sh -c 'something "$@"' sh {} \;
El shell ejecuta find
con los argumentos find
, -exec
, sh
, -c
, something "$@"
, sh
, {}
, ;
.
Ahora, cuando find
encuentra foo; rm -rf $HOME
, reemplaza {}
nuevamente y ejecuta sh
con los argumentos sh
, -c
, something "$@"
, sh
, foo; rm -rf $HOME
.
sh
ve -c
y analiza something "$@"
como el comando a ejecutar, y sh
y foo; rm -rf $HOME
como los parámetros posicionales(a partir de $0
), expande "$@"
afoo; rm -rf $HOME
como un valor único , y ejecuta something
con el argumento único foo; rm -rf $HOME
.
Puede ver esto usando printf
. Cree un nuevo directorio, ingréselo,y corre
touch "hello; echo pwned"
Ejecutando la primera variante de la siguiente manera
find -exec sh -c "printf \"Argument: %s\n\" {}" \;
produce
Argument:.
Argument:./hello
pwned
mientras que la segunda variante, se ejecuta como
find -exec sh -c 'printf "Argument: %s\n" "$@"' sh {} \;
produce
Argument:.
Argument:./hello; echo pwned
Некоторые люди, очевидно, согласились бы с отключением selinux или установкой разрешающего режима в качестве ответа; но тогда всегда найдутся несколько язвительных гуру Linux, которые вмешаются со словами: «Прекратите отключать selinux!» НО ЭТО ВСЕ, ЧТО ОНИ СКАЖУТ! Перестаньте говорить людям «прекратить отключать selinux», ЕСЛИ ВЫ ТАКЖЕ НЕ СКАЗАЕТЕ ИМ РЕШЕНИЕ!
Что ж, я нашел решение этой проблемы, и поскольку мне не удалось найти его нигде в Интернете, я опубликую его здесь. Я следовал руководству Red Hat, которое можно найти здесь .
Могу поспорить, что большинство людей не знают об инструменте audit2allow . Это спасение жизни. Я использовал его, чтобы легко создать загружаемый модуль selinux, и он решил мою проблему, поэтому мне не пришлось отключать selinux. По сути, я только что прошел этапы подключения через SSH, запустив инструмент audit2allow , после чего он автоматически создал модуль. Затем я загрузил модуль, перезагрузился, и все в порядке.
audit2allow -a -M mycertwatch
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i mycertwatch.pp