从 PHP 脚本中以 WWW 数据的形式永久启动或 PM2

2022-08-30 21:21:56

我有一个名为 的脚本。nodejsscript.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);

我像往常一样运行它,但现在我也想包括或功能。当我是一切工作时,一切都很笨拙:nodejs script.jsforeverpm2root

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

问题是当我想从带有 or 函数的脚本运行脚本时:PHPsystemexec

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;

不存在的地方,只是执行后退出的一个技巧。脚本工作,运行,我可以使用.当我尝试以用户身份运行或相同的操作时,我无法从 或 关闭它,所以即使这样也不起作用。user123shellforeverforever stopallroothttp://1.2.3.4/test.phpwww-datarootwww-data

我尝试从 , , ...还是一样的。Ubuntu 14.04.3 LTSUbuntu 14.04 LTSDebian GNU/Linux 8

有什么想法吗?

谢谢。


答案 1

如果您从Apache或Web服务器中启动该过程,那么您已经是用户,因此对您已经拥有的用户上下文执行操作可能不是必需的。www-datasudo 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.logforever

如果您有时以 root 身份运行脚本,那么尝试与 www-data 相同的命令,您可能还会遇到对从以 root 身份执行创建的一个或多个文件/目录的权限,这些文件/目录现在在作为 www-data 运行时会发生冲突。


答案 2

这是PHP安全性的一部分,你说你正在从php脚本运行它,而不是你通过php脚本从Apache运行它。

PHP Web脚本不应该具有root访问权限,因为它们在与Apache用户相同的权限下运行。www-data

有一些方法可以防止php以root身份运行,但以root身份运行任务,但这有点黑客,我不打算分享代码,但我会解释,所以你可以研究它。从这里开始

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

使用这样的程序,您可以执行程序。就像你的 via nodeJS 使用 SUDO,然后读取 stdOut 和 stdErr 等待密码请求,然后通过写入 stdIn 来提供它。script.js

不要忘记,在执行此操作时,用户必须有密码并在sudoers列表中www-data

根据OP注释 由于SUDO的工作方式,PATH似乎不包含节点可执行文件的路径,因此您最好构建.sh(bash脚本)并使用sudo来运行它。npm, node

您仍然需要监视此过程,因为它仍会要求输入密码

#!/bin/bash
sudo -u ec2-user -i
# change this to the path you want to run from
cd ~
/usr/local/bin/pm2 -v 

推荐