Node交互式的SFTP上傳實現過程剖析

背景

由於業務的原因,我們日常的測試環境,都是通過腳本,將本地打包的代碼,進行SFTP上傳到對應的測試機目錄的(這個業務在測試環境沒有CI/CD)。

最近由於安全問題,測試機的權限被收緊瞭,需要進行交互式的SFTP(即上傳時需要用到令牌做二次校驗)。

存在問題

此項目用的 ssh2-sftp-client 作為SFTP上傳插件,主要是通過自定義的webpack-plugin,在構建完之後進行SFTP上傳。

因為原來的stfp配置,是不支持交互式SFTP的,導致運維修改安全策略後,我們無法通過構建命令直接上傳測試機,隻能通過SFTP工具進行拖拽上傳,相當影響工作效率

查閱資料

通過ssh2-sftp-client的文檔,發現是沒有交互式相關的配置的。而ssh2-sftp-client是基於ssh2的,通過查閱ssh2的文檔,發現是支持type:keyboard-interactive(交互式鏈接的類型)的。

然後就發現有ssh2-sftp-client 存在以下issue:

Whether to support keyboard-interactive parameters

作者描述:

You can add any event listener you want with the on() method, so you should be able to setup keyboard interaction listeners that will gather the information. You will also need to set the tryKeyboard property to true in the connect config object.

意思就是,因為插件是base ssh2 的,我們可以用ssh2對象的事件監聽,然後我們在配置鏈接時,也可以通過配置來進行鏈接配置。

最後的實現

我們將上傳拆分成三個步驟

  • 安全令牌詢問
  • 交互式校驗監聽
  • 創建交互式類型鏈接
//引用 ssh2-sftp-client庫
const Client = require('ssh2-sftp-client')
// 第一步詢問令牌
const { interactivePassword } = await inquirerList.interactivePassword()
    if (!interactivePassword) {
      throw new Error('請輸入校驗令牌')
    }
let sftp = new Client()
// 交互式校驗監聽
sftp.on('keyboard-interactive', function(
  name,
  instructions,
  instructionsLang,
  prompts,
  finish
) {
  finish([interactivePassword]) //將第一步的令牌填入
})
//創建交互式類型鏈接
await sftp.connect({
  type: 'keyboard-interactive', //設置類型
  tryKeyboard: true,
  host: 'xxxxx',
  port: 'xxxxx',
  username: 'xxxxx',
  password: 'xxxxx',
})

總結

通過上述代碼,就能夠通過node實現交互式的SFTP功能

參考文獻

ssh2-sftp-client issue#327

ssh2的github倉庫

以上就是Node交互式的SFTP上傳實現過程剖析的詳細內容,更多關於Node交互式SFTP上傳的資料請關註WalkonNet其它相關文章!

推薦閱讀: