在C#中使用pscp通过邮件请求

时间:2017-05-05 18:18:45

标签: c# .net ssh putty scp

我一直在尝试通过C#代码传输文件,但它似乎不起作用。虽然命令提示符中的以下行正常工作。

"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"/>

发出帖子请求时,它的Http代码是200,但文件没有移动到linux服务器。我不确定这里出了什么问题。

2 个答案:

答案 0 :(得分:1)

首先,使用外部应用程序进行SCP上传是错误的。

使用一些原生的.NET SCP实现。请参阅SCP for C#

无论如何,一个明显的问题是你的命令不包括-hostkey开关。您需要验证SSH主机密钥指纹。如果您曾与PuTTY / PSCP连接,则系统会提示您验证主机密钥。如果您这样做,验证的主机密钥将缓存在Windows注册表中。这就是您使用本地帐户在本地计算机上执行代码的原因。

但是如果您在另一台计算机上运行该代码或使用其他帐户,则由于主机密钥未在那里验证,因此无法正常运行。

您应该在-hostkey switch中加入主机密钥指纹。

答案 1 :(得分:0)

我无法发送文件的原因是应用程序池标识是默认的,我不得不将其更改为我的用户名。

虽然我决定不使用pscp而是使用ssh.net库。非常感谢Martin Prikryl