我想使用SharpSSH将文件上传到SFTP服务器。
我得到SharpSSH.dll
,要上传的文件,公钥,我将私钥发送到服务器。他们给了我一个用户名,不需要密码。
我试过了:
Sftp sftp = new Sftp(ip, user);
sftp.Connect();
sftp.Put(filePath, toPath);
sftp.Cancel();
我在这里需要一个HostKey吗?如果是的话,我需要把它放在哪里,如何从.ppk
文件中创建一个?
答案 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 */
}