如何使用SharpSSH将文件上传到SFTP服务器

时间:2012-11-15 14:51:15

标签: c# sftp sharpssh

我想使用SharpSSH将文件上传到SFTP服务器。

我得到SharpSSH.dll,要上传的文件,公钥,我将私钥发送到服务器。他们给了我一个用户名,不需要密码。

我试过了:

Sftp sftp = new Sftp(ip, user);
sftp.Connect();
sftp.Put(filePath, toPath);
sftp.Cancel();

我在这里需要一个HostKey吗?如果是的话,我需要把它放在哪里,如何从.ppk文件中创建一个?

2 个答案:

答案 0 :(得分:1)

首先,您的关键术语是从前到后,或者至少我希望它们是。您发送公钥,并保持私钥安全。

除此之外,是的,使用SharpSSH,您需要包含私钥位置。

sftp.AddIdentityFile("path/to/identity/file");

如果您的密钥有密码,请使用重载版本,即

sftp.AddIdentityFile("path/to/file", "password");

我认为密钥文件本身需要采用OpenSSH格式。

我也不确定你是否包含sftp.Cancel(); 将connect和Put命令封装到try / catch / finally块中并在finally块中调用sftp.close()会不会更好?

答案 1 :(得分:0)

这是我的解决方案:

using Tamir.SharpSsh;
using Tamir.SharpSsh.jsch;

方法代码:

public static bool SftpFile(string ftpAddress, string username, string password, string port, string folderPath, string filename, string separator, string keyFilename, string keyPassword)
{
    bool Success = false;
    Sftp sftp = null;
    try
    {

        if (filename.Length > 0 && dt != null)
        {
            //Send file

            int NumberOfConnectionAttempts = 0;

        JumpPoint:

            try
            {
                sftp = new Sftp(ftpAddress, username);

                sftp.Password = password;

                sftp.AddIdentityFile(keyFilename, keyPassword);

                // non-password alternative is sftp.AddIdentityFile(keyFilename);

                sftp.Connect();

                sftp.Put(filename + ".csv", (!String.IsNullOrWhiteSpace(folderPath) ? folderPath + "/" : "") + filename + ".csv");

                Success = true;

            }
            catch (Exception ex)
            {
                Program.DisplayText(" Connection " + NumberOfConnectionAttempts + " failed.\n");

                if (NumberOfConnectionAttempts < Program.IntTotalAllowedConnectionAttempts)
                {
                    NumberOfConnectionAttempts++;

                    Thread.Sleep(1000);

                    goto JumpPoint;

                }
                else
                {
                    //Program.HandleException(ex);

                }
            }
        }

    }
    catch (Exception ex)
    {
        //Program.HandleException(ex);
    }
    finally
    {
        //Close sftp

        try { sftp.Close(); }
        catch { }

        try { sftp = null; }
        catch { }

        try { GC.Collect(); }
        catch { }

    }
    return Success;
}

用法示例:

string FtpAddress = "??.??.??.??";

string Port = "21";

string Username = "my-username";

string Password = "P455w0rd";

string FolderPath = "folder-name\\"; 

string Filename = "filename.foo";

string KeyFilename = "keyFilename.bar";

string KeyPassword= "K3yP455w0rd";

if (SftpFile(FtpAddress, Username, Password, Port, FolderPath, Filename, ",", KeyFilename, KeyPassword))
{
    /* Success */

}
else
{
    /* Error */

}