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

3
我希望使用SharpSSH将文件上传到SFTP服务器。
我已经拥有了SharpSSH.dll、需要上传的文件、公钥以及已向服务器发送私钥。他们给了我一个用户名,不需要密码。
我尝试了以下操作:
Sftp sftp = new Sftp(ip, user);
sftp.Connect();
sftp.Put(filePath, toPath);
sftp.Cancel();

这里需要一个HostKey吗?如果需要,我应该把它放在哪里?如何从.ppk文件中创建一个HostKey?请注意不要删除任何HTML标签。


你好,sftp.Put toPath的格式是什么?我已经连接到我的sftp服务器,但我无法上传到服务器上的特定文件夹。 - user3868544
我认为你的意思是将公钥上传到服务器上,并将私钥保留在运行C#代码的机器上。 - Cristian Ciupitu
2个回答

1
首先,你的关键术语是相反的,或者至少我希望它们是。你发送公钥,将私钥保持安全可靠。
除此之外,是的,使用SharpSSH需要包括私钥位置。
sftp.AddIdentityFile("path/to/identity/file");

如果您的密钥有密码,则使用重载版本,即:
sftp.AddIdentityFile("path/to/file", "password");

我认为关键文件本身需要使用OpenSSH格式。

我也不确定你是否应该包含sftp.Cancel(); 在try/catch/finally块中将您的连接和Put命令封装起来,并在finally块中调用sftp.close(),这样不是更好吗?


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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接