问题描述
在终端中,如果我使用ssh登录并运行类似service something reload
的命令,则该命令运行得很好,但是当我在带有ssh2库(.exec
函数)的nodejs脚本中执行相同的命令时,它不会没有运行,我得到一个错误“灰:找不到命令”。
尝试过sudo service..
,但这是同一回事。
有些命令可以工作,例如uptime
或ifconfig
,但服务无效,我需要那个。我要连接的服务器是运行开放式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不包含服务可执行文件的位置。
将ssh2中echo $PATH;
的结果与您的终端进行比较。如果您的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 service
之类的which systemctl
命令查找可执行文件的路径。
对于较早的初始化脚本服务,请运行/etc/init.d/something restart
。