【发布时间】:2020-01-17 04:52:56
【问题描述】:
我有一个 C# .NET 项目,正在尝试打开与服务器的 SFTP 连接并将文件放入服务器。
我有 SFTP 主机名、用户名和密钥文件(.pem 文件)。
我这里没有密码。
请帮助我在 C# 和 .Net 中使用 SFTP。
【问题讨论】:
我有一个 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");
WinSCP .NET assembly(NuGet package):
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 可以generate a code template for you。
(我是图书馆的作者)
【讨论】:
我遇到了同样的问题。 Martin 提供的代码当然对我有帮助,但是它缺少一些满足我需要的设置。
我需要添加一个端口号和一个密码短语来完全自动化我的解决方案。所以代码最终如下:
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
PortNumber = port,
HostName = host,
UserName = username,
PrivateKeyPassphrase = passphrase,
SshHostKeyFingerprint = fingerprint,
SshPrivateKeyPath = privatekeyfile
};
【讨论】: