shell_exec () не может выполнить определенные команды

1

Я просто тестировал и возился с элементами безопасности, когда заметил, что я не могу получить результат из следующего:

<?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 возвращают результаты;
  • 0
    Вы абсолютно уверены, что это тот же пользователь? попробуйте whoami оба пути, чтобы убедиться.
  • 0
    Да, это тот же пользователь. Действительно подтвердил это с whoami .
Показать ещё 2 комментария
Теги:
shell-exec

2 ответа

1
Лучший ответ

shell_exec() запускает sh. История - это функция расширения, доступная в других оболочках, таких как bash, ksh и zsh, но не в целом в sh (в некоторых операционных системах sh - это ссылка на bash, но bash проверяет имя, в котором оно было запущено, и отключает многие расширения, когда называемый sh).

Вы можете сделать:

shell_exec("bash -c 'history'");

для запуска bash и выполнения его команды history.

Также обратите внимание, что механизм истории обычно доступен только в интерактивных оболочках, а не в оболочках, вызванных из программ.

  • 0
    Я только что попробовал это. Возвращает NULL . Не могли бы вы проверить, что это работает на вашем конце?
  • 0
    Как я уже писал, неинтерактивные оболочки не хранят историю. Так почему вы ожидаете, что он что-нибудь вернет?
Показать ещё 2 комментария
0

Нашел ответ. Похоже, что большинство оболочек долгое время включали команду history в качестве встроенной оболочки. Из Википедии:

Встроенная оболочка - это команда или функция, вызываемая из оболочки, которая выполняется непосредственно в самой оболочке, а не внешняя исполняемая программа, которую будет загружать и выполнять оболочка.

Источник: https://en.wikipedia.org/wiki/Shell_builtin

Выноски оболочки PHP обрабатываются sh, но большинство здравомыслящих людей используют bash который хранит свою историю в другом месте. Кроме того, история оболочки обычно записывается только интерактивными оболочками во время изящного закрытия.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню