Запуск bash.sh в php, не работает shell_exec

12
G-and-Y
На сайте с 29.06.2013
Offline
156
8741

ОС Debian 7.7

php.ini прописал

safe_mode_exec_dir = /var/www/1

safe_mode = On

2.sh

#!/bin/bash
sudo /etc/init.d/mysql restart

пробовал по разному

так

<?php

var_dump(shell_exec('sudo /etc/init.d/mysql restart'));

?>

и так

<?php

$run = "ts /var/www/1/2.sh {$_SERVER['REMOTE_ADDR']}";

exec($run);

?>

с shell_exec без ts с sudo и без еще кучу в инете находил, толку ноль.

права кругом 777

где то мельком видел что в последних версиях пшп отказались от shell_exec и exec, может не так понял. Короч подскажите кто в курсе.

Абузо-устойчивые впс в Нидерландах от 5$/мес (https://cp.inferno.name/aff.php?aff=2991)
Оптимизайка
На сайте с 11.03.2012
Offline
396
#1

Пользователь www-data не добавлен в sudoers. Пропишите в /etc/sudoers что ему можно выполнять эту команду. И надеюсь что пакет sudo установлен?

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
G-and-Y
На сайте с 29.06.2013
Offline
156
#2

записал в /etc/sudoers

www-data ALL=(root) NOPASSWD: ALL

su www-data

sudo sh /var/www/1/2.sh

работает

<?php
$result = shell_exec ('sh /var/www/1/2.sh');
echo $result;
if ($result)
{
echo "Все хорошо.";
}
if (!$result)
{
echo "Ошибка.";
}
?>

Пишет

Stopping MySQL database server: mysqld failed! /etc/init.d/mysql: ERROR: The partition with /var/lib/mysql is too full! ... failed! Все хорошо.

$result = shell_exec ('sudo sh /var/www/1/2.sh'); и $result = shell_exec ('/var/www/1/2.sh');

не работают

если в 2.sh прописать

echo "TEST" >> out.txt

создается файл в корне сайта.

Что не так?

---------- Добавлено 09.12.2014 в 03:07 ----------

надо выполнить sudo /etc/init.d/mysql restart в 2.sh

Оптимизайка
На сайте с 11.03.2012
Offline
396
#3
G-and-Y:
The partition with /var/lib/mysql is too full! ... failed

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

записал в /etc/sudoers
www-data ALL=(root) NOPASSWD: ALL

NOPASSWD: ALL как-то слишком круто. Достаточно было ограничиться одной конкретной командой.

E
На сайте с 01.03.2011
Online
160
#4

используйте банальный exec и sudo

exec('sudo -u USERNAME -S SCRIPT');

где USERNAME - имя пользователя, от которого идет запуск

SCRIPT - команда со всеми параметрами

т.е. попробуйте

exec('sudo -u www-data -S /etc/init.d/mysql restart');

еще можно дать привелегию для service, и сделать что-то вроде:

/etc/sudoers

www-data HOSTNAME = (root) NOPASSWD: /usr/sbin/service

www-data - юзер от которого запускается скрипт

HOSTNAME надо заменить на хостнейм машины

/usr/sbin/service - полный путь до бинарника

shell.php

exec('sudo -u www-data -S service mysql restart');

либо то, что находится после -S заменить на путь до скрипта sh, в котором просто прописать service mysql restart

но короткий вариант по идее должен работать (не проверял, но через sh 100% будет работать + в sh ненадо прописывать sudo).

p.s. права 777 незачем ставить

p.s.s. отключите лучше safe mode

G-and-Y
На сайте с 29.06.2013
Offline
156
#5

Ничего не получилось, решил вопрос запуском пшп из папки под рутом в кроне

* * * * * /usr/lib/cgi-bin/php /var/www/script.php

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

может кому пригодится

<? function check_http_status($url)
{
$user_agent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$page = curl_exec($ch);

$err = curl_error($ch);
if (!empty($err))
return $err;

$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return $httpcode;
}

$url2 = array("/", "http://site2.ru");
foreach ($url2 as $url) {
$answer = check_http_status($url);

$date = date('H:i - d.m.Y');
$file = 'log.txt';
$content = "$url - $answer - $date\n";
if ($answer ==200) {
echo ""; }
else {
exec ('sh /var/www/script.sh');
mail("mulo@mail.ru", "$answer - $url - $date", "$url - $answer - $date");
file_put_contents($file, $content, FILE_APPEND | LOCK_EX);
}
}
?>

Маленький вопрос, как в баш запустить команды по очереди а то работает только последняя

#!/bin/bash
/etc/init.d/mysql restart
/etc/init.d/apache2 restart
/etc/init.d/nginx restart
Andreyka
На сайте с 19.02.2005
Offline
822
#6

Поздравляю с изобретением monit!

Не стоит плодить сущности без необходимости
G-and-Y
На сайте с 29.06.2013
Offline
156
#7
Andreyka:
Поздравляю с изобретением monit!

Так это нада разбиратся с этим монитом он еще ресурсы наверно жрет какие то, а тут скриптик 1кб и усе. Ну а вообще да если раньше кто то подсказал, мб было б и проще.

Д
На сайте с 01.04.2012
Offline
133
#8

Спасибо за скриптик, пригодится.

G-and-Y:

Маленький вопрос, как в баш запустить команды по очереди а то работает только последняя

А так если :

#!/bin/bash
service mysqld restart ; service httpd restart ; service nginx restart

У мнея сработало, CentOS.

[dsds@]# sh ./monit.sh

Shutting down MySQL.... SUCCESS!

Starting MySQL.. SUCCESS!

Stopping httpd: [ OK ]

Starting httpd: [ OK ]

Stopping nginx: [ OK ]

Starting nginx: [ OK ]

VPN/SSD VPS в любой локации на выбор ( https://cp.inferno.name/cart.php ). Скидка 25% для новых заказов по промо-коду VESNA2024
DV
На сайте с 01.05.2010
Offline
644
#9

Если последовательно, после отработки предыдущей, то через двойной амперсанд. Надо, чтобы каждая возвращала TRUE.

VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
Andreyka
На сайте с 19.02.2005
Offline
822
#10

Ну конечно, собирать свой велосипед проще, чем взять готовый и поехать на нем

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий