【发布时间】:2016-04-06 13:51:21
【问题描述】:
如何在 Linux 中通过 Java 执行 shell 脚本以通过 sudo 命令启动服务 例如:cmd="sudo path/script.sh start"
这个 Java 程序将在 linux 中执行命令。 即使我能够执行 'sudo ls -lt path' 和 'sudo path/script.sh start'
//Java
public List<String> sshConnection(String usr,String host,int port,String pass)
{
Session session=null;
List<String> outputList = new ArrayList<String>();
try
{
JSch jsch = new JSch();
session = jsch.getSession(usr, host, port);
session.setPassword(pass);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
//String cmd="sudo ls path"; //working fine
String cmd="sudo path/script.sh start"; //service is not starting..but getting the exact output as linux
ChannelExec channelEx=new ChannelExec();
channelEx = (ChannelExec) session.openChannel("exec");
if(cmd.contains("sudo"))
{
channelEx.setPty(true);
}
((ChannelExec) channelEx).setCommand(cmd);
channelEx.connect();
InputStream cmdOp = channelEx.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(cmdOp));
String printOp;
while ((printOp = br.readLine()) != null)
{
outputList.add(printOp);
}
br.close();
channelEx.disconnect();
}
catch (Exception ex)
{
System.out.println(ex.getMessage());
}
finally
{
if (channelEx != null)
{
channelEx.disconnect();
}
}
if(session!=null)
{
session.disconnect();
}
System.out.println("disconnected successfully");
return outputList;
}
我直接在 linux 中执行了相同的命令,并得到一个输出告诉“服务正在运行”和进程 ID。当我使用 ps 命令对进程 ID 执行 grep 时,它显示了具有相同进程 ID 的服务。
但是当我通过上面的 Java 程序执行相同的命令时,我在输出控制台中得到了带有进程 ID 的 linux 的确切输出('服务正在运行')。在 java 程序执行之后,我对进程 ID 进行了 grep(来自 Java 输出控制台)在 linux 中,没有使用该进程 ID 运行此类进程。
我找不到哪里出了问题。
请帮忙!
【问题讨论】:
-
不要认为这与 Java 程序有任何关系,因为该命令似乎已在服务器上运行。