我正在尝试使用Jsch编写Java程序,我希望使用该程序开始执行shell脚本,并在完成shell脚本的执行后退出程序。
String userName = "";
String hostName = "";
String password = "";
JSch javaSecureChannel = new JSch();
Session jschSession = null;
Channel jschChannel = null;
try {
jschSession = javaSecureChannel.getSession(userName, hostName, 22);
Properties configurationProperties = new Properties();
configurationProperties.put("StrictHostKeyChecking", "no");
jschSession.setConfig(configurationProperties);
jschSession.setPassword(password);
jschSession.connect();
jschChannel = null;
jschChannel = jschSession.openChannel("shell");
jschChannel.setOutputStream(System.out);
File shellScript = createShellScript();
FileInputStream fin = new FileInputStream(shellScript);
byte fileContent[] = new byte[(int) shellScript.length()];
fin.read(fileContent);
InputStream in = new ByteArrayInputStream(fileContent);
jschChannel.setInputStream(in);
jschChannel.connect();
while(true){
//if(jschChannel.isClosed)
if(jschChannel.getExitStatus() == 0){
System.out.println("exit-status: " + jschChannel.getExitStatus());
break;
}
try{
Thread.sleep(1000);
}catch(Exception ee){
ee.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
jschChannel.disconnect();
jschSession.disconnect();
System.out.println("Done...!!!");
createShellScript方法如下。
String temporaryShellFileName = "shellscript.sh";
File fileStream = new File(temporaryShellFileName);
try {
PrintStream outStream = new PrintStream(new FileOutputStream(fileStream));
outStream.println("#!/bin/bash");
outStream.println("cd /u01/app/java/gids4x/Test");
outStream.println("Test_with_NULL.sh");
outStream.close();
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
使用上面的代码,我可以开始执行shell脚本。但是,即使在程序执行完毕后,即在脚本执行完成之后,我也不打算终止程序执行。
你能说明一下需要做些什么吗?
答案 0 :(得分:2)
我也遇到了同样的问题,并通过以下两个步骤解决了这个问题: 1.将最后一个命令发送为“退出” 2.将我的邮件线程置于睡眠状态,直到频道打开
请找到如下代码:
public static void main(String[] arg){
Channel channel=null;
Session session=null;
try{
JSch.setLogger(new MyLogger());
JSch jsch=new JSch();
jsch.addIdentity("C:\\testLinuxKey.key");
String host=null;
if(arg.length>0){
host=arg[0];
}
else{
host=JOptionPane.showInputDialog("Enter username@hostname",
System.getProperty("user.name")+
"@localhost");
}
String user=host.substring(0, host.indexOf('@'));
host=host.substring(host.indexOf('@')+1);
session=jsch.getSession(user, host, 22);
// username and password will be given via UserInfo interface.
UserInfo ui=new MyUserInfo();
session.setUserInfo(ui);
session.connect();
channel=session.openChannel("shell");
//channel.setInputStream(System.in);
channel.setOutputStream(System.out);
String temporaryShellFileName = "shellscript.sh";
File fileStream = new File(temporaryShellFileName);
try {
PrintStream outStream = new PrintStream(new FileOutputStream(fileStream));
outStream.println("id");
outStream.println("sudo bash");
outStream.println("cd /tmp/");
outStream.println("/tmp/wasinfo.sh");
outStream.println("exit");
outStream.println("exit");
outStream.close();
FileInputStream fin = new FileInputStream(fileStream);
byte fileContent[] = new byte[(int) fileStream.length()];
fin.read(fileContent);
InputStream in = new ByteArrayInputStream(fileContent);
channel.setInputStream(in);
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
channel.connect();
while(channel.isConnected())
{
System.out.println("----- Channel On ----");
Thread.currentThread().sleep(5000);
}
channel.disconnect();
session.disconnect();
}
catch(Exception e){
System.out.println(e);
channel.disconnect();
session.disconnect();
}
System.out.println("Main End");
}
答案 1 :(得分:2)
我有类似的问题。我在一个窗口中运行一个shell但是当窗口关闭时无法让Java终止。我通过关闭输入流来解决它。