Выполнение команд оболочки Unix с использованием PHP - PullRequest
11 голосов
/ 12 апреля 2011

Текстовое поле будет использоваться для ввода команды. Мне сказали, что я должен использовать функцию exec() для выполнения команд оболочки UNIX.

Примерно так: пользователь вводит ls в текстовое поле. Функция exec() выполнит команду UNIX, и команда отобразится на веб-странице.

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

Я не знаю с чего начать, так как я очень плохо знаком с PHP.

Я использую Ubuntu.

Ответы [ 7 ]

12 голосов
/ 12 апреля 2011

exec * * 1002

system * * 1005

shell_exec

passthru

Обратные кавычки?

Pfah!

Реальные разработчики используют proc_open! Он имеет главное и явное преимущество: он предоставляет вам три потока PHP для подачи данных в процесс и чтения и stdout и stderr. Это то, что другие функции выполнения процесса просто не делают хорошо.

Это происходит за небольшую стоимость некоторого стандартного кода, так что это немного более многословно. Я считаю, что компромисс был превосходным.

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

10 голосов
/ 12 апреля 2011

Вы могли бы начать просматривать руководство по php:

Выполнение системной программы

Но, как уже упоминалось, sdleihssirhc, следите, это очень опасно, и вы должны НЕ разрешить выполнение всего!
Если вы все еще хотите это сделать, чтобы получить выходные данные оболочки, просто используйте

exec
Выходные данныеОболочка будет передана во втором параметре.

Например:

exec('ls -la', $outputArray);
print_r($outputArray);
4 голосов
/ 12 апреля 2011

Использование $output = system($command);

См. http://php.net/system и не забудьте прочитать предупреждения о безопасности. Если вы позволяете пользователю передавать какие-либо данные в system() (или exec() и т. Д.), Это почти как если бы у них была оболочка на вашем сервере. То же самое применимо, если вы не очищаете аргументы, передаваемые программам, выполняемым через эти функции должным образом.

3 голосов
/ 12 апреля 2011

Попробуйте $output = shell_exec('ls -lart');

документ shell_exec

2 голосов
/ 12 апреля 2011

Пока это одна строка, вы можете просто echo вернуть значение exec.

Вот так:

echo exec('ls');

Но отображается только первая строка.

1 голос
/ 12 апреля 2011
exec(escapeshellarg($userSuppliedInput), $output);

echo $output;
0 голосов
/ 12 апреля 2011

Вы можете использовать галочки для этой цели. Как:

$output = `command-executable -switches`

Кроме того, некоторые приложения выводят свой вывод в поток STD_ERR, поэтому вы можете не видеть вывод. В Linux вы можете перенаправить ввод ошибок на «обычный» ввод, добавив 2>&1 к командной строке.

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