php выполнить скрипт bash
Запустите 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 скрипта
У меня есть 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-скрипты: начало
Сегодня поговорим о bash-скриптах. Это — сценарии командной строки, написанные для оболочки bash. Существуют и другие оболочки, например — zsh, tcsh, ksh, но мы сосредоточимся на bash. Этот материал предназначен для всех желающих, единственное условие — умение работать в командной строке Linux.
Сценарии командной строки — это наборы тех же самых команд, которые можно вводить с клавиатуры, собранные в файлы и объединённые некоей общей целью. При этом результаты работы команд могут представлять либо самостоятельную ценность, либо служить входными данными для других команд. Сценарии — это мощный способ автоматизации часто выполняемых действий.
Итак, если говорить о командной строке, она позволяет выполнить несколько команд за один раз, введя их через точку с запятой:
На самом деле, если вы опробовали это в своём терминале, ваш первый bash-скрипт, в котором задействованы две команды, уже написан. Работает он так. Сначала команда pwd выводит на экран сведения о текущей рабочей директории, потом команда whoami показывает данные о пользователе, под которым вы вошли в систему.
Используя подобный подход, вы можете совмещать сколько угодно команд в одной строке, ограничение — лишь в максимальном количестве аргументов, которое можно передать программе. Определить это ограничение можно с помощью такой команды:
Командная строка — отличный инструмент, но команды в неё приходится вводить каждый раз, когда в них возникает необходимость. Что если записать набор команд в файл и просто вызывать этот файл для их выполнения? Собственно говоря, тот файл, о котором мы говорим, и называется сценарием командной строки.
Как устроены bash-скрипты
Команды оболочки отделяются знаком перевода строки, комментарии выделяют знаком решётки. Вот как это выглядит:
Тут, так же, как и в командной строке, можно записывать команды в одной строке, разделяя точкой с запятой. Однако, если писать команды на разных строках, файл легче читать. В любом случае оболочка их обработает.
Установка разрешений для файла сценария
Попытка запуска файла сценария с неправильно настроенными разрешениями
Сделаем файл исполняемым:
Теперь попытаемся его выполнить:
После настройки разрешений всё работает как надо.
Успешный запуск bash-скрипта
Вывод сообщений
Вот что получится после запуска обновлённого скрипта.
Вывод сообщений из скрипта
Использование переменных
Переменные позволяют хранить в файле сценария информацию, например — результаты работы команд для использования их другими командами.
Нет ничего плохого в исполнении отдельных команд без хранения результатов их работы, но возможности такого подхода весьма ограничены.
Существуют два типа переменных, которые можно использовать в bash-скриптах:
Переменные среды
Иногда в командах оболочки нужно работать с некими системными данными. Вот, например, как вывести домашнюю директорию текущего пользователя:
Использование переменной среды в сценарии
А что если надо вывести на экран значок доллара? Попробуем так:
В подобной ситуации поможет использование управляющего символа, обратной косой черты, перед знаком доллара:
Теперь сценарий выведет именно то, что ожидается.
Использование управляющей последовательности для вывода знака доллара
Пользовательские переменные
В дополнение к переменным среды, bash-скрипты позволяют задавать и использовать в сценарии собственные переменные. Подобные переменные хранят значение до тех пор, пока не завершится выполнение сценария.
Как и в случае с системными переменными, к пользовательским переменным можно обращаться, используя знак доллара:
Вот что получится после запуска такого сценария.
Пользовательские переменные в сценарии
Подстановка команд
Одна из самых полезных возможностей bash-скриптов — это возможность извлекать информацию из вывода команд и назначать её переменным, что позволяет использовать эту информацию где угодно в файле сценария.
Сделать это можно двумя способами.
При втором подходе то же самое записывают так:
А скрипт, в итоге, может выглядеть так:
Скрипт, сохраняющий результаты работы команды в переменной
Математические операции
Математические операции в сценарии
Управляющая конструкция if-then
А вот рабочий пример:
В данном случае, если выполнение команды pwd завершится успешно, в консоль будет выведен текст «it works».
Вот что получается после запуска этого скрипта.
В этом примере, если пользователь найден, скрипт выведет соответствующее сообщение. А если найти пользователя не удалось? В данном случае скрипт просто завершит выполнение, ничего нам не сообщив. Хотелось бы, чтобы он сказал нам и об этом, поэтому усовершенствуем код.
Управляющая конструкция if-then-else
Напишем такой скрипт:
Запуск скрипта с конструкцией if-then-else
Ну что же, продолжаем двигаться дальше и зададимся вопросом о более сложных условиях. Что если надо проверить не одно условие, а несколько? Например, если нужный пользователь найден, надо вывести одно сообщение, если выполняется ещё какое-то условие — ещё одно сообщение, и так далее. В подобной ситуации нам помогут вложенные условия. Выглядит это так:
Сравнение чисел
В скриптах можно сравнивать числовые значения. Ниже приведён список соответствующих команд.
В качестве примера опробуем один из операторов сравнения. Обратите внимание на то, что выражение заключено в квадратные скобки.
Вот что выведет эта команда.
Сравнение чисел в скриптах
Значение переменной val1 больше чем 5, в итоге выполняется ветвь then оператора сравнения и в консоль выводится соответствующее сообщение.
Сравнение строк
В сценариях можно сравнивать и строковые значения. Операторы сравнения выглядят довольно просто, однако у операций сравнения строк есть определённые особенности, которых мы коснёмся ниже. Вот список операторов.
Вот пример сравнения строк в сценарии:
В результате выполнения скрипта получим следующее.
Сравнение строк в скриптах
Вот одна особенность сравнения строк, о которой стоит упомянуть. А именно, операторы «>» и « » как команду перенаправления вывода.
Вот как работа с этими операторами выглядит в коде:
Вот результаты работы скрипта.
Сравнение строк, выведенное предупреждение
Обратите внимание на то, что скрипт, хотя и выполняется, выдаёт предупреждение:
Теперь всё работает как надо.
Она отсортирует строки из файла так:
Если его запустить, окажется, что всё наоборот — строчная буква теперь больше прописной.
Команда sort и сравнение строк в файле сценария
В командах сравнения прописные буквы меньше строчных. Сравнение строк здесь выполняется путём сравнения ASCII-кодов символов, порядок сортировки, таким образом, зависит от кодов символов.
Проверки файлов
Пожалуй, нижеприведённые команды используются в bash-скриптах чаще всего. Они позволяют проверять различные условия, касающиеся файлов. Вот список этих команд.
Эти команды, как впрочем, и многие другие рассмотренные сегодня, несложно запомнить. Их имена, являясь сокращениями от различных слов, прямо указывают на выполняемые ими проверки.
Опробуем одну из команд на практике:
Этот скрипт, для существующей директории, выведет её содержимое.
Вывод содержимого директории
Полагаем, с остальными командами вы сможете поэкспериментировать самостоятельно, все они применяются по тому же принципу.
Итоги
Сегодня мы рассказали о том, как приступить к написанию bash-скриптов и рассмотрели некоторые базовые вещи. На самом деле, тема bash-программирования огромна. Эта статья является переводом первой части большой серии из 11 материалов. Если вы хотите продолжения прямо сейчас — вот список оригиналов этих материалов. Для удобства сюда включён и тот, перевод которого вы только что прочли.
Уважаемые читатели! Просим гуру bash-программирования рассказать о том, как они добрались до вершин мастерства, поделиться секретами, а от тех, кто только что написал свой первый скрипт, ждём впечатлений.
Shell script с root правами из PHP?
с помощью приложения на PHP порождать некие процессы, работающие от конкретного (отличного от пользователя, от которого работает web-сервер) пользователя.
Сейчас, как вы можете догадаться, от apache отпочковываются процессы, работающие под его же пользователем, что естественно не есть гуд по нескольким причинам: 1) если понадобилось ребутнуть apache (или он не дай бог крэшнется сам), то упадут все процессы, порожденные от него 2) кривые права доступа для учетки www-data в связи с тем, что ей тоже нужны права на запуск экземпляров приложения, лежащего вне директории web-сервера. Хватит это терпеть, подумал я…
Был написан shell script, который умеет запускать приложение от конкретного пользователя. Он был протестирован от root-а через консольку — работет. Через PHP выполняем shell_exec(), который запускает наш скрипт с некоторыми параметрами (условно, для простоты понимания, с сетевым портом, который будет слушать экземпляр приложения). Осталось разобраться с правами www-data на запуск скрипта от root-а. Ну так же ж есть sudo, подумал я… Вот тут-то и возникли сложности.
Положим, что бинарник приложения лежит (условно) тут /home/app/bin. Пользователь username, от которого мы собираемся запускать экземпляры, имеет полный доступ (rwx) как к директории так и к бинарнику.
Файлы web-сервера как и положено валяются где-то в /var/www. Apache работает от пользователя www-data.
Shell script лежит (условно) в /var/www/script.sh. Полные права доступа (rwx) к нему имеет только root, все остальные делать с ним ни чего не могут. Он тщательно проверяет входные параметры (существование пути, существование бинарника и другие проверки) и запускает экземпляр приложения следующей командой:
или условно
Остается позволить www-data запускать script.sh от root-а. Ставим sudo,
идем в /etc/sudoers и добавляем:
www-data ALL=(root) NOPASSWD: /var/www/script.sh
По ощущениям этого достаточно и по тем же ощущениям подозрения — слишком просто.
Теперь из PHP вызываем наш скрипт:
Пробуем по другому (через консоль):
Появляется мало ожидаемое приглашение ввести пароль пользователя www-data:
[sudo] password for www-data:
А NOPASSWD на что? Да и вообще какого хрена пароль у www-data? 🙁
Собственно, что я делаю не так?
Понятное дело, что православность решения мягко говоря под сомнением, но пока хочется «добить» хотя бы его (силы-то и время уже потрачены). Другие решения придут (надеюсь) позднее с новым опытом.
Как запустить bash скрипт из php?
Здравствуйте. Слоижлась ситуация, что надо запустить bash скрипт из php. Да, не секьюрно. Этим рулит jalkit.
Соединение устанавливается. Но скрипт не выполняется.
И еще, как запустить скрипт от sudo через php?
Спасибо.
Вопрос еще такой. Как запустить скрипт с sudo?
Адрес и порт точно правильный?
обычно sshd демон висит не на 29937, может вы не туда подключаетесь?
Попробуйте выполнить команду попроще, типа whoami или ‘echo test >> /tmp/test.txt’
Чтобы выполнить sudo, нужно, например, разрешить пользователю выполнять sudo без запроса пароля, что делается настройкой /etc/sudoers. Добавьте в конце файла для этого юзера строку:
username ALL=NOPASSWD: ALL
теперь просто sudo и все.
Если подключиться к серверу самому под этим пользователем, ваша команда запускается?