该组织有一个基于。net 4.5.2的集成服务层。它有几个正在运行的WCF服务。一个服务使用SFTP连接到同一机器上的SFTP服务器,读取和移动一些文件。它使用简单的用户名和密码身份验证。
我正试图在Visual Studio 2019(16.8.6)中调试解决方案,并且连接到SFTP服务器时遇到麻烦。它使用Renci SSH。净v2016.0.0。升级不是一个选项。我只是想在开发环境中调试一下。
开发环境(Windows Server 2012 R2)已经安装了OpenSSH (openssh_for_windows_8.9 . p1, LibreSSL 3.4.3(. 我以管理员的身份运行Visual Studio.
我可以在CMD和FileZilla中使用特定的用户和密码连接到SFTP。我还创建了一个简单的控制台应用程序,它也能够连接,导航到相关文件夹并读取文件。
然后我创建了一个简单的WCF服务和一个服务主机,并尝试连接,但失败了。当它尝试连接时,它给出错误"一个现有的连接被远程主机强制关闭"。控制台应用程序连接代码的示例,这一个工作。
SftpClient _client = new SftpClient(host, u1, password1);
_client.Connect();
这是来自WCF服务的代码示例。
public string GetSFTPConnection(ConnectionDetails connectionDetails)
{
try
{
SftpClient _client = new SftpClient(connectionDetails.Host, connectionDetails.UserName, connectionDetails.Password);
_client.Connect();
if (_client.IsConnected)
{
return "SFTP Connected Successfully!";
}
return "SFTP Connection Failed!";
}
catch (Exception e)
{
return $"SFT Connection Error@ {e}";
}
}
错误:
InnerException = An existing connection was forcibly closed by the remote host
StackTrace = at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle, TimeSpan timeout)
at Renci.SshNet.Session.Connect()
at Renci.SshNet.BaseClient.Connect()
at SFTPServiceNew.Service1.GetSFTPConnection(ConnectionDetails connectionDetails) in C...
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header />
<s:Body>
<GetSFTPConnectionResponse xmlns="http://tempuri.org/">
<GetSFTPConnectionResult>SFT Connection Error@ Renci.SshNet.Common.SshConnectionException: An existing connection was forcibly closed by the remote host ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
at Renci.SshNet.Abstractions.SocketAbstraction.Read(Socket socket, Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout)
at Renci.SshNet.Session.SocketRead(Int32 length, Byte[] buffer)
at Renci.SshNet.Session.ReceiveMessage()
at Renci.SshNet.Session.MessageListener()
--- End of inner exception stack trace ---
at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle, TimeSpan timeout)
at Renci.SshNet.Session.Connect()
at Renci.SshNet.BaseClient.Connect()
at SFTPServiceNew.Service1.GetSFTPConnection(ConnectionDetails connectionDetails) in C:...</GetSFTPConnectionResult>
</GetSFTPConnectionResponse>
</s:Body>
</s:Envelope>
它还根据主机返回不同的错误。
localhost:
An existing connection was forcibly closed by the remote host
127.0.0.1:
Server response does not contain SSH protocol identification.
环境IP地址(10.xx.xx.xx):
Permission denied (password).
计算机名称:
An existing connection was forcibly closed by the remote host
我有一种感觉,这可能与WCF服务及其主机在调试模式下运行的方式有关。以及SSH中的用户配置。但我不知道怎么算出来。我没有很多WCF服务或OpenSSH的经验。
我还尝试使用blow命令将我的用户帐户添加到OpenSSH中。但是它失败了。
mkpasswd -l -u [my_user_account] >> etcpasswd
The system cannot find the path specified.
OpenSSH文件夹中也没有etcpasswd文件
示例WCF服务应用程序结构
调试时的示例WCF服务
服务器的OpenSSH文件夹
如果有人能给我指出正确的方向,我会很感激。
我最近发现这台机器同时运行了OpenSSH和Cerberus,并配置了SFTP。Cerberus定义了一组不同的用户。我关闭了OpenSSH,并尝试连接到WCF服务中的Cerberus SFTP,并且成功了。
我猜这是由于OpenSSH和Cerberus SFTP之间的某种冲突。