RHEL7上WSO2 EI 6.5.0连接Windows SFTP服务器失败求助
解决WSO2 EI 6.5.0连接Windows SFTP服务器读取文件失败的问题
问题回顾
你在RHEL 7上运行WSO2 Enterprise Integrator 6.5.0,搭建读取SFTP服务器文件的流程时遇到了棘手的问题:
- 用FileZilla/WinSCP等Windows客户端能正常访问目标Windows SFTP服务器,
netstat也显示连接已建立,但WSO2的读取流程完全没有进展 - 连接Linux SFTP服务器(RHEL7+SSHD)完全正常,运行WSO2的用户主目录下
.ssh/id_rsa也已经放了匹配的私钥 - 尝试在VFS URL中添加
transport.vfs.AvoidPermissionCheck=true参数,问题依旧 - 更奇怪的是,用相同的URL配置WSO2向该Windows SFTP服务器写入文件是正常的
- 停止服务器时,
wso2carbon.log中出现核心报错:
[2019-12-06 13:48:59,724] [-1] [] [vfs-Worker-2] ERROR {org.apache.synapse.transport.vfs.VFSTransportListener} - Error checking for existence and readability : sftp://SFTPUSER@SERVER.ACMECORP.ORG/inputdir?transport.vfs.AvoidPermissionCheck=true;vfs.passive=true org.apache.commons.vfs2.FileSystemException: Could not determine if file "sftp://SFTPUSER@SERVER.ACMECORP.ORG/inputdir?transport.vfs.AvoidPermissionCheck=true;vfs.passive=true" is readable. at org.apache.commons.vfs2.provider.AbstractFileObject.isReadable(AbstractFileObject.java:1494) at org.apache.synapse.transport.vfs.VFSTransportListener.scanFileOrDirectory(VFSTransportListener.java:295) at org.apache.synapse.transport.vfs.VFSTransportListener.poll(VFSTransportListener.java:188) at org.apache.synapse.transport.vfs.VFSTransportListener.poll(VFSTransportListener.java:134) at org.apache.axis2.transport.base.AbstractPollingTransportListener$1$1.run(AbstractPollingTransportListener.java:67) at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: com.jcraft.jsch.JSchException: Could not get the groups id of the current user (error code: -1) at org.apache.commons.vfs2.provider.sftp.SftpFileSystem.getGroupsIds(SftpFileSystem.java:219) at org.apache.commons.vfs2.provider.sftp.SftpFileObject.getPermissions(SftpFileObject.java:250) at org.apache.commons.vfs2.provider.sftp.SftpFileObject.doIsReadable(SftpFileObject.java:264) at org.apache.commons.vfs2.provider.AbstractFileObject.isReadable(AbstractFileObject.java:1492) ... 8 more
问题根源分析
这个问题的核心是Windows SFTP服务器与Unix风格SFTP服务器的权限模型差异:
- WSO2 EI使用的Apache VFS2库在检查文件可读性时,会尝试获取当前用户的组ID,但很多Windows SFTP服务(比如早期的OpenSSH for Windows、部分第三方SFTP服务器)不支持返回Unix标准的用户组ID信息,导致JSch抛出
Could not get the groups id of the current user错误 - 写入文件时VFS的权限检查逻辑和读取时不同,写入操作跳过了这个组ID获取步骤,所以写入正常但读取失败
- 你之前添加的
transport.vfs.AvoidPermissionCheck=true只绕过了WSO2 Synapse层的权限检查,没有覆盖VFS2底层的权限验证逻辑,所以没效果
可行的解决方案
1. 优化VFS URL配置,添加针对性参数
在现有URL基础上,补充以下两个关键参数,彻底绕过Windows SFTP的权限检查:
sftp://SFTPUSER@SERVER.ACMECORP.ORG/inputdir?transport.vfs.AvoidPermissionCheck=true;vfs.passive=true;vfs.sftp.server-type=windows;transport.vfs.FilePermissionCheck=false
vfs.sftp.server-type=windows:明确告诉VFS2这是Windows服务器,自动适配权限检查逻辑transport.vfs.FilePermissionCheck=false:关闭VFS传输层的文件权限检查,从根上跳过组ID获取步骤
2. 升级Apache VFS2依赖版本
这个问题属于VFS2的已知缺陷,在后续版本中已经修复。WSO2 EI 6.5.0默认使用的VFS2版本较低,你可以手动替换WSO2 EI安装目录下lib文件夹中的相关jar包:
- 下载
commons-vfs2-2.8.0.jar及以上版本(确保兼容JSch版本,建议搭配jsch-0.1.55.jar及以上) - 替换掉旧的
commons-vfs2-*.jar和jsch-*.jar,重启WSO2 EI即可
3. 调整Windows SFTP服务器配置
如果是使用OpenSSH for Windows,可以在服务器端开启兼容Unix的用户组信息返回:
- 编辑
sshd_config文件,添加或修改GSSAPIAuthentication yes和AllowGroups配置(根据实际用户组设置) - 重启OpenSSH服务
如果是第三方SFTP服务器(比如FileZilla Server),查找是否有"兼容Unix权限"或"返回用户组ID"的开关,开启后重试
4. 临时Workaround(适合开发能力较强的团队)
如果暂时无法升级依赖或修改服务器配置,可以自定义VFSTransportListener的逻辑,在扫描文件时跳过可读性检查中的权限验证部分,重新打包部署到WSO2 EI中。
验证步骤
- 按照上述方案修改配置/替换依赖
- 重启WSO2 EI
- 触发SFTP读取流程,观察
wso2carbon.log是否还有报错 - 如果问题依旧,开启VFS的DEBUG日志(修改
repository/conf/log4j.properties):
log4j.logger.org.apache.commons.vfs2=DEBUG log4j.logger.org.apache.synapse.transport.vfs=DEBUG
通过详细的交互日志进一步定位问题。
内容的提问来源于stack exchange,提问作者MadcowThaFirst
相关产品推荐
相关产品推荐

