我有一个程序可以在 FTP 和 SFTP 之间交替使用,以便在远程服务器上执行一些操作。
对于 FTP 部分,我使用 Apache Commons FTP 客户端,而对于 SFTP,我使用 JSch 库。
Apache commons 可以并且将会打印出客户端向服务器发出的所有命令的详细信息,以及服务器的响应。
我想对 JSch 做类似的事情,以便我的应用程序在两种情况下的日志记录方式保持一致。
我尝试成功实现 JSch 库的 Logger 接口(interface),但事实证明它无法向我提供向服务器发出的命令及其响应的详细表示。
我尝试过寻找类似的解决方案,但它们都围绕着做一些类似于我正在寻找 SSH session 而不是 SFTP session 的事情。
我尝试创建一个 PrintStream,然后将其设置为 channel 的 OutputStream,但这没有奏效。
我还尝试实现一些我在这里找到的建议,这些建议围绕着拥有一个捕获 channel 的输入流和输出流的线程,但到目前为止我还无法让某些东西正常工作。
我的问题是,有没有人设法做类似的事情 - 例如打印出底层 FTP 对话框 - 使用 JSch 库时?
最佳答案
JSch 库不记录 SFTP 请求和响应。
使用流也不会帮助你,因为:
ChannelSftp
使用流本身来读取数据包。如果你干预,你可能会破坏它的实现。- SFTP(与 FTP 不同)是一种二进制协议(protocol)。因此,即使您设法读取流,您也会获得需要解码的二进制数据。从本质上讲,实现 SFTP 协议(protocol)的日志记录(与 FTP 相比)非常困难,因为您基本上需要显式记录每种类型的请求/响应消息的每个字段。
另请注意,SFTP 协议(protocol)比 FTP 更底层。没有像 FTP STOR
或 RETR
这样的“好”高级命令。您可能会看到每次传输都有数千个不同的请求。可能不是,你所追求的。
关于java - JSch SFTP 详细日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40349211/