我正在向Java迈出第一步--尝试在Domino Designer 8.5.2中创建一个简单的Java脚本库,以使用JSch 0.1.48执行SFTP文件传输。将通过LS2J从LotusScript代理调用库。下面是基于this SO answer的脚本库中的SFTP类
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()调用有关。我发现其他with similar issues从其他应用程序调用JSch,但如果这是一个JSch错误,我认为Java agent会抛出同样的异常。堆栈跟踪让它看起来像是一个Domino安全问题,但是我不知道要做什么调整才能允许这个操作。代理已设置为允许受限制的操作,因此不是这样。此forum post具有类似的堆栈跟踪,并表明该问题可能是由Domino拥有其线程组上的清理权限引起的。
我需要在Domino端进行安全更改吗?我可以在不孤立服务器上无数连接的情况下删除session.disconnect()吗?
发布于 2012-06-27 07:14:15
该问题发生在AgentSecurityManager中,您可以在this blog entry中阅读有关该问题的信息。它基本上是一个填充程序,Domino AMGR将其插入到JVM中以强制执行Domino的安全策略。
检查以确保您已授予代理使用受限操作的权限。(在Lotus古怪术语的另一个示例中,签名者必须在服务器文档的“签名或运行不受限制的方法和操作”字段中具有权限,但代理必须在代理属性框的安全选项卡上被授予“允许受限制的操作”的权限)
如果不是这样简单,那么我建议您尝试从Domino脚本库中取出com.jcraft.jsch.*的jar,并将它们放在服务器文件系统上的jvm/lib/ext文件夹中。存储在文件系统上的jars的安全性有不同的处理方式,它可能会绕过这个问题。
https://stackoverflow.com/questions/11214129
复制相似问题