Javascript SSH命令在终端中工作,但在nodejs/ssh2中失败

Javascript SSH命令在终端中工作,但在nodejs/ssh2中失败,javascript,node.js,linux,ssh,openwrt,Javascript,Node.js,Linux,Ssh,Openwrt,在终端中,如果我使用ssh登录并运行类似于service something reload的命令,它会正常运行,但当我在带有ssh2库的nodejs脚本中执行相同的命令(.exec函数)时,它不会运行,并且我会收到一个错误“ash:command not found” 尝试了sudo服务..但都是一样的 有些命令确实可以正常工作,比如uptime或ifconfig,但服务不行,我需要那个命令。我连接的服务器是一个运行open wrt的路由器 这是nodejs脚本: const Client =

在终端中,如果我使用ssh登录并运行类似于
service something reload
的命令,它会正常运行,但当我在带有ssh2库的nodejs脚本中执行相同的命令(
.exec
函数)时,它不会运行,并且我会收到一个错误“ash:command not found”

尝试了
sudo服务..
但都是一样的

有些命令确实可以正常工作,比如
uptime
ifconfig
,但服务不行,我需要那个命令。我连接的服务器是一个运行open 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'
});
终端输出的屏幕截图,其中

您会得到“bash命令未找到错误”。因为您的路径不包括服务可执行文件的位置


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

您必须传递一个选项对象,该对象包含键
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);
});

如果您收到一个
命令未找到
错误,这意味着您的命令(在本例中为
服务
)在环境的
$PATH
中找不到

或者,为连接正确设置环境,或者为命令使用绝对路径

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

您可以使用
which
命令查找可执行文件的路径,如
which service
which systemctl


对于较旧的init脚本服务,请运行
/etc/init.d/something restart

Checkout,我可以想象您的nodejs/ssh2设置使用的环境与登录终端不同。您可以执行类似于
printenv
的操作并检查结果吗?是否存在init文件?如果可以将
选项
对象与.exec()一起传递,那么将
opts.shell设置为所选shell的完整路径名会发生什么情况?
ash:printenv:not found
如果我使用ssh2执行此命令:(Milag)ssh2 exec似乎没有一个
shell
选项。有一个
shell
方法,但我认为它启动了一个交互式终端,这是我不想要的。我只需要执行一个命令,退出它不是bash,而是ash。我尝试了设置路径,但同样的事情也发生在从ssh运行
echo$path
2不起作用。它只是暂停,我必须按ctrl-c强制退出哦,你没有在
bash
上。与其复制/粘贴,不如尝试使用指针并根据你的特定环境进行调整,比如尝试安装sudo…但是如果我可以在macos终端ssh会话中执行某些操作,就应该安装它。问题是否在ssh2节点libra中ry?我不这么认为,我认为问题在于你的路径,这就是为什么看不到
sudo
。因此,你可以启用的任何调试都有助于找出错误。有趣的是,我在终端中运行了
哪个命令
,它没有显示
sudo
服务
,但显示了
ifconf的二进制路径ig
。因此,它基本上不显示在终端和nodejs中工作的命令,也不显示在终端和NodeJSY中工作的命令的路径,在其工作的终端中运行
哪个服务:-)我做了,但它什么也没显示。我认为这些命令在OpenWRT中没有二进制文件?但我不明白为什么它们在终端中工作,而不是在ssh2会话中。我对OpenWRT没有太多经验,但这听起来很奇怪,至少……它们可能只是其他可执行文件的别名,比如systemctl。试试看
哪个systemctl
相同我想我别无选择,只能用ssh2启动终端会话,并以某种方式重新键入命令:(