Я просто тестировал и возился с элементами безопасности, когда заметил, что я не могу получить результат из следующего:
<?php echo shell_exec('history'); ?>
То же самое относится к:
<?php echo shell_exec('fc -l 1'); ?>
Оба были опробованы с 2>&1
в конце, но в конце концов - history
не является командой. Пробовали и в CLI:
php -r "echo shell_exec('fc -l 1');"
который ничего не возвращает. Была предпринята попытка с system()
и exec()
также (= не возвращает результат). В то же время:
history
и fc -l 1
через SSH;ls
через PHP (shell_exec()
как в Интернете, так и в CLI);history
и fc -l 1
возвращают результаты; shell_exec()
запускает sh
. История - это функция расширения, доступная в других оболочках, таких как bash
, ksh
и zsh
, но не в целом в sh
(в некоторых операционных системах sh
- это ссылка на bash
, но bash
проверяет имя, в котором оно было запущено, и отключает многие расширения, когда называемый sh
).
Вы можете сделать:
shell_exec("bash -c 'history'");
для запуска bash
и выполнения его команды history
.
Также обратите внимание, что механизм истории обычно доступен только в интерактивных оболочках, а не в оболочках, вызванных из программ.
NULL
. Не могли бы вы проверить, что это работает на вашем конце?
Нашел ответ. Похоже, что большинство оболочек долгое время включали команду history
в качестве встроенной оболочки. Из Википедии:
Встроенная оболочка - это команда или функция, вызываемая из оболочки, которая выполняется непосредственно в самой оболочке, а не внешняя исполняемая программа, которую будет загружать и выполнять оболочка.
Источник: https://en.wikipedia.org/wiki/Shell_builtin
Выноски оболочки PHP обрабатываются sh
, но большинство здравомыслящих людей используют bash
который хранит свою историю в другом месте. Кроме того, история оболочки обычно записывается только интерактивными оболочками во время изящного закрытия.
whoami
оба пути, чтобы убедиться.whoami
.