Javascript SSH命令在终端中工作,但在nodejs/ssh2中失败
在终端中,如果我使用ssh登录并运行类似于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 =
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启动终端会话,并以某种方式重新键入命令:(