首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 使用 PSFTP 實現 SFTP 文件上傳完整指南

     編輯:關於C語言

什麼是 SFTP?

SFTP(SSH File Transfer Protocol)是一種基於 SSH 協議的安全文件傳輸協議,提供加密傳輸通道,確保數據在傳輸過程中的機密性和完整性。類似於 HTTPS 之於 HTTP,SFTP 是 FTP 的安全增強版本。

專案背景與工具選擇

在某個跨國專案中,需要將本地數據文件打包後通過 SFTP 傳輸至德國伺服器。為了實現自動化上傳,選擇了輕量級的開源工具 PSFTP(PuTTY 套件中的命令列 SFTP 客戶端)。PSFTP 是一個綠色單一 EXE 檔案,無需安裝,且在 C# 中透過 Process 類即可輕松調用,適合封裝為可重用元件。

PSFTP 常用命令速查

PSFTP 採用類 Unix 命令風格,直觀易學。以下為核心命令示意圖:

PSFTP 基本命令

常用命令包括:open(連線)、put(上傳)、get(下載)、cd(切換遠端目錄)、lcd(切換本地目錄)、quit(離開)等。

C# 封裝 PSFTP 實現自動化上傳

核心思路

  1. 動態生成批次腳本檔(.scr),包含連線、切換目錄、上傳文件、退出等指令。
  2. 配置 ProcessStartInfo,指定 PSFTP 路徑、參數(使用者、密碼、埠號、批次檔路徑等)。
  3. 啟動進程,透過標準輸入發送 y 確認首次連線的金鑰提示。
  4. 讀取標準輸出與錯誤輸出作為執行結果,最後清理臨時腳本檔。

關鍵程式碼實現

1. 上傳主邏輯

public string Upload()
{
    string outPutMessage = "";
    string scriptLocation = this.CreateScriptFile(); // 生成腳本檔

    ProcessStartInfo processInfo = new ProcessStartInfo
    {
        FileName = this.m_ShellCommand, // PSFTP.exe 路徑
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardError = true,
        RedirectStandardInput = true,
        RedirectStandardOutput = true
    };

    // 組裝命令列參數
    string arguments = $"{this.m_UserID}@{this.m_ServerName} ";
    arguments += $"-pw {this.m_PassWord} ";
    arguments += $"-P {this.m_Port} ";
    arguments += $"-b {scriptLocation} ";
    arguments += "-be"; // 遇錯不中斷
    processInfo.Arguments = arguments;

    using (Process process = new Process { StartInfo = processInfo })
    {
        try
        {
            process.Start();
            // 自動應答首次連線的金鑰確認提示
            process.StandardInput.WriteLine("y");

            outPutMessage += process.StandardOutput.ReadToEnd();
            outPutMessage += process.StandardError.ReadToEnd();
            process.WaitForExit();
            return outPutMessage;
        }
        catch (Exception ex)
        {
            throw new Exception("上傳文件至遠端伺服器時發生錯誤!", ex);
        }
        finally
        {
            File.Delete(scriptLocation); // 清理臨時腳本
        }
    }
}

2. 動態生成批次腳本檔

private string CreateScriptFile()
{
    StringBuilder sbdScript = new StringBuilder();
    // 切換到遠端目標目錄
    sbdScript.AppendLine($"cd {this.m_RemoteLocation}");

    // 遍歷上傳文件列表,生成 put 命令
    foreach (string file in this.m_UploadFiles)
    {
        sbdScript.AppendLine($"put {file}");
    }

    // 結束會話
    sbdScript.Append("quit");

    // 寫入臨時檔案
    string scriptLocation = Path.Combine(this.m_TempLocation, $"{Guid.NewGuid()}.scr");
    File.WriteAllText(scriptLocation, sbdScript.ToString());
    return scriptLocation;
}

參數說明圖示

以下圖片展示了 ProcessStartInfo 關鍵屬性的配置細節:

ProcessStartInfo 參數配置

優化建議與注意事項

  • 安全性:避免在程式碼中硬編碼密碼,建議使用安全儲存機制(如 Windows Credential Manager、Azure Key Vault)。
  • 錯誤處理:解析 PSFTP 輸出日誌,識別具體錯誤碼(如連線失敗、權限不足、磁碟空間不足),實施重試或告警機制。
  • 效能:大量小文件上傳時,考慮打包壓縮後再傳輸,減少命令交互開銷。
  • 替代方案:若專案允許引入第三方庫,推薦使用 SSH.NET(Renci.SshNet)等純托管庫,無需外部依賴,程式碼更優雅且跨平台。

總結

透過 C# Process 類調用 PSFTP,配合動態腳本生成,可快速構建穩定的 SFTP 自動化上傳功能。此方案部署簡單、依賴輕量,適合無法安裝完整 SSH 套件或需快速落地的場景。隨著 .NET Core / .NET 5+ 的普及,建議新專案優先評估原生托管庫以獲得更好的可維護性與跨平台能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved