SSH命令可在终端中运行,但对于nodejs / ssh2失败

时间:2020-09-19 11:37:51

标签: javascript node.js linux ssh openwrt

在终端中,如果我使用ssh登录并运行类似service something reload的命令,则该命令运行得很好,但是当我在带有ssh2库(.exec函数)的nodejs脚本中执行相同的命令时,它不会没有运行,我得到一个错误“灰:找不到命令”。

尝试过sudo service..,但这是同一回事。

有些命令可以工作,例如uptimeifconfig,但服务无效,我需要那个。我要连接的服务器是运行开放式wrt的路由器。


这是nodejs脚本:

const Client = require('ssh2').Client;
const conn = new Client();

conn.on('ready', async() => {

  conn.exec('service network reload', {
    env: {'PATH': '/usr/sbin:/usr/bin:/sbin:/bin'},
  }, (err, stream) => {
    if(err)
      return console.log(err);

    stream.on('close', () => console.log('ok'));
    stream.stderr.on('data', data => console.log(data.toString()));
  }); 

}).connect({
  host: ROUTER_HOST,
  port: 22,
  username: 'root',
  password: '1234'
});

which的终端输出的屏幕截图:

wtf

3 个答案:

答案 0 :(得分:1)

您将收到“找不到bash命令错误”。因为您的PATH不包含服务可执行文件的位置。

将ssh2中echo $PATH;的结果与您的终端进行比较。如果您的ssh2缺少某些路径,则会更新您的环境。

答案 1 :(得分:1)

您必须传递一个包含键env的选项对象,其值本身就是键值对的对象。

exec('sudo service something reload', {env: {'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:'}}, function (error, stdout, stderr) 
{
    console.log(stdout, stderr, error);
});

答案 2 :(得分:1)

如果遇到command not found错误,仅表示在环境service中找不到您的命令,在这种情况下为$PATH

要么为连接设置适当的环境,要么为命令使用绝对路径。

对于systemd服务,请使用/usr/sbin/service something reload/bin/systemctl reload something等。

您可以使用whichwhich service之类的which systemctl命令查找可执行文件的路径。

对于较早的初始化脚本服务,请运行/etc/init.d/something restart