Учитывая правильно -сформированный XML-документ, подобный следующему (, измененному из вашего примера):
вы можете использовать xmlstarlet
для изменения всех атрибутов level
, для которых установлено значение DEBUG
, на TRACE
для каждого узла logger
, чей дочерний узел appender-ref
имеет атрибут ref
, равный logstash
, вот так:
$ xmlstarlet ed -u '//logger[appender-ref/@ref = "logstash"]/@level[. = "DEBUG"]' -v 'TRACE' file.xml
XPath-запрос, аналогичный что использует choroba , также будет работать:
xmlstarlet ed -u '//logger[@level = "DEBUG"][appender-ref/@ref = "logstash"]/@level' -v 'TRACE' file.xml
Strace использует системный вызов ptrace для трассировки процессов.
Из соображений безопасности привилегированная программа, такая как pkexec, использующая механизм setuid , не может использовать эти привилегии, если отслеживающий ее процесс не является корневым (или, в Linux, не имеет SYS_PTRACE
или SYS_ADMIN
возможность .)
Когда вы запустите strace script.bash
, strace успешно отследит оболочку, которая запускает скрипт -, который не имеет дополнительных привилегий -, и не будет отслеживать программы, запускаемые этим скриптом. Поэтому, когда скрипт запускается pkexec
, pkexec запускается со всеми привилегиями.
Но strace -f script.bash
будет отслеживать оболочку, которая запускает сценарий , и каждую программу, запускаемую сценарием . Когда скрипт запустится pkexec
, у pkexec не будет привилегий setuid, он выдаст сообщение об ошибке и завершит работу.
Один из способов отследить pkexec и все, что он запускает, — запустить strace от имени пользователя root.
Но вы не хотите запускать sudo strace -f script.bash
, потому что это запустит скрипт (и pkexec )от имени пользователя root.
Вместо этого подключите strace к сценарию после того, как вы запустите сценарий как обычный пользователь. Измените скрипт следующим образом:
#!/bin/bash
echo please run sudo strace -f -p $$ while this script is doing its read
read -n 1 -r -s reply
if [[ $reply == [Yy] ]]; then
pkexec "$NAME_INST" "$@"
fi