Как обойти функции bash, называемые `command`,` builtin` и `unset`?

Псевдонимы работают в AIX с Korn Shell.

Поместите несколько команд в конец вашего / etc / profile , например:

export PS1="`hostname`# "
alias ll="/usr/bin/ls -lF $*"
alias h="history 50"

Если вы хотите, чтобы эти переменные устанавливались внутри вашей среды, запустите:

. /etc/profile
6
10.11.2017, 07:41
1 ответ

can you still recover if all three functions are marked readonly?

Да, обычно можно, но это не значит, что нужно.

Точно так же, как вы можете отменить установку переменных только для чтения , подключив отладчик и вызвав unbind_variable, как показано в ответе anishsane на этот вопрос , вы также можете отменить установку функций только для чтения, передав их имена в unbind_funcс помощью отладчика.

Это неразумный подход, когда они не предназначены только для чтения (, если это действительно когда-либо ). В этой ситуации следует использовать решение cuonglm , в котором используется то, как unsetобрабатывается в режиме POSIX.Это решение можно использовать в реальной жизни.

Поскольку нет фактической гарантии, что ваша оболочка будет вести себя разумно после того, как вы обойдете readonlyс помощью отладчика, я предлагаю избегать ее всякий раз, когда есть более разумная альтернатива, такая как выход и перезапуск вашей оболочки или замена вашей оболочки на новую с помощью exec.

С учетом сказанного, вот метод Анишсане , адаптированный для неустановленных функций вместо переменной:

cat <<EOF | sudo gdb
attach $$
call unbind_func("unset")
call unbind_func("builtin")
call unbind_func("command")
detach
EOF

Обратите внимание, что$$расширяется до идентификатора процесса оболочки, потому что никакая часть EOFв <<EOFне заключена в кавычки.

Я протестировал это на версии Bash 4.3.48 (1 )-на Ubuntu 16.04 LTS, и это сработало. Для этого вам понадобится gdb, хотя его можно адаптировать и для других отладчиков. Как прокомментировал anishsane , конвейер из catпредназначен для избежания взаимоблокировки, когда процесс, который передает входные данные в gdb, является тем, который gdbбыл остановлен. Я считаю, что он достигает этой цели, потому что в конвейере из двух или более команд Bash выполняет каждую команду в подоболочке. Но я не уверен, что это самый надежный способ. В конечном счете, однако, нет реальной гарантии, что это все равно работает, поскольку для Bash вполне разумно предполагать, что переменные и функции только для чтения не изменятся. На практике я предполагаю, что это работает практически всегда.

Чтобы использовать эту технику, как написано, вам нужно установить sudoи иметь возможность sudoполучить root права. Конечно, вы можете заменить его другим методом повышения привилегий -. В зависимости от того, какую ОС вы используете и как она настроена, вы можете вообще опустить sudoи запустить gdbот имени пользователя вместо пользователя root. Например, ядро ​​Linux сверится со значением /proc/sys/kernel/yama/ptrace_scope, которое вы можете установить с помощью sysctl и можете прочитать или (как root )записать, чтобы определить, какие процессы могут отлаживать другие процессы. Если значение равно 1, то отлаживать его может только непосредственный родительский процесс --или любой процесс, запущенный с правами root --.В большинстве последних систем GNU/Linux для него установлено значение 1, поэтому я включил sudo.

Это описание поведения ядра Linux несколько упрощено, так как разрешены другие значения ptrace_scopeи что отношение, требуемое 1, может быть скорректировано. Полную информацию см. всоответствующей документации .

5
27.01.2020, 20:24

Теги

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