簡體   English   中英

Node.js 的 SSH2 問題

[英]SSH2 issues wiht Node.js

我得到了這段代碼,它似乎正在工作,但它沒有。

let REMOTE_SSH_HOST = '190.444.01.75:55554'
let REMOTE_SSH_USERNAME = 'olec'
let REMOTE_SSH_PASSWORD = 'm3uW4jkbaEwVChklFszpbm4'
const Client = require('ssh2-sftp-client');
const sshConfig = {
    host: process.env.REMOTE_SSH_HOST,
    //port: 22,
    username: process.env.REMOTE_SSH_USERNAME,
    password: process.env.REMOTE_SSH_PASSWORD,
    readyTimeout: 99999,
};
let sftp = new Client();

async function Read(directory) {
    console.log('Read(' + directory + ')');
    const result = await sftp.list(directory);
    for(const sub of result) {
      if (sub['type'] === 'd') {
          await Read(directory + '/ ' + sub['name']);
      }
    }
}

async function main(directory) {
  try{
    const myList = await sftp.list(directory);
    }catch(err){console.log(err)}//NEVER forget to catch
    finally {
        console.log('Closing session...');
        await sftp.end();
        console.log('Session closed.');
    }
}
console.log('Application started');
main('/home/user/path').then(r => {
    console.log('Application ended.');
});

我收到以下錯誤消息:

(使用node --trace-warnings...顯示警告的創建位置)(節點:16240) UnhandledPromiseRejectionWarning:未處理的 promise 拒絕。 此錯誤源於在沒有 catch 塊的情況下拋出異步 function 內部,或拒絕未使用.catch() 處理的 promise。 要終止未處理的 promise 拒絕的節點進程,請使用 CLI 標志--unhandled-rejections=strict (請參閱https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode )。 (拒絕 ID:5)(節點:16240)[DEP0018] DeprecationWarning:不推薦使用未處理的 promise 拒絕。 將來,未處理的 promise 拒絕將使用非零退出代碼終止 Node.js 進程。

我想你可能需要類似的東西

const sftp = new Client();
await sftp.connect({
  host: hostAddress,
  username: '...',
  privateKey: ...,
});

問題是您正在使用設置了 consts 的環境變量。 (您也將 consts 設置為讓...永遠不要使用讓某些東西永遠不會改變的地方。

const Client = require('ssh2-sftp-client');
const REMOTE_SSH_HOST = '190.444.01.75'
const REMOTE_SSH_PORT = '55554';
const REMOTE_SSH_USERNAME = 'olec'
const REMOTE_SSH_PASSWORD = 'm3uW4jkbaEwVChklFszpbm4'
const sshConfig = {
    host: REMOTE_SSH_HOST,
    port: REMOTE_SSH_PORT,
    username: REMOTE_SSH_USERNAME,
    password: REMOTE_SSH_PASSWORD,
    readyTimeout: 99999,
};

Thnx 會試試這個並回復你!

您的腳本中存在一系列導致問題的錯誤。 主要問題是您沒有處理async代碼中的錯誤。 您應該在main調用中添加一個catch鏈 function,因為即使您在main function 中使用try/catch子句,它也不會考慮在finally塊中運行的代碼。

另一方面,您的代碼似乎失敗了,因為您在運行sftp.list之前正在運行sftp.connect

有幾個小錯誤可能會導致腳本出現問題:

  1. 地址190.444.01.75不是有效的 IPv4 地址。
  2. 在讀取env的環境變量時,您應該提供默認值。
  3. 您還沒有真正使用Read function,但我建議您以小寫字母命名函數。
  4. 您正在使用constRead function 中聲明for-of循環的變量。 最好使用let代替,因為引擎會在每次迭代時更新它。

這是一個修改后的腳本示例:

const Client = require('ssh2-sftp-client')

/**
 * Global variables
 */
const SSH_CONFIG = {
  host     : process.env.REMOTE_SSH_HOST     || '190.44.1.75:55554',
  port     : process.env.REMOTE_SSH_PORT     || 22,
  username : process.env.REMOTE_SSH_USERNAME || 'olec',
  password : process.env.REMOTE_SSH_PASSWORD,
  readyTimeout: 99999,
}
const ROOT = process.env.ROOT || '/home/user/path'

/**
 * Constructors
 */
const sftp = new Client()

/**
 * Main
 */
console.log("Application Started!")
main(ROOT)
  .then ((response) => console.log(response))
  .catch((err)      => console.error(err))

/**
 * Functions
 */
async function main(directory) {
  let myList
  try {
    await sftp.connect(SSH_CONFIG)
    return await sftp.list(directory)
  } catch(err) {
    console.error(err)
  } finally {
    console.log('Closing session...')
    await sftp.end()
    console.log('Session closed.')
  }
}

這就是你如何稱呼它:

env REMOTE_SSH_HOST=10.0.0.10 \
env REMOTE_SSH_USERNAME=conatel \
env REMOTE_SSH_PASSWORD=C0n4t3lC0n4t3l \
env REMOTE_SSH_PORT=22 \
env ROOT=/home/conatel \
node ssh.js

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM