2017-10-03 5 views
1

リモートJava Webアプリケーションを使用してWLSTで再起動サーバーコマンドを実行しようとしています。JSchでWLSTコマンドを呼び出す

これは私が実行しようとしているものです:

StringBuilder sb = new StringBuilder(); 
sb.append("/u01/app/oracle/jdk1.8.0_65/bin/./java -cp /u01/app/oracle/product/Oracle_Home/wlserver/server/lib/weblogic.jar weblogic.WLST"); 
sb.append(";connect(\'weblogic\',\'" + consolePass + "\',\'" + fullAddress + "\')"); 
sb.append(";domainRuntime()"); 
sb.append(";cd(\'/ServerLifeCycleRuntimes/" + serverName + "\')"); 
sb.append(";cmo.shutdown())"); 
sb.append(";start(" + serverName + ",'Server')"); 
String command = sb.toString(); 

JSch jsch = new JSch(); 
Session session = jsch.getSession(user, host, port); 
session.setUserInfo(new OracleUserInfo(pass)); 
session.connect(); 

Channel channel = session.openChannel("exec"); 
((ChannelExec) channel).setCommand(command); 
channel.setInputStream(null); 
((ChannelExec) channel).setErrStream(System.err); 
InputStream in = channel.getInputStream(); 
channel.connect(); 

byte[] tmp = new byte[1024]; 
while (true) { 
    while (in.available() > 0) { 
     int i = in.read(tmp, 0, 1024); 
     if (i < 0) 
      break; 
     System.out.print(new String(tmp, 0, i)); 
    } 
    if (channel.isClosed()) { 
     if (in.available() > 0) 
      continue; 
     System.out.println("exit-status: " + channel.getExitStatus()); 
     break; 
    } 
    try { 
     Thread.sleep(1000); 
    } catch (Exception ee) { 
    } 
} 
channel.disconnect(); 
session.disconnect(); 

私が使用しています ';'私は複数のコマンドを実行する必要があると思っていたので、コマンドを分けるために。

残念ながら、それはライン2

のbash上で構文エラーを与える:-c:行0:予期しないトークン'weblogic','password','t3://host:7001''
bash: -c: line 0:
/u01/app/oracle/jdk1.8.0_65/bin/の近くに構文エラー。/java -cp /u01/app/oracle/product/Oracle_Home/wlserver/server/lib/weblogic.jar weblogic.WLST; connect( 'weblogic'、 'password'、 't3:// host:7001') '

最初の行の後に\nを追加しようとしましたが、その結果、最初の行が実行されたので(WLSTに入ったので)、残りのコマンドはありませんでした。

StringBuilder sb = new StringBuilder(); 
sb.append("/u01/app/oracle/jdk1.8.0_65/bin/./java -cp /u01/app/oracle/product/Oracle_Home/wlserver/server/lib/weblogic.jar weblogic.WLST\n"); 
sb.append(";connect(\'weblogic\',\'" + consolePass + "\',\'" + fullAddress + "\')\n"); 
sb.append(";domainRuntime()\n"); 
sb.append(";cd(\'/ServerLifeCycleRuntimes/" + serverName + "\')\n"); 
sb.append(";cmo.shutdown())\n"); 
String command = sb.toString(); 

結果:

の初期化WebLogic Sc​​ripting Tool(WLST)を使用...使用可能なコマンドのヘルプ
WLSのための
ようこそ
WebLogic Server管理スクリプトシェルの種類のヘルプ():/オフライン>

私は手動でコマンドをテストしていました。この問題は、別のシェルインターフェイスを開くので、WLSTインターフェイスを使用するJSchのようです。

どのようにJSSTでWLSTコマンドを実行できるのですか?

PS1:同じアプリケーションにデプロイする機能があるため、JSchコードが動作することがわかりました。基本的には、jscpを実行してwarをアップロードし、次にsshを実行してweblogic.Deployer -deployコマンドを実行します。

PS2:これを行うには、.pyスクリプトがありますが、今のところ実行されるサーバー上にある必要があります。一時フォルダにjscpを実行し、スクリプトを実行してから削除することを考えています。しかし、JSSTを使ってWLSTで複数のコマンドを実行する方法を知りたいのは興味深いです。

ありがとうございます。 (おかげでマーティンを)作業

UPDATE

コード

Channel channel = session.openChannel("exec"); 
    ((ChannelExec) channel).setCommand(command); 

    InputStream in = channel.getInputStream(); 
    OutputStream out = channel.getOutputStream(); 
    ((ChannelExec) channel).setErrStream(System.err); 
    channel.connect(); 
    for (String wlstCommand : wlstCommands) { 
     out.write((wlstCommand).getBytes()); 
    } 
    out.flush(); 

答えて

1

;は確かによる1つのシェルコマンドラインで複数のコマンドを実行するの* nixベースのシステムで使用することができます。

しかし、実行しているのはシェルコマンドではありません。それらはWLSTコマンドですよね?したがって、それらをWLSTに供給する必要があります。このよう

は:

Channel channel = session.openChannel("exec"); 
((ChannelExec) channel).setCommand("java -cp /.../weblogic.jar weblogic.WLST"); 
OutputStream out = channel.getOutputStream(); 
channel.connect(); 
out.write(("connect('weblogic'...)\n").getBytes()); 
out.write(("domainRuntime()\n").getBytes()); 
... 

それは基本的に、一般的なProviding input/subcommands to command executed over SSH with JSchと同じです。

+0

ありがとうございます!出来た!はい、それらはWLSTコマンドです! – fsakiyama

関連する問題