Меню Рубрики

Php выполнение linux команд

Использование PHP-кодов в командной строке Linux. Часть 1

PHP — это скриптовый язык с открытым исходным кодом. Язык, который первоначально обозначался как «Personal Home Page», теперь означает «PHP: Hypertext Preprocessor», что является рекурсивным акронимом. Это язык межплатформенного скриптинга, на который сильно влияют C, C ++ и Java.

Синтаксис PHP очень похож на синтаксис языка программирования C, Java и Perl с несколькими специфичными для PHP функциями. На данный момент PHP используется примерно 260 миллионами веб-сайтов. Текущей стабильной версией является PHP Version 5.6.10.

PHP — это встроенный скрипт HTML, который позволяет разработчикам быстро создавать динамически сгенерированные страницы. PHP в основном используется на стороне сервера (и JavaScript на стороне клиента) для создания динамических веб-страниц через HTTP, однако вы будете удивлены, узнав, что вы можете выполнять PHP в консоли Linux без необходимости использования веб-браузера.

Эта статья нацелена на то, чтобы пролить свет на аспекты командной строки PHP-скриптового языка.

1. После установки PHP и Apache2 нам нужно установить PHP-интерпретатор Line Interpreter.

Следующее, что мы делаем, это проверяем php (установлен ли он правильно) обычно, создавая файл infophp.php в каталоге «/var/www/html» (рабочий каталог Apache2 в большинстве версий), с содержимым , просто выполнив приведенную ниже команду.

а затем отмечаем свой браузер на http://127.0.0.1/infophp.php, который откроет этот файл в веб-браузере.

Те же результаты можно получить с консоли Linux без необходимости использования какого-либо браузера. Запустите файл PHP, расположенный в ‘/var/www/html/infophp.php’ в командной строке Linux, как:

Поскольку вывод слишком велик, мы можем конвейерно вывести его с помощью команды ‘less‘, чтобы получить один выход экрана одновременно:

Здесь опция ‘-f‘ анализирует и выполняет файл, следующий за командой.

2. Мы можем использовать phpinfo (), который является очень ценным инструментом отладки непосредственно в командной строке Linux без необходимости вызывать его из файла:

Здесь опция ‘-r‘ запускает код PHP в терминале Linux непосредственно без тегов .

3. Запустите PHP в интерактивном режиме и выполните несколько действий. Здесь опция ‘-a‘ предназначена для запуска PHP в интерактивном режиме.

Нажмите ‘exit‘ или ‘ctrl + c‘, чтобы закрыть интерактивный режим PHP.

4. Вы можете запустить PHP-скрипт так же просто, так и сценарий оболочки. Сначала создайте сценарий образца PHP в текущем рабочем каталоге.

Обратите внимание, что мы использовали #!/usr/bin/php в первой строке этого скрипта PHP, так же, как мы это делали в сценарии оболочки (/bin/bash). Первая строка #!/usr/bin/php сообщает командной строке Linux о выполнении синтаксического анализа этого файла сценария на интерпретаторе PHP.

Вторая делает его исполняемым как:

и запускает его, как:

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

Запустите PHP-интерактивный режим.

Создайте функцию и назовите ее ‘addition‘. Также обозначьте две переменные $a и $b.

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

Определите правило (правила). Здесь правило указывает, что нужно добавить две переменные.

Все правила определены. Закройте их, закрыв фигурные скобки.

Проверьте функцию и добавьте цифры 4 и 3 :

Образец вывода

Вы можете запустить приведенный ниже код для выполнения функции столько раз, сколько хотите, с разными значениями. Замените a и b вашими значениями.

Образец вывода

Вы можете запустить эту функцию до выхода из интерактивного режима (ctrl + z). Также вы должны были заметить, что в приведенном выше примере возвращаемый тип данных – NULL. Это можно исправить, совершив запрос php interactive shell вернуться на место echo.

Просто замените выражение ‘echo’ в вышеуказанной функции ‘return’

и остальная часть остается неизменной.

Вот пример, который возвращает на выходе соответствующий тип данных.

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

Спасибо за уделенное время на прочтение статьи!

Если возникли вопросы, задавайте их в комментариях.

Подписывайтесь на обновления нашего блога и оставайтесь в курсе новостей мира инфокоммуникаций!

Источник

Как средствами php запустить выполнение linux-команды в фоновом режиме?

Для запуска скриптов на сервере в фоновом режиме я обычно использую команду nohup. Я попробовал вызвать её через exec и shell_exec без дополнительных параметров. При запуске команды скрипт зависает до того момента, пока команда не выполнится. Ниже код команды:

