2017-05-05 142 views
0

我一直在試圖通過C#代碼傳輸文件,但似乎並不奏效。儘管命令提示符中的以下行可以正常工作。在C#中使用pscp在windows和linux之間通過post請求進行文件傳輸

"C:\Program Files (x86)\PuTTY\pscp.exe" -l user -pw password C:\Users\user1\Desktop\\transfer1.txt 000.000.00.000:/home/doc 

通信類

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Diagnostics; 
using System.Linq; 
using System.Threading.Tasks; 

namespace Server.Controllers 
{  
    public class ComLinux 
    { 
     public static string TransferFilesToSever(string args) 
     { 
     Process p = new Process(); 

     p.StartInfo.FileName = @"C:\Program Files (x86)\PuTTY\pscp.exe"; 
     p.StartInfo.Arguments = args; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardInput = true; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.CreateNoWindow = false; 
     p.Start(); 
     string output = p.StandardOutput.ReadToEnd(); 
     p.WaitForExit(); 
     return "Done"; 
    }}} 

和SendFilesController看起來像

using Microsoft.AspNetCore.Mvc; 
using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.IO; 
using System.Linq; 
using System.Threading.Tasks; 

namespace Server.Controllers 
{ 
    [Route("api/[controller]")] 
    public class SendFilesController : Controller 
    { 
     [HttpPost] 
     public IActionResult Post([FromBody] string cmdTostart) 
     { 
     var WindowsPath = ConfigurationManager.AppSettings["WindowsPath"].ToString(); 
     var LinuxPath = ConfigurationManager.AppSettings["LinuxPath"].ToString(); 
     var LinuxUserPass = ConfigurationManager.AppSettings["LinuxUserPass"].ToString(); 
     var WindowcommandtoL = LinuxUserPass + " " + WindowsPath + "transfer1.txt" + " " + LinuxPath; 
     var resultw = ComLinux.TransferFilesToSever(WindowcommandtoL); 
     return Content("OK"); 
    }}} 

而在app.config中,我有

<add key="LinuxUserPass" value="-l user -pw password"/> 
<add key="WindowsPath" value="C:\Users\user1\Desktop\"/> 
<add key="LinuxPath" value="000.00.000://home/doc"/> 

當POST請求製作,Ithe Http代碼是200但是該文件沒有移動到Linux服務器。我不確定這裏發生了什麼問題。

+1

爲什麼使用putty代替[SSH.NET](https://sshnet.codeplex.com/)? – mason

+2

'p.ExitCode'的值是什麼? 'output'的價值是什麼? –

+0

@JacobKrall當我通過IIS Express在調試模式下在localhost:49595上運行代碼時,該代碼似乎工作正常。但是,一旦我將其發佈到網站上,它就無法正常工作。 – anse15

回答

1

首先,使用外部應用程序進行SCP上傳是錯誤的。

改爲使用一些本地.NET SCP實現。見SCP for C#


無論如何,一個明顯的問題是,您的命令不包括-hostkey開關。您需要驗證SSH主機密鑰指紋。如果您曾經連接過PuTTY/PSCP,則系統會提示您驗證主機密鑰。如果你這樣做,驗證的hostkey被緩存在Windows註冊表中。這就是您的代碼在您的本地計算機上使用本地帳戶執行時的原因。

但是,如果您在另一臺計算機上運行代碼或使用其他帳戶,它將無法正常工作,因爲主機密鑰沒有在那裏驗證。

您應該在您的主機密鑰指紋中包含-hostkey switch

+1

感謝您的回答。我使用pscp,因爲我還需要plink在Linux服務器上運行一些命令。我有另一個問題。對於主機密鑰,pscp已將其緩存在註冊表中,我不知道如何轉換註冊表項,這是一個巨大的字符串,如0x10001,0xae ..可以舉例說明如何指定緩存的主機密鑰? – anse15

+0

*「我正在使用pscp,因爲我還需要plink來在Linux服務器上運行一些命令。」* - 您需要如何運行與PSCP/SCP相關的命令?所有/大多數SCP庫都是通用的SSH庫,所以它們當然也支持執行命令! –

+0

你是對的。我只是使用pscp,因爲它帶有plink。我可能會轉移到SharpSSH – anse15

0

我無法發送文件的原因是應用程序池標識是默認的,我不得不將其更改爲我的用戶名。

雖然我決定不使用pscp而是使用ssh.net庫。非常感謝Martin Prikryl

相關問題