繁体   English   中英

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

[英]SSH command works in terminal, but fails with nodejs / ssh2

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

尝试使用sudo service..但它是一样的。

有些命令确实有效,例如uptimeifconfig ,但 service 没有,我需要那个。 我连接的服务器是一个运行 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'
});

终端输出的屏幕截图, which

武侠

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

比较echo $PATH;结果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);
});

如果您收到command not found错误,则仅表示您的命令(在本例中为service )未在环境的$PATH

要么为连接正确设置环境,要么为命令使用绝对路径。

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

您可以使用which命令找到可执行文件的路径,例如which servicewhich systemctl

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM