0

私は Java への第一歩を踏み出しています。JSch 0.1.48 を使用して SFTP ファイル転送を実行するために、Domino Designer 8.5.2 で単純な Java スクリプト ライブラリを作成しようとしています。ライブラリは、LS2J を介して LotusScript エージェントから呼び出されます。これは、この 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 エージェントから呼び出すと、問題なく動作しているように見えます。LotusScript エージェントから LS2J 経由で呼び出すと、ファイルは転送されますが、エラー 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() を削除できますか?

4

1 に答える 1

1

問題は AgentSecurityManager で発生しました。これについては、このブログ エントリを参照してください。基本的には、Domino AMGR が JVM に挿入して、Domino のセキュリティ ポリシーを実施する shim です。

制限された操作を使用する権限をエージェントに付与していることを確認してください。(Lotus の変わった用語の別の例では、署名者はサーバー ドキュメントの [署名または無制限のメソッドと操作の実行] フィールドで権限を持っている必要がありますが、エージェントは [エージェントのプロパティ] ボックスの [セキュリティ] タブで [制限付きのメソッドと操作を許可する] に付与された権限を持っている必要があります。オペレーション")

そのような単純なものでない場合は、Domino スクリプト ライブラリから com.jcraft.jsch.* の jar を取り出して、サーバーのファイル システムの jvm/lib/ext フォルダーに配置することをお勧めします。ファイルシステムに格納された jar のセキュリティは別の方法で処理され、問題を回避できる可能性があります。

于 2012-06-26T23:14:14.563 に答える