Так как же мне запустить rsync в фоновом режиме средствами php так, чтобы скрипт не ждал пока выполнится команда?

1. PHP-скрипт запускается из браузера, а не из терминала
2. PHP работает через php-fpm, т.е. без Apache

Я заменил фоновую команду на упрощенную для анализа проблемы. Следующие варианты вешают скрипт:

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

Тем не менее варианты:

тоже не работают как надо.

Я также пробовал заменять exec на shell_exec, но это не дало никакого результата.

Источник

shell_exec

shell_exec — Выполнить команду через оболочку и вернуть вывод в виде строки

Описание

Эта функция идентична оператору с обратным апострофом.

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

Список параметров

Команда, которая будет выполнена.

Возвращаемые значения

Вывод исполняемой команды или NULL , если произошла ошибка или команда не производит вывод.

Эта функция может вернуть NULL в двух случаях: если произошла ошибка или если выполняемая команда ничего не выводит. Не пользуйтесь этой функцией, для определения, успешно ли выполнилась команда. Вместо этого используйте exec() , так как она предоставляет возможность проверить код возврата.

Примеры

Пример #1 Пример использования shell_exec()

Примечания

Эта функция недоступна в безопасном режиме.

Смотрите также

  • exec() — Выполнить внешнюю программу
  • escapeshellcmd() — Экранировать метасимволы командной строки

User Contributed Notes 31 notes

If you’re trying to run a command such as «gunzip -t» in shell_exec and getting an empty result, you might need to add 2>&1 to the end of the command, eg:

Won’t always work:
echo shell_exec(«gunzip -c -t $path_to_backup_file»);

Should work:
echo shell_exec(«gunzip -c -t $path_to_backup_file 2>&1»);

In the above example, a line break at the beginning of the gunzip output seemed to prevent shell_exec printing anything else. Hope this saves someone else an hour or two.

To run a command in background, the output must be redirected to /dev/null. This is written in exec() manual page. There are cases where you need the output to be logged somewhere else though. Redirecting the output to a file like this didn’t work for me:

# this doesn’t work!
shell_exec ( «my_script.sh 2>&1 >> /tmp/mylog &» );
?>

Using the above command still hangs web browser request.

Seems like you have to add exactly «/dev/null» to the command line. For instance, this worked:

# works, but output is lost
shell_exec ( «my_script.sh 2>/dev/null >/dev/null &» );
?>

But I wanted the output, so I used this:

A simple way to handle the problem of capturing stderr output when using shell-exec under windows is to call ob_start() before the command and ob_end_clean() afterwards, like this:

()
$dir = shell_exec ( ‘dir B:’ );
if is_null ( $dir )
< // B: does not exist
// do whatever you want with the stderr output here
>
else
< // B: exists and $dir holds the directory listing
// do whatever you want with it here
>
ob_end_clean (); // get rid of the evidence 🙂
?>

If B: does not exist then $dir will be Null and the output buffer will have captured the message:

‘The system cannot find the path specified’.

(under WinXP, at least). If B: exists then $dir will contain the directory listing and we probably don’t care about the output buffer. In any case it needs to be deleted before proceeding.

I had trouble with accented caracters and shell_exec.

Executing this command from shell :

/usr/bin/smbclient ‘//BREZEME/peyremor’ -c ‘dir’ -U ‘peyremor%*********’ -d 0 -W ‘ADMINISTRATIF’ -O ‘TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=8192 SO_SNDBUF=8192’ -b 1200 -N 2>&1

Vidéos D 0 Tue Jun 12 14:41:21 2007
Desktop DH 0 Mon Jun 18 17:41:36 2007

Using php like that :

shell_exec(«/usr/bin/smbclient ‘//BREZEME/peyremor’ -c ‘dir’ -U ‘peyremor%*******’ -d 0 -W ‘ADMINISTRATIF’ -O ‘TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=8192 SO_SNDBUF=8192’ -b 1200 -N 2>&1»)

Vid Desktop DH 0 Mon Jun 18 17:41:36 2007

The two lines were concatenated from the place where the accent was.

I found the solution : php execute by default the command with LOCALE=C.

I just added the following lines before shell_exec and the problem was solved :

$locale = ‘fr_FR.UTF-8’;
setlocale(LC_ALL, $locale);
putenv(‘LC_ALL=’.$locale);

Just adapt it to your language locale.

Here is a easy way to grab STDERR and discard STDOUT:
add ‘2>&1 1> /dev/null’ to the end of your shell command

For example:
= shell_exec ( ‘ls file_not_exist 2>&1 1> /dev/null’ );
?>

I’m not sure what shell you are going to get with this function, but you can find out like this:

= ‘set’ ;
echo «» ;
?>

On my FreeBSD 6.1 box I get this:

USER=root
LD_LIBRARY_PATH=/usr/local/lib/apache2:
HOME=/root
PS1=’$ ‘
OPTIND=1
PS2=’> ‘
LOGNAME=root
PPID=88057
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
SHELL=/bin/sh
IFS=’

Very interesting. Note that the PATH may not be as complete as you need. I wanted to run Ghostscript via ImageMagik’s «convert» and ended up having to add my path before running the command:

= ‘export PATH=»/usr/local/bin/»; convert -scale 25%x25% file1.pdf[0] file2.png 2>&1’ ;
echo «» ;
?>

ALSO, note that shell_exec() does not grab STDERR, so use «2>&1» to redirect it to STDOUT and catch it.

Here is my gist to all:

function execCommand($command, $log) <

if (substr(php_uname(), 0, 7) == «Windows»)
<
//windows
pclose(popen(«start /B » . $command . » 1> $log 2>&1″, «r»));
>
else
<
//linux
shell_exec( $command . » 1> $log 2>&1″ );
>

On Windows, if shell_exec does NOT return the result you expected and the PC is on an enterprise network, set the Apache service (or wampapache) to run under your account instead of the ‘Local system account’. Your account must have admin privileges.

To change the account go to console services, right click on the Apache service, choose properties, and select the connection tab.

I have PHP (CGI) and Apache. I also shell_exec() shell scripts which use PHP CLI. This combination destroys the string value returned from the call. I get binary garbage. Shell scripts that start with #!/usr/bin/bash return their output properly.

A solution is to force a clean environment. PHP CLI no longer had the CGI environment variables to choke on.

// Binary garbage.
$ExhibitA = shell_exec ( ‘/home/www/myscript’ );

// Perfect.
$ExhibitB = shell_exec ( ‘env -i /home/www/myscript’ );

?>

— start /home/www/myscript
#!/usr/local/bin/phpcli
echo( «Output.\n» );

shell_exec is extremely useful as a substitute for the virtual() function where unavailable (Microsoft IIS for example). All you have to do is remove the content type string sent in the header:

This works fine for me as a substitute for SSI or the virtual() func.

it took me a heck of a lot of head banging to finally solve this problem so I thought that I would mention it here.

If you are using Eclipse and you try to do something like

= shell_exec ( «php -s $File » ); //this fails
?>

it will always fail when run inside of the Eclipse debugger. This happens on both Linux and Windows. I finally isolated the problem to changes that Eclipse makes to the environment when debugging.

The fix is to force the ini setting. If you don’t need an ini then -n is sufficient.

= shell_exec ( «php -n -s $File » ); //this works
?>

Of course if you run it outside of the debugger then it works fine without the -n. You may want to use a debug flag to control this behavior.

As others have noted, shell_exec and the backtick operator (`) both return NULL if the executed command doesn’t output anything.

This can be worked around by doing anything like the following:

Here we’re simply outputting blank whitespace if the command succeeds — which satisfies this slightly strange issue. From there, you can trim() the command output etc.

Be careful as to how you elevate privileges to your php script. It’s a good idea to use caution and planing. It is easy to open up huge security holes. Here are a couple of helpful hints I’ve gathered from experimentation and Unix documentation.

Things to think about:

1. If you are running php as an Apache module in Unix then every system command you run is run as user apache. This just makes sense.. Unix won’t allow privileges to be elevated in this manner. If you need to run a system command with elevated privileges think through the problem carefully!

2. You are absolutely insane if you decide to run apache as root. You may as well kick yourself in the face. There is always a better way to do it.

3. If you decide to use a SUID it is best not to SUID a script. SUID is disabled for scripts on many flavors of Unix. SUID scripts open up security holes, so you don’t always want to go this route even if it is an option. Write a simple binary and elevate the privileges of the binary as a SUID. In my own opinion it is a horrible idea to pass a system command through a SUID— ie have the SUID accept the name of a command as a parameter. You may as well run Apache as root!

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Не работает sudo mac os
  • Не работает parallels desktop в mac os high sierra
  • Не работает cmd r mac os
  • Не работает app store на mac os x
  • Не получается очистить корзину mac os