You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tamir.SharpSSH连接RHEL 8.8服务器时出现IO流读取终止错误求助

Tamir.SharpSSH连接RHEL 8.8 SFTP失败:End of IO Stream Read 问题排查

问题描述

我们使用Tamir.SharpSSH DLL库从Windows Server 2016向开启Samba服务的RHEL 8.8服务器传输文件时遇到故障。程序工作目录已包含所有必要依赖组件:DiffieHelman.dll、Tamir.SharpSSH.dll和Org.Mentalis.Security.dll。

配置文件中的SFTP相关配置项如下:

<add key="date_time_format" value="dd-MM-yyyy" />
<add key="group_name" value="REROUTING" />
<add key="entity" value="Rerouting_ConnettoreBolli" />
<add key="sftp_file_path" value="/path/Bolli" />
<add key="sftp_host" value="10.213.70.110" />
<add key="sftp_username" value="user" />
<add key="sftp_password" value="password" />
<add key="csv_separator" value=";" />
<add key="source_class_name" value="ConnettoreBolli.SourceBolli" />

此前连接CentOS 7.9服务器时一切正常,但切换到RHEL 8.8后,程序执行时抛出如下错误:

Session.connect: System.IO.IOException: End of IO Stream Read
at Tamir.SharpSsh.jsch.IO.getByte(Byte[] array, Int32 begin, Int32 length)
at Tamir.SharpSsh.jsch.Session.read(Buffer buf)
at Tamir.SharpSsh.jsch.Session.connect(Int32 connectTimeout)

我们可通过MobaXterm客户端及命令行正常SFTP到目标目录,但程序无法完成连接。已尝试重新配置目标服务器的Samba服务,问题仍未解决,需恢复文件传输功能。


排查与解决方案

1. 修复SSH算法兼容性问题

Tamir.SharpSSH基于老旧的JSch版本,而RHEL 8.8默认禁用了多数旧版SSH加密算法和协议,这是最可能的原因:

  • 编辑RHEL 8.8服务器的/etc/ssh/sshd_config,添加以下配置以启用Tamir.SharpSSH支持的算法:
    KexAlgorithms +diffie-hellman-group1-sha1,diffie-hellman-group-exchange-sha1
    Ciphers +aes128-cbc,3des-cbc,blowfish-cbc
    MACs +hmac-md5,hmac-sha1
    
  • 重启sshd服务:systemctl restart sshd
  • 测试程序连接,若成功则说明是算法兼容性问题。注意:启用弱算法存在安全风险,建议后续升级SFTP库。

2. 升级SFTP库(推荐长期方案)

Tamir.SharpSSH已停止维护,对现代SSH服务器兼容性极差,建议替换为活跃维护的SSH.NET库:

  • 示例上传代码(SSH.NET):
    using Renci.SshNet;
    using System.IO;
    
    var connInfo = new PasswordConnectionInfo("10.213.70.110", "user", "password");
    using var sftpClient = new SftpClient(connInfo);
    sftpClient.Connect();
    
    using var localFileStream = new FileInfo("本地文件路径").OpenRead();
    sftpClient.UploadFile(localFileStream, "/path/Bolli/远程文件名");
    
    sftpClient.Disconnect();
    

3. 查看服务器SSH日志定位细节

通过RHEL 8.8的SSH日志获取连接失败的具体原因:

  • 实时监控日志:journalctl -u sshd -f
  • 同时运行程序触发连接,观察日志中是否有算法不支持、权限拒绝等详细报错信息。

4. 验证目标目录权限

确保/path/Bolli目录对sftp_username具备读写权限:

  • 检查目录权限:ls -ld /path/Bolli
  • 检查目录所有者:stat /path/Bolli
  • 若权限不足,执行:chown user:user /path/Bolli(替换为实际用户组)或chmod 755 /path/Bolli

5. 检查SELinux与防火墙设置

RHEL 8.8默认启用SELinux,可能阻止SFTP访问目标目录:

  • 临时关闭SELinux测试:setenforce 0
  • 若连接成功,配置SELinux允许SFTP访问:
    semanage fcontext -a -t public_content_rw_t "/path/Bolli(/.*)?"
    restorecon -Rv /path/Bolli
    
  • 确保防火墙允许SSH端口(默认22):firewall-cmd --list-services | grep ssh,未添加则执行:firewall-cmd --add-service=ssh --permanent && firewall-cmd --reload

内容的提问来源于stack exchange,提问作者SimBe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:13:20