サーブレットからいくつかのUnixコマンドを呼び出す必要があります。Perlスクリプトがいくつかありますが、それらをJavaに「変換」したいと思います。これが私がJavaでやりたいことですが、Perlで作成したものです。
system("myfolder/myscript.sh > /myfolder/logs/myscript.log");
サーブレットでこれを行うことは可能ですか?
はい。ただし、リダイレクトは必要なシェルの一部であることに注意してください。
ProcessBuilder pb =
new ProcessBuilder("/bin/sh", "-c", "myfolder/myscript.sh > /myfolder/logs/myscript.log");
pb.start();
短い答え:
可能ですが、設計が悪く、セキュリティ上のリスクをもたらす可能性があります。スクリプトを実行する必要があることを何らかの方法でフラグを立て、スクリプトを介してフラグを確認することをお勧めします
長い答え(コメントに続く):
サーブレットは通常、データへのアクセスや、場合によってはアクションのトリガーなど、何かにユーザーインターフェイス(またはAPI)を提供するために使用されます。そのため、リモートコンピュータなどのリモートリソースからアクセスできる可能性があります。一部の(実際にはほとんどの)場合、そのリモートコンピュータは、たとえば誰かの家など、ネットワークの外にあることさえあります。
外界にさらされているすべてのサーバーは、何らかの方法でハッキングまたは攻撃される可能性があり、このリソースがもたらす関心のレベルに直接関係するリスクがあります。
たとえば、大企業で働いていて(ハッカーが気付く)、このサーブレットを使用してローカルリポジトリでビルドをトリガーし、開発者が自宅で作業できるようにしてログインする必要があると判断した場合ビルドをトリガーしたり、ビルドステータスを確認したりするには、適切な資格情報を持っている人なら誰でも、世界中のどこからでもサーブレットにアクセスできる可能性があります。ここで、perlスクリプトが一部のデータについてCIサーバーにアクセスし、別のデータについてソースリポジトリにアクセスする必要があると仮定します(CIサーバーにアクセスさせる代わりにソースをコピーする場合もあります)。この場合、あなたは世界のどこかに座っている誰かと会社のソースコードとの間に直接リンクを作成しただけです。それはまたそれが すべての潜在的なギャップを埋めるために膨大な時間を費やしたため、信じられないほど安全なサービスに侵入するのは非常に困難です。それでも、多くの不要なビルドをトリガーできる可能性があります。継続的デプロイで作業している場合は、それらのビルドを本番環境に移行させることもできます( DOS攻撃またはサービスの中断)。ある時点で、スクリプトがサーブレットからパラメータも取得する必要があると誰かが判断した場合、ハッカーの生活が楽になり、最終的にはハッカーにシステムへのアクセスを許可する可能性があります。
前の段落で説明したことはすべて、あなたのケースとはまったく関係がないかもしれません。自宅のコンピューターで実行され、自分以外の誰にも興味がないサービスを開発している可能性がありますが、これは悪い設計であるという事実を変えるものではありません(ちなみに、これは家庭での使用には問題ないかもしれません)。
簡単な答えで私が言ったことは、アクションが必要であることをサーブレットにシステムにフラグを立てさせる方が良いということです。たとえば、DBまたはファイルにフラグを設定します。この場合、ハッカーの生活ははるかに困難になります。直接リンクはありません。これにより、サーブレットはすぐに応答し、perlスクリプトの実行が終了するのを待つのではなく、ステータスが自動的に更新される可能性があります。
Jschを試してみました。sshを実行してシェルコマンドを実行できます。