Java 在chrooted系统上使用JSch打开SFTP通道失败,并显示;无法发送通道请求";,但是WinSCP是有效的

Java 在chrooted系统上使用JSch打开SFTP通道失败,并显示;无法发送通道请求";,但是WinSCP是有效的,java,ssh,sftp,jsch,chroot,Java,Ssh,Sftp,Jsch,Chroot,为SFTP连接运行具有以下设置的SSHD: 匹配用户服务 前命令内部sftp ChrootDirectory/media X11正向编号 AllowTcpForwarding编号 现在,使用JSch连接到sshd并连接“sftp”通道,我将得到以下异常: com.jcraft.jsch.JSchException:未能发送通道请求 这是我的Java代码(非常类似于表单JSch网站) WinSCP日志中的此消息表示,即使WinSCP也无法启动“sftp”通道: 。2018-03-09 15:46

为SFTP连接运行具有以下设置的SSHD:

匹配用户服务
前命令内部sftp
ChrootDirectory/media
X11正向编号
AllowTcpForwarding编号
现在,使用JSch连接到sshd并连接“sftp”通道,我将得到以下异常:

com.jcraft.jsch.JSchException:未能发送通道请求

这是我的Java代码(非常类似于表单JSch网站)


WinSCP日志中的此消息表示,即使WinSCP也无法启动“sftp”通道:

。2018-03-09 15:46:25.855主命令失败;正在尝试回退
. 2018-03-09 15:46:25.855启动shell/命令

当“sftp”通道出现故障时,WinSCP具有回退机制。相反,它显式地尝试在一些公共位置运行
sftpserver
二进制文件。但这或多或少是一种黑客行为,您不应该尝试在Java中重现这种行为

主要问题仍然是SSH/SFTP配置被破坏

这不是一个编程问题。你最好在家里问问



如果您确实需要复制WinSCP hack,则需要修改JSch
ChannelSftp
以使
start
方法do
RequestExec('/path/to/sftp server')
而不是
RequestSftp
(或者类似地修改
RequestSftp

您是否可以使用任何启用了
ChrootDirectory
的SFTP客户端软件连接到SFTP服务器?是的,例如WinSCP可以正常工作。我还尝试使用sshj库;可能有相同的问题。请向我们显示WinSCP日志文件(打开
ChrootDirectory
)。下面的链接将感谢您的回答。调试jsch之后,您可以看到服务器发送了一个
SSH\u MSG\u CHANNEL\u FAILURE
。我认为,这个问题不能在图书馆里解决。是的,你是对的。但是如上所述,在这种情况下,我无法更改服务器配置。所以我的应用程序应该像WinSCP一样解决这个问题。不过,我也会将这些信息发送给我们的运营商,以解决这个问题。是的,这很有效。我复制了原始的
ChannelSftp
类,并更新了行以使用
RequestExec(…)
而不是
ChannelSftp
。现在,我使用这个修补过的jsch库。非常感谢,不客气。我已在答案中添加了解决方案。尽管如此,正确的解决方案是修复服务器。
Session sshSession = JSSH.getSession(<USER>, <HOST>, 22);
sshSession.setConfig("StrictHostKeyChecking", "no");
sshSession.setConfig("HashKnownHosts", "no");
sshSession.setPassword(<PASSWORD>);
sshSession.connect(5000);

Channel channel = sshSession.openChannel("sftp");
channel.connect(); // <-- here exception is raised
ChannelSftp channelSftp = (ChannelSftp) channel;
channelSftp.put(...);