Exec не работает linux

Обновлено: 07.07.2024

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

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

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

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

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

www-data ALL=(root) NOPASSWD: ALL

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

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

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

G-and-Y:
The partition with /var/lib/mysql is too full! . failed

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я разрабатываю php-приложение с использованием Linux-сервера. Моя проблема заключается в выполнении shell_exec() для вызова некоторого exe-файла не работает (на самом деле это не exe, это своего рода исполняемый файл linux)

У меня есть демон

Я получил некоторое имя файла но

У меня ничего нет, пустая страница

Все эти команды, если я набираю терминал (пользователь hu), будут работать. Я искал google в течение нескольких часов, люди говорят, что из-за разрешения. У меня нет опыта работы в Linux. Что мне нужно сделать для выполнения моей программы в php?

Пользователь Apache www-data должен получить привилегии для выполнения определенных приложений с помощью sudo

  1. Запустите команду sudo visudo . На самом деле мы хотим отредактировать файл в etc/sudoers . Для этого, используя sudo visudo в терминале, он дублирует (temp) sudoers файл для редактирования.
  2. В конце файла добавьте следующий ex: -если мы хотим использовать команду для restart smokeping и php для другого действия в вашем вопросе,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php

(Предполагается, что вы хотите запустить restart и php с использованием суперпользователя (root). И вы используете команду php в usr/bin/ )

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

3. После редактирования файла sudoers (с помощью visudo мы редактируем временный файл sudoers , чтобы сохранить и закрыть файл temp (visudo) для записи в файле sudoers . ( wq! )

4. Вот что, теперь используйте exec() или shell_exec следующим образом внутри вашего сценария xxx.php . не забудьте использовать sudo перед использованием команды в скрипте php.

В вашей проблеме добавьте команды, которые вы хотите использовать, в step no (2.) , когда я добавляю и изменяю ваш php-скрипт как то, что ты хочешь.

Попробуйте указать весь путь к двоичному файлу php. Например, /usr/bin/php

Если вы этого не знаете, найдите его, используя: which php

Ограничивает ли ваш php.ini доступный набор команд?

Это из моего /etc/php5/php.ini

Как отлаживать проблемы shell_exec

ОК, здесь у нас есть проблема: какая-то вещь работает в терминале и не работает в php's shell_exec (или exec, spawn, что угодно). Давайте подумаем: в чем разница между вами и php? Вот три:

Действительно, ваш терминал работает от пользователя yourname , а php выполняется из www-data . Итак, первая идея - открыть терминал из пользователя www-data и попробовать ту же команду. Так .

PHP выполняется с PHP .

PHP является параноидальным enogh, и есть много опций в конфигурации apache /nginx и php.ini, которые могут нарушить вашу попытку.

Это немного сложнее для отладки. Здесь есть два варианта:

Включить журналы в браузере и увидеть проблему. Измените свой php.ini , включите display_errors и все другие флаги, чтобы увидеть ошибки в браузере. Они могут читать и отлаживать их.

Получить www-data 'shell (см. первый раздел) и выполнить что-то вроде

echo '<?php shell_exec("php -v"); ?>' | php

, который будет выполнять тот же php-код в консоли, и вы сможете видеть ошибки и отлаживать.

PHP выполняется из SELinux /apparmor

Selinux и apparmor - это вещи безопасности, которые запрещают приложениям выполнять определенные действия (например, нерест других приложений или некоторых других приложений). Возможно, он включен на вашем сервере.

Чтобы проверить - отключите selinux /apparmor и проверьте, существует ли проблема.

я следую это руководство для развертывания моего сайта через Git, и у меня возникают некоторые проблемы с PHP shell_exec () или exec ().
Сценарий развертывания выполняет несколько команд, таких как git , whoami , which git , rsync и т. д. Все эти команды работают, когда я вошел в систему как пользователь сервера.

Однако когда я запускаю скрипт php, который должен выполнять эти команды, они не работают.
whoami: command not found

git: command not found

rsync: command not found

which: command not found

Это не жизненно важно для работы проекта, но я все еще хотел бы знать, есть ли какая-то проблема с разрешениями или что-то я делаю неправильно. У кого-нибудь есть понимание здесь?

Решение

Способ 1. Настройка переменных среды веб-сервера

Если вы используете Apache, вы можете просто отредактировать /etc/apache2/envvars включить определение переменной PATH. Отредактируйте файл и добавьте новую строку внизу (если она еще не существует):

Способ 2: настроить PATH для пользователя

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

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

(Есть много других возможных конфигураций, но они являются наиболее распространенными)

Как только вы выяснили, от какого пользователя вы работаете, вам нужно будет установить переменную PATH для этого пользователя. Это может быть так же просто, как экспорт PATH в их домашней конфигурации bash. Это могло быть /home/bob/.bashrc например. Однако пользователи услуг без дома будут другими.

Способ 3: объявите PATH в вашем скрипте PHP

Вы можете вручную указать переменную PATH в своем скрипте PHP. Это можно сделать, добавив следующую строку в ваш скрипт:

Вам нужно будет изменить PATH в соответствии с вашими потребностями, и он должен быть объявлен до того, как вы позвоните shell_exec() ,

Этот метод не является предпочтительным, так как вам нужно будет указать это для каждого скрипта PHP, который вы выполняете, который использует shell_exec() вызов двоичных файлов за пределами /bin , но это быстрое решение, которое будет работать.

Что еще более важно, вы пишете код, который не является переносимым и зависит от конкретной системы. Это плохая практика кодирования и не рекомендуется / не одобряется.

Этот код работал на машине Windows, но он не работает на сервере Linux. Код таков:

3 ответа

У меня есть сервер linux под управлением ubuntu 10.10 maverick с установленными apache и php, в каталоге /var/www у меня есть каталог загрузки. Я использовал менеджер OSFile и модифицировал его, чтобы включить функцию в файлы split вот код: function spl($fname)< global $folder; if (!$fname == )

У меня проблема Java Runtime.getRuntime().exec() . Я запускаю свое приложение java на Linux, и мне просто нужно выполнить базовую задачу: скопировать и переименовать файл с помощью команды cp . Однако, похоже, это не работает. Это мой кусок кода для вызова Runtime.getRuntime().exec() : String.

Существуют (возможно, непреодолимые) трудности при попытке выполнить команды sudo из сценария PHP и из внешнего сценария, вызываемого PHP на машинах с поддержкой SELinux.

Убедитесь, что вы используете путь к каталогу Linux в своей команде

Linux не позволит apache изменить идентификатор группы процесса по умолчанию.

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

Очевидно, что он не работает на Linux. Команда pushd определена только в windows shell. Путь на linux должен использовать прямую, а не обратную косую черту в качестве разделителя.

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

Вывод команды отображается в $output,, так как вы используете форму exec(command, output, return) .

К сожалению, нет версии exec() , которая читала бы stderr.

Вы можете объединить оба вывода в $output , добавив 2>&1 в конце команды shell:

Если вы хотите написать что-то более строгое, что рассматривает stdout и stderr отдельно, вам нужно будет использовать proc_open() вместо: PHP StdErr после Exec()

Похожие вопросы:

Возможный Дубликат : Как заставить трубы работать с Runtime.exec()? Здравствуйте, я написал простую функцию java с помощью команды exec. Эта функция проверяет наличие шрифта в системе (linux).

Я использую exec для запуска фонового сценария , подобного этому : $command = /usr/local/bin/php public_html/r/index.php tools $action process $params > /dev/null &; exec($command); Дело в.

Я использую функцию exec() для запуска моих команд на сервере centos. Все работало нормально, пока я не использовал команду: $command= ffmpeg-I вход video.mp4 - VF fade=out:0:5 output.mp4 Команда в.

У меня есть сервер linux под управлением ubuntu 10.10 maverick с установленными apache и php, в каталоге /var/www у меня есть каталог загрузки. Я использовал менеджер OSFile и модифицировал его.

У меня проблема Java Runtime.getRuntime().exec() . Я запускаю свое приложение java на Linux, и мне просто нужно выполнить базовую задачу: скопировать и переименовать файл с помощью команды cp .

Я использую сервер linux от cPanel. Теперь мне нужно использовать одну из команд linux для запуска. И команда 'timeout'. Моя команда-это что-то, как показано ниже $timeout 2s ./myexecutable <.

Модуль child_process node.js не может распознать команду linux 'rm'. Я использую его как var exec = require('child_process').exec; var child = exec('rm ' + ImgDir + '/formatted-*', function(error.

Я конвертирую файл документа в html. Я установил LibreOffice на сервер Linux. Вот вам и команда, $cmd = libreoffice4.1 --headless -convert-to html /var/www/html/CV.doc -outdir /var/www/html/; Эта.

Это очень специфическая проблема, и я нигде не смог найти ни единой зацепки. Итак, я использую Runtime.getRuntime().exec() для вызова множества различных команд Linux из моей программы Java.

Я пытаюсь пинговать IP с помощью функции exec, чтобы узнать, пингуется ли IP или нет, она полностью работает на localhost и возвращает выходной массив, но когда я запускаю ее на сервере, она.

Читайте также: