Starten von FOREVER oder PM2 als WWW-DATA aus einem PHP-Skript


Answers

Dies ist Teil der PHP-Sicherheit, die Sie sagen, dass Sie es von einem PHP-Skript ausführen und nicht von Ihrem Apache über ein PHP-Skript.

PHP-Web-Skripte sollten keinen Root-Zugriff haben, da sie unter den gleichen Berechtigungen wie der Apache-Benutzer www-data laufen.

Es gibt Möglichkeiten, zu verhindern, dass php als root ausgeführt wird, aber eine Aufgabe als root ausführt, aber es ist ein bisschen hacky und ich werde den Code nicht teilen, aber ich werde erklären, damit du dich damit befassen kannst. Hier ist, wo ich anfangen soll

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

Mit einem Prozess wie diesem können Sie dann einen Prozess ausführen. Wie Ihre script.js über nodeJS mit Hilfe von SUDO und dann stdOut und stdErr auf Passwort-Anfrage warten, dann geben Sie es durch Schreiben von stdIn für diesen Prozess.

Vergessen Sie dabei nicht, dass der Benutzer www-data ein Passwort haben muss und sich in der Sudoers-Liste befindet

Question

Ich habe ein nodejs Skript namens script.js .

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

Ich benutze es normalerweise wie nodejs script.js , aber jetzt möchte ich für forever oder pm2 Funktionalitäten auch pm2 . Wenn ich root bin, funktioniert alles reibungslos:

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

Das Problem ist, wenn ich das Skript von einem PHP Skript mit den system oder exec Funktionen ausführen möchte:

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 

Warum das? Wie kann ich das lösen?

Ich habe auch einen Trick gemacht, einen Benutzer 'forever2' erstellt, ich habe ein script.sh mit diesem Inhalt erstellt:

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;

wo user123 nicht existiert, ist nur ein Trick, um die shell nach der Ausführung zu verlassen. Das Skript funktioniert, läuft forever , ich kann alle Forever mit dem Befehl forever stopall von root . Wenn ich das gleiche versuche, indem ich http://1.2.3.4/test.php oder als www-data user benutze, kann ich es nicht von root oder www-data , also funktioniert das nicht einmal.

Ich habe versucht von Ubuntu 14.04.3 LTS , Ubuntu 14.04 LTS , Debian GNU/Linux 8 ... immer noch das Gleiche.

Irgendwelche Ideen?

Vielen Dank.