bash запуск скрипта php

Bash скрипт для запуска php скрипта

У меня есть php-скрипт, который я хочу запустить с помощью скрипта bash, поэтому я могу использовать Cron для запуска php-скрипта каждую минуту или около того.

насколько я знаю, мне нужно создать скрипт bash для обработки скрипта php, который затем позволит мне использовать инструмент Cron/таймер.

до сих пор мне сказали, что мне нужно поставить:

в начале моего PHP-скрипта. Я не знаю, что делать дальше.

какие-либо советы? Спасибо.

8 ответов

если у вас установлен PHP в качестве инструмента командной строки (попробуйте выдать php к терминалу и посмотреть, работает ли он), ваш shebang ( #! строка) должна выглядеть так:

поместите это в верхней части скрипта, сделайте его исполняемым ( chmod +x myscript.php ) и сделайте задание Cron для выполнения этого сценария (так же, как вы выполняете сценарий bash).

предыдущий плакат сказал..

если у вас установлен PHP в качестве инструмента командной строки. ваш shebang (#!) строка должна выглядеть так: #!/usr/bin/php

php is /usr/local/php5/bin/php
php is /usr/bin/php
php is /usr/local/bin/php
php is /Library/WebServer/CGI-Executables/php

вам просто нужно установить :

Я уверен, что что-то вроде этого вы ищете:

сохраните это с желаемым именем скрипта (например, runPHP.sh) и дать ему права на выполнение, то вы можете использовать его, как вы хотите.

скрипт bash должен быть примерно таким:

вам нужен исполняемый файл php (обычно находится в /usr/bin) и путь PHP-скрипта для запуска. Теперь осталось только положить этот скрипт в crontab и все готово!

Я debian и выше команды, показывающей мне

надеюсь, что это поможет.

Если вы ничего не делаете в своем скрипте bash, чем запустить php, вы можете просто запустить PHP-скрипт из cron с помощью команды /usr/bin/php /path/to/your/file.РНР.

Источник

Запустите bash-скрипт из PHP-скрипта

Я использую сервер Apache на CentOS и мне нужно запустить несколько скриптов bash со страницы PHP. Выполнение команд, которые НЕ требуют разрешения на запись или выполнение из файла PHP, работает нормально (например, shell_exec (‘ls / var / www / html / scripts /’)), но у меня проблема с запуском команд, которым нужно разрешение на запись или выполнение. Например, эта команда ничего не делает:

Я сделал пользователя Apache владельцем и предоставил необходимые разрешения для каталога скриптов:

и файл test.sh как видно, но блокировки не было.

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

Также я проверил PHP safe_mode, который выключен, и в файле php.ini нет ограничений:

Ваша помощь будет высоко ценится.

Я отредактировал мой скрипт bash и добавил Судо как ниже:

Теперь, когда я запускаю файл как пользователь apache, используя эту команду, он запускается успешно:

Но через веб-страницу php он запускает только echo «Hi from test.sh»; линия. Когда я проверяю логи, ниже приведены строки для запуска команды:

И сгенерированный журнал при запуске с веб-страницы php:

Отсутствует pam_unix (su: session) открывать и закрывать.

Решение

Я нашел, в чем проблема. Это было из-за возможности Linux SELinux. Эта функция применяет политику наименьших привилегий и запрещает запуск любой ненужной команды в Linux. Сценарий bash успешно работает после отключения этой функции. Для этого отредактируйте файл / etc / selinux / config и измените SELINUX = принудительно на SELINUX = отключено и перезагрузите систему. ЭТО НЕ РЕКОМЕНДУЕТСЯ ПО ПРИЧИНАМ БЕЗОПАСНОСТИ. Вы можете проверить ссылку ниже, чтобы создать только некоторые исключения, а не полностью отключить SELinux.

Источник

Выполнение скрипта Bash из скрипта PHP

Я хочу выполнить скрипт Bash, присутствующий в системе, из скрипта PHP. У меня в системе есть два сценария. Одним из них является PHP скрипт под названием client.php присутствует в /var/www /html, а другой-скрипт Bash под названием testscript, присутствующий в/home / testuser.

мой клиент.PHP скрипт выглядит так:

мой testscript выглядит как

когда я делаю следующее в терминале

Я получаю следующий вывод на терминале

но когда я открываю страницу в

Я получаю следующий вывод

Я получаю эту ошибку даже после того, как я сделал chmod +x testscript.
Как заставить его работать из браузера? Пожалуйста помочь.

4 ответов

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

EDIT:

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

не зная сложности настройки, мне нравится маршрут sudo. Во-первых, вы должны настроить sudo, чтобы разрешить вашему веб-серверу sudo запускать данную команду как root. Затем вам нужно иметь скрипт, который веб-сервер shell_exec (testscript) запускает команду с sudo.

для коробки Debian с Apache и sudo:

в качестве root выполните следующие действия для редактирования новый / выделенный файл конфигурации для sudo:

(или все, что вы хотите назвать своим файлом в /etc/sudoers.d/ )

добавьте в файл следующий код:

здесь это команда, которую вы должны иметь возможность запускать как root с полным путем в его имени (скажем /bin/chown на Чаун исполняемый). Если исполняемый файл будет выполняться с одними и теми же аргументами каждый раз, вы можете добавить его аргументы сразу после имя исполняемого файла для дальнейшего ограничения его использования.

например, скажем, мы всегда хотим скопировать один и тот же файл в каталог /root/, мы напишем следующее:

изменить скрипт (testscript):

если вы все еще получаете отказ в разрешении, файл сценария и разрешения родительских каталогов могут не позволить веб-серверу выполнить сам скрипт. Таким образом, вам нужно переместить скрипт в более подходящий каталог и / или изменить разрешения скрипта и родительского каталога, чтобы разрешить выполнение www-data (user или группа), что выходит за рамки данного руководства.

помните:

при настройке sudo цель состоит в том, чтобы разрешить команду в самой ограниченной форме. Например, вместо того, чтобы разрешить общее использование cp команда, вы разрешаете только cp команда, если аргументы, скажем, / root /test1/root / test2. Это значит, что cpАргументы(и функциональность cp невозможно изменить).

Это простая проблема. Когда вы работаете с terminal, вы запускаете php-файл из terminal как привилегированный пользователь. Когда вы переходите на php из своего веб-браузера, скрипт php запускается как пользователь веб-сервера, у которого нет разрешений на выполнение файлов в вашем домашнем каталоге. В Ubuntu пользователь www-data является пользователем веб-сервера apache. Если вы находитесь на ubuntu, вам придется сделать следующее: chown yourusername: www-data / home/testuser/testscript чмод г+х / home/testuser / testscript

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

я боролся с этим вопросом в течение трех дней. Я установил разрешения для скрипта на 755. Я называл свой сценарий следующим образом.

мой сценарий был следующим.

Я не получал никакого вывода или обратной связи. Изменение, которое я сделал, чтобы запустить скрипт, заключалось в добавлении компакт-диска в tmp внутри скрипта:

Это было больше удачей, чем суждением, но теперь он работает отлично. Надеюсь, это поможет.

Источник

shell_exec

(PHP 4, PHP 5, PHP 7, PHP 8)

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

Описание

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

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

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

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

Ошибки

Примеры

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

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

User Contributed Notes 33 notes

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:

proc_open is probably a better solution for most use cases as of PHP 7.4. There is better control and platform independence. If you still want to use shell_exec(), I like to wrap it with a function that allows better control.

Something like below solves some problems with background process issues on apache/php. It also

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:

‘The system cannot find the path specified’.

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:

I had trouble with accented caracters and shell_exec.

Executing this command from shell :

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 :

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 :

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’ );
?>

Here is my gist to all:

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.

How to get the volume label of a drive on Windows

print GetVolumeLabel ( «c» );

?>

Note: The regular expression assumes a english version of Windows is in use. modify it accordingly for a different localized copy of Windows.

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’ );

?>

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

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!

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:

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 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.

Источник

Выполнить команду оболочки в PHP с помощью exec()

Главное меню » Программирование » PHP » Выполнить команду оболочки в PHP с помощью exec()

bash запуск скрипта php

Синтаксис:

Эта функция может принимать три аргумента. Первый аргумент является обязательным, который примет системную команду. Два других аргумента необязательны. Второй аргумент используется для хранения вывода команды в массиве. Третий аргумент этой функции используется для хранения статуса возврата выполненной команды. Эта функция возвращает последнюю строку из вывода выполненной команды.

Пример-1: Использование функции exec () без дополнительных аргументов

Пример-2: Распечатать все значения выполненной команды

Пример-3: Распечатать все файлы PHP в текущем каталоге

Пример-4: Запуск сценария bash

Как любой сценарий bash может быть выполнен с помощью функции exec (), показано в этом примере. Создайте файл bash с именем loop.sh со следующим скриптом, который будет печатать все четные числа от 1 до 20.

Следующий вывод появится после запуска вышеуказанного скрипта с сервера. Вывод показывает все четные числа от 1 до 20.

Пример 5: Запуск команды `dir` с помощью функции exec()

Заключение:

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

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

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