SSH 命令在终端中有效,但在 nodejs / ssh2 中失败
SSH command works in terminal, but fails with nodejs / ssh2
在终端中,如果我使用 ssh 登录并 运行 一个像 service something reload
这样的命令,它 运行 很好,但是当我使用 ssh2 在 nodejs 脚本中执行相同的命令时库(.exec
函数)它没有 运行 并且我收到错误消息“ash:找不到命令”。
用 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
。
在终端中,如果我使用 ssh 登录并 运行 一个像 service something reload
这样的命令,它 运行 很好,但是当我使用 ssh2 在 nodejs 脚本中执行相同的命令时库(.exec
函数)它没有 运行 并且我收到错误消息“ash:找不到命令”。
用 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
。