3

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

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

我试过这个:

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

我在这里的某个地方需要一个 HostKey,如果需要,我必须把它放在哪里,以及如何从.ppk文件中制作一个?

4

2 回答 2

1

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

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

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

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

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

我相信,密钥文件本身需要采用 OpenSSH 格式。

我也不确定您是否包含 sftp.Cancel(); 将你的 connect 和 Put 命令放入 try/catch/finally 块中,并sftp.close()在 finally 块中调用不是更好吗?

于 2014-04-10T13:33:57.800 回答
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 */

}
于 2015-07-24T12:45:18.890 回答