我有一个 C# .NET 项目,我正在尝试打开到服务器的 SFTP 连接并将文件放入服务器。
我有 SFTP 主机名、用户名和密钥文件(.pem 文件)。
我这里没有密码。
请帮助我在 C# 和 .Net 中使用 SFTP。
可能每个 SFTP/SSH 库都支持公钥身份验证。
例如:
var privateKey = new PrivateKeyFile(@"C:\some\path\key.pem");
var client = new SftpClient("example.com", "username", new[] { privateKey });
client.Connect();
如果私钥已加密:
var privateKey = new PrivateKeyFile(@"C:\some\path\key.pem", "passphrase");
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = "example.com",
UserName = "username",
SshHostKeyFingerprint = "ssh-rsa 2048 ...=",
SshPrivateKeyPath = @"C:\some\path\key.ppk",
};
using (Session session = new Session())
{
session.Open(sessionOptions);
// Your code
}
WinSCP 需要将密钥转换为 PPK 格式(您可以使用 WinSCP GUI 或 PuTTYgen)。另请注意,WinSCP 会验证 SSH 主机密钥 (
SshHostKeyFingerprint
)。 SSH.NET 默认情况下无法做到这一点,这是一个安全缺陷。
PrivateKeyPassphrase
或 SecurePrivateKeyPassphrase
。
WinSCP GUI 可以为您生成代码模板。
(我是该库的作者)
我遇到了同样的问题。马丁提供的代码确实对我有帮助,但是它缺少一些满足我需求的设置。
我需要添加端口号和密码短语以完全自动化我的解决方案。所以代码最终是这样的:
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
PortNumber = port,
HostName = host,
UserName = username,
PrivateKeyPassphrase = passphrase,
SshHostKeyFingerprint = fingerprint,
SshPrivateKeyPath = privatekeyfile
};
SSH.Net
using (SftpClient client = new SftpClient(new PasswordConnectionInfo("URL", "Username", "Password")))
{
client.Connect();
string Serverfile = "";
string Localfile = "";
using (Stream stream = File.OpenWrite(Localfile))
{
client.DownloadFile(Serverfile, stream);
}
client.Disconnect();
}