2017-10-03 10 views
1

원격 Java 웹 응용 프로그램을 통해 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(); 

을 ';' 여러 명령을 실행해야한다고 생각했기 때문에 명령을 분리해야합니다. -c : 라인 0 : 예기치 않은 토큰 'weblogic','password','t3://host:7001''
bash: -c: line 0:
/u01/app/oracle/jdk1.8.0_65/bin/ 근처의 구문 오류

불행히도, 2

bash는 줄에 구문 오류가 있습니다. (weblogic, password, t3 : // host : 7001) '

/web-server/

첫 번째 줄 뒤에 \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(); 

결과 :

초기화 웹 로직 스크립팅 도구를 사용할 수있는 명령
WLS에 도움 (WLST) ... 웹 로직 서버 관리 스크립팅 쉘
입력 도움말 (에
에 오신 것을 환영합니다) :/오프라인>

명령을 수동으로 테스트했는데 효과가있었습니다. 이 문제는 다른 셸 인터페이스를 연 이후로 WLST 인터페이스가있는 JSch의 것 같습니다.

JSST로 WLST 명령을 어떻게 실행할 수 있습니까?

PS1 : 배포 할 동일한 응용 프로그램에 기능이 있으므로 JSch 코드가 작동하는 것으로 알고 있습니다. 기본적으로 jscp를 실행하여 전쟁을 업로드 한 다음 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

실제로 하나 쉘 명령 줄에서 여러 명령을 실행할 * 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