2015-10-31 2 views
18

У меня есть сценарий nodejs с именем script.js.Запуск FOREVER или PM2 как WWW-DATA из скрипта PHP

var util = require('util'); 
var net = require("net"); 

process.on("uncaughtException", function(e) { 
console.log(e); 
}); 

var proxyPort = "40000"; 
var serviceHost = "1.2.3.4"; 
var servicePort = "50000"; 

net.createServer(function (proxySocket) { 
    var connected = false; 
    var buffers = new Array(); 
    var serviceSocket = new net.Socket(); 
    serviceSocket.connect(parseInt(servicePort), serviceHost); 
    serviceSocket.pipe(proxySocket).pipe(serviceSocket); 
    proxySocket.on("error", function (e) { 
     serviceSocket.end(); 
    }); 
    serviceSocket.on("error", function (e) { 
     console.log("Could not connect to service at host " 
      + serviceHost + ', port ' + servicePort); 
     proxySocket.end(); 
    }); 
    proxySocket.on("close", function(had_error) { 
     serviceSocket.end(); 
    }); 
    serviceSocket.on("close", function(had_error) { 
     proxySocket.end(); 
    }); 
}).listen(proxyPort); 

Я подножка это нормально, как nodejs script.js, но теперь я хочу, чтобы включить или foreverpm2 функциональности, а также. Когда я root все работает smootly:

chmod -R 777 /home/nodejs/forever/; 
-- give rights 

watch -n 0.1 'ps ax | grep forever | grep -v grep' 
-- watch forwarders (where i see if a forever is opened) 

/usr/local/bin/forever -d -v --pidFile "/home/nodejs/forever/file.pid" --uid 'file' -p '/home/nodejs/forever/' -l '/home/nodejs/forever/file.log' -o '/home/nodejs/forever/file.log' -e '/home/nodejs/forever/file.log' -a start /etc/dynamic_ip/nodejs/proxy.js 41789 1.2.3.4:44481 414 file 
-- open with forever 

forever list 
-- it is there, i can see it 

forever stopall 
-- kill them all 

Проблема заключается в том, когда я хочу, чтобы запустить сценарий из PHP сценария с system или exec функции:

sudo -u www-data /usr/local/bin/forever -d -v --pidFile "/home/nodejs/forever/file.pid" --uid 'file' -p '/home/nodejs/forever/' -l '/home/nodejs/forever/file.log' -o '/home/nodejs/forever/file.log' -e '/home/nodejs/forever/file.log' -a start /etc/dynamic_ip/nodejs/proxy.js 41789 1.2.3.4:44481 414 file 
-- open as www-data (or i can do this just by accessing `http://1.2.3.4/test.php`, it is the same thing) 

forever list 
-- see if it is there, and it is not (i see it in watch) 

forever stopall 
-- says no forever is opened 

kill PID_ID 
-- the only way is to kill it by pid ... and on another server all of this works very well, can create and kill forevers from a php script when accessing it from web ... not know why 
-- everything is in /etc/sudoers including /usr/local/bin/forever 

Почему? Как я могу это решить?

Я также сделал некоторые хитрости, создал пользователь «forever2», я создал script.sh с этим содержанием:

sudo su forever2 user123; /usr/local/bin/forever -d -v --pidFile "/home/nodejs/forever/file.pid" --uid 'file' -p '/home/nodejs/forever/' -l '/home/nodejs/forever/file.log' -o '/home/nodejs/forever/file.log' -e '/home/nodejs/forever/file.log' -a start /etc/dynamic_ip/nodejs/proxy.js 41789 1.2.3.4:44481 414 file; 

где user123 не существует, это просто уловка, чтобы выйти из shell после выполнения. Скрипт работает, работает forever, я могу закрыть все форварды командой forever stopall от root. Когда я пробую то же самое, что работает http://1.2.3.4/test.php или как www-data пользователь, я не могу закрыть его с root или www-data, так что даже это не работает.

Я попробовал от Ubuntu 14.04.3 LTS, Ubuntu 14.04 LTS, Debian GNU/Linux 8 ... все еще одно и то же.

Любые идеи?

Спасибо.

+0

Вы не можете «видеть» навсегда процессы, запущенные в качестве другого пользователя, то есть, если вы хотите 'Sudo су www-data', а затем будет «навсегда остановить» его работу. – Creynders

+0

, и если я делаю 'sudo -u www-data forever stopall', почему он не работает? – Damian

+0

Да, хороший вопрос. Единственное объяснение, о котором я могу думать, это то, что навсегда порождает дочерние процессы, и при использовании 'sudo -u' только основной процесс пытается отключиться, поскольку этот пользователь и остальные процессы закрываются как« текущий »пользователь. – Creynders

ответ

1

Если вы начинаете процесс из Apache или веб-сервера, вы уже являетесь пользователем www-data, поэтому сделать sudo su в контексте пользователя, который у вас уже есть, скорее всего не требуется.

При запуске этой задачи forever вам также может потребоваться закрыть клеммы/входы и напрямую отправить их на задний план. Что-то вроде этого:

// Assemble command 
$cmd = '/usr/bin/forever'; 
$cmd.= ' -d -v --pidfile /tmp/my.pid'; // add other options 
$cmd.= ' start'; 
$cmd.= ' /etc/dynamic_ip/nodejs/proxy.js'; 
// "magic" to get details 
$cmd.= ' 2>&1 1>/tmp/output.log'; // Route STDERR to STDOUT; STDOUT to file 
$cmd.= ' &'; // Send whole task to background. 
system($cmd); 

Теперь не будет никакого вывода здесь, но вы должны иметь что-то в /tmp/output.log, которые могли бы показать, почему forever не удалось, или сценарий разбился.

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

1

Это часть безопасности PHP, которую вы говорите, что вы используете ее из php-скрипта, и не используете его из Apache через php-скрипт.

PHP-скрипты не должны иметь корневой доступ, поскольку они работают под теми же правами, что и пользователь Apache www-data.

Есть способы предотвратить запуск php с правами администратора, но запустить задачу с правами root, но это немного взломанно, и я не буду делиться этим кодом, но я объясню, чтобы вы могли изучить его.вот где начать

http://php.net/manual/en/function.proc-open.php

С Proccess, как это вы можете затем выполнить прок. Как и ваш script.js через nodeJS, используя SUDO, а затем прочитайте stdOut и stdErr, подождите для запроса пароля, затем подайте его, написав stdIn для этого процесса.

Не забудьте в этом пользователь www-data должен иметь пароль и быть в списке sudoers

+0

доверять мне, я все испробовал ... прямо сейчас я создаю «сервер сокетов», который не будет использовать пользователя 'www-data', только для этой проблемы, представьте себе, как уродливый Тхи s получил ... – Damian

+0

Я обычно предпочитаю использовать java для такого рода вещей, php не предназначен для управления чем-либо, что является постоянным –

Смежные вопросы