Tamir.SharpSSH连接RHEL 8.8服务器时出现IO流读取终止错误求助
问题描述
我们使用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

