2016-02-01 3 views
1

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

<?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 do return results;
+0

Вы действительно точно знаете, что это тот самый пользователь? попробуйте 'whoami' оба способа убедиться. – SZenC

+0

Да, это тот же пользователь. Подтвердили это с помощью 'whoami'. – McJohnson

+0

Хорошо, тогда я не знаю, извините – SZenC

ответ

1

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

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

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

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

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

+0

Я просто попробовал. Возвращает 'NULL'. Не могли бы вы проверить, что он работает на вашем конце? – McJohnson

+0

Как я уже писал, неинтерактивные оболочки не хранят историю. Так почему вы ожидаете, что он вернет что-нибудь? – Barmar

+0

Это просто мешает ему получить сообщение о том, что команда не найдена. – Barmar

0

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

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

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

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

Смежные вопросы