我正在迈出 Java 的第一步——尝试在 Domino Designer 8.5.2 中创建一个简单的 Java 脚本库,以使用 JSch 0.1.48 执行 SFTP 文件传输。将通过 LS2J 从 LotusScript 代理调用该库。这是我的脚本库中的 SFTP 类,基于这个 SO 答案:
import com.jcraft.jsch.*;
public class SFTP {
public String GetFile(String host, String user, String pass,
String localPath, String remotePath) {
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession(user, host, 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(pass);
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
sftpChannel.get(remotePath, localPath);
sftpChannel.exit();
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
}
String result = "OK";
return result;
}
}
当我从 Java 代理调用此函数时,它似乎可以正常工作。当我通过 LS2J 从 LotusScript 代理调用它时,它会传输文件,但随后会抛出错误 318 - LS2J 错误:抛出 java.lang.NullPointerException。Java 堆栈跟踪是:
java.lang.NullPointerException
at lotus.notes.AgentSecurityManager.checkRelatedThreadGroup(Unknown Source)
at lotus.notes.AgentSecurityManager.checkAccess(Unknown Source)
at java.lang.Thread.checkAccess(Thread.java:378)
at java.lang.Thread.interrupt(Thread.java:506)
at com.jcraft.jsch.Session.disconnect(Session.java:1630)
at SFTP.GetFile(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:600)
at lotus.domino.JavaConnectInvoker.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:600)
at lotus.domino.JavaConnectLoader.invoke(Unknown Source)
问题似乎与 session.disconnect() 调用有关。我发现其他有 类似 问题的人从其他应用程序调用 JSch,但如果它是 JSch 错误,我认为 Java 代理会抛出相同的异常。堆栈跟踪使它看起来像是一个 Domino 安全问题,但我不知道要进行什么调整才能允许此操作。代理已经设置为允许受限操作,所以不是这样。此论坛帖子有类似的堆栈跟踪,并表明该问题可能是由 Domino 拥有其线程组的清理权限引起的。
我需要在 Domino 方面进行安全更改吗?我可以删除 session.disconnect() 而不孤立服务器上的无数连接吗?