Nodejs exec问题

Nodejs exec问题

我使用sudo node运行node代码, 运行到 var exec = require(‘child_process’).exec; cmd = '/home/usr/script/setup.sh’ exec(cmd, function callback(error, stdout, stderr) { console.log(stdout);
}); 运行不下去,但是我直接在终端运行cmd就可以,为什么啊,求助

7 回复

Node.js exec 问题

你在使用 sudo node 运行 Node.js 代码时遇到问题。你尝试执行一个 shell 脚本 /home/usr/script/setup.sh,但发现脚本无法正常执行。然而,当你直接在终端中运行该命令时,它却可以正常工作。

问题分析

出现这种情况的主要原因可能是权限和环境变量的问题。当使用 sudo 运行 Node.js 脚本时,虽然它会以 root 用户身份运行,但环境变量可能与普通用户登录时的环境变量不同。这可能导致某些依赖于特定环境变量的脚本无法正常运行。

示例代码

下面是一个简单的示例代码,演示如何使用 exec 来执行 shell 脚本,并且确保所有必要的环境变量都被传递:

const { exec } = require('child_process');

// 定义要执行的命令
const cmd = '/home/usr/script/setup.sh';

// 使用 exec 执行命令
exec(cmd, { env: process.env }, (error, stdout, stderr) => {
    if (error) {
        console.error(`执行出错: ${error}`);
        return;
    }
    console.log(`stdout: ${stdout}`);
    console.error(`stderr: ${stderr}`);
});

在这个例子中,我们显式地将当前进程的环境变量 (process.env) 传递给 exec 函数,这样可以确保执行的 shell 脚本能够访问到与普通用户相同的环境变量。

解决方法

  1. 检查环境变量:确保脚本需要的所有环境变量都已正确设置。
  2. 调试输出:在脚本中添加调试信息,检查是否所有依赖项都可用。
  3. 使用 sudo -E:如果你确定需要以 root 用户身份运行脚本,并且希望保留用户的环境变量,可以尝试使用 sudo -E 命令来运行 Node.js 脚本:
    sudo -E node your-script.js
    

通过上述方法,你应该能够解决使用 sudo node 时遇到的问题。如果问题依然存在,建议检查脚本本身是否有其他依赖项或权限问题。


console.log(error, stdout,stderr);

全部打印出来看看

  1. 打印出来就是没有运行成功,我估计可能是因为脚本的原因

  2. 我使用了expect 提示没有连接成功 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the RSA key sent by the remote host is 8f:7a:50:a5:0a:4c:cf:cd:51:55:2a:80:2d:35:7e:b7. Please contact your system administrator. Add correct host key in /root/.ssh/known_hosts to get rid of this message. Offending RSA key in /root/.ssh/known_hosts:1 remove with: ssh-keygen -f “/root/.ssh/known_hosts” -R 192.168.1.1 RSA host key for 192.168.1.1 has changed and you have requested strict checking. Host key verification failed. lost connection

  3. 运行node不使用sudo 就可以运行成功

怎么感觉是你的sh文件的问题呢? 你试试 使用sodo /home/usr/script/setup.sh 看能不能执行

是吧,sudo运行直接报错了

Add correct host key in /root/.ssh/known_hosts to get rid of this message. Offending RSA key in /root/.ssh/known_hosts:1 remove with: ssh-keygen -f “/root/.ssh/known_hosts” -R 192.168.1.1 RSA host key for 192.168.1.1 has changed and you have requested strict checking. Host key verification failed.

看你异常里说明,sodo命令会使用root权限执行程序 并且使用root的环境配置,估计你的登录用户和root用户在ssh处的配置不同 检查下吧

当你使用 exec 调用外部命令时,可能会遇到权限或环境变量的问题。在你的例子中,sudo node 可能没有正确传递所需的环境变量或权限给子进程。以下是一些可能的原因和解决方案:

可能的原因

  1. 环境变量sudo 运行时会清空一些环境变量,导致子进程无法访问某些必要的路径或配置。
  2. 权限问题:虽然你使用了 sudo,但子进程可能仍然缺少某些文件或目录的执行权限。

解决方案

你可以尝试通过以下方式解决这些问题:

示例代码

const { exec } = require('child_process');

// 使用 sudo 命令来确保拥有足够的权限
const cmd = 'sudo /home/usr/script/setup.sh';

exec(cmd, (error, stdout, stderr) => {
    if (error) {
        console.error(`执行出错: ${stderr}`);
        return;
    }
    console.log(`stdout: ${stdout}`);
});

详细解释

  1. 明确使用 sudo: 在命令前加上 sudo 确保有足够的权限。
  2. 检查错误处理: 在回调函数中增加错误处理逻辑,以更好地理解发生了什么。

额外提示

  • 检查日志: 查看 stderr 是否有更多关于问题的详细信息。
  • 环境变量: 如果需要特定的环境变量,可以在 exec 中设置:
    const cmd = 'env PATH=$PATH:/usr/local/bin /home/usr/script/setup.sh';
    exec(cmd, (error, stdout, stderr) => {
        // 处理逻辑...
    });
    

如果你发现这还不解决问题,请进一步检查系统日志或具体的错误信息。

回到顶部