Согласно RFC 4253, раздел 4.2. Версия протокола Exchange :
Когда соединение установлено, обе стороны ДОЛЖНЫ отправить идентификационную строку.
Клиент SSH.NET и SFTP-сервер Amazon Managed не соответствуют этому требованию. Оба сначала ждут, пока другая сторона отправит идентификационную строку, прежде чем отправлять свою собственную. Тупик неизбежен (прерывается только тайм-аутом). Это также объясняет, почему Wireshark не идентифицирует сеанс как SSH, так как данные вообще не передаются. Следовательно, ничто не позволяет идентифицировать протокол.
Если вы можете изменить исходный код SSH.NET, переместите эту строку в Session.Connect
:
SocketAbstraction.Send(_socket, Encoding.UTF8.GetBytes(string.Format(CultureInfo.InvariantCulture, "{0}\x0D\x0A", ClientVersion)));
... над этим блоком:
Match versionMatch;
// Get server version from the server,
// ignore text lines which are sent before if any
while (true)
{
...
}
... должен решить проблему.
Также рассмотрите возможность сообщения об ошибке в Amazon.
Я сообщил об ошибке в SSH.NET
включая необходимое изменение .
Если вы не можете изменить код SSH.NET, вам нужно будет использовать другую библиотеку SFTP.
Например, моя сборка WinSCP .NET совместима с управляемым Amazon SFTP-сервером.
Это эквивалент вашего кода:
// Set up session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = baseHost,
UserName = user,
SshHostKeyFingerprint = ...,
SshPrivateKeyPath = keyLocation,
PrivateKeyPassphrase = pkpassword,
};
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
// Your code
}
WinSCP GUI может сгенерировать шаблон кода , подобный приведенному выше для вас.