簡體   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