使用jsch执行命令ntpq -p

时间:2012-12-13 05:06:17

标签: java linux jsp jsch hp-ux

我正在开发一个JSP Web应用程序,用于监视我办公室中不同HP-ux和Linux服务器的系统参数。我正在使用jsch 在远程系统上执行命令。我的问题是对于像ntpq -p这样的命令,jsch是returnig null。

我正在尝试使用命令ntpq -p | tail -1 | awk '{ print $1 }'获取系统同步的服务器。但它返回null。但命令如 mpstat | tail -1 | awk '{ print $12 }'工作正常并且返回结果。任何人都可以告诉我我做错了什么,任何可能的工作,如果有的话......?

这是我为此目的使用的代码!

package com.bpcl.sysmon;
import java.io.IOException;
import java.io.InputStream;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;

public class Sys 
{
String line;
String host="**.**.**.***";         
String user="******";         
String password="***********";         
String result = null;


public String getdata(String command1) throws IOException
{


    try
    {      
        result = null;
        java.util.Properties config = new java.util.Properties();              
        config.put("StrictHostKeyChecking", "no");             
        JSch jsch = new JSch();             
        com.jcraft.jsch.Session session=jsch.getSession(user, host, 22);             
        session.setPassword(password);             
        session.setConfig(config);             
        session.connect();             

        Channel channel=session.openChannel("exec");   
        ((ChannelExec) channel).setCommand(command1);       
        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;                 
                result = (new String(tmp, 0, i));               
                }              
            if(channel.isClosed())
            {                
                System.out.println("exit-status: "+channel.getExitStatus());                
                break;               
                }               
            try
            {
                Thread.sleep(1000);}catch(Exception ee){}            
                }             
        channel.disconnect();             
        session.disconnect();             
        System.out.println("DONE");         
        }
    catch(Exception e)
    {             
        e.printStackTrace();         
    } 

    return result;

 } 



 public String getcpu(boolean linux)
{  

    String res1 = null;
    try {
        if(linux)
        res1 = getdata("mpstat | tail -1 | awk '{ print $12 }'");

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return res1;
}

public String getntp(boolean linux)
{  
    String res1 = null;
    try {
        if(linux)
        res1 = getdata("ntpq -p | tail -1 | awk '{ print $1}'");

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return res1;

}

3 个答案:

答案 0 :(得分:0)

时间同步以两种方式完成。满贯还是回归。然后你猛击你根据它从服务器收到的东西在你的时间客户端上设置时间。但有些应用程序无法处理突然的时间变化。所以你需要回转(逐渐改变它来纠正)。

要猛击,你需要使用ntpdate作为命令。

要进行转换,您需要使用名为ntpd(或xntpd)的守护进程。要运行它,您需要配置ntp.conf,并在conf文件中包含server dns/ip。然后加载ntpd(或xntpd)。

当它正在回转时需要时间来纠正,因此要跟踪时间校正的进度,您需要使用ntpq命令(ntp查询)。不要使用ntpq进行同步。

ntpq是一个命令行提示工具。要获取运行ntpq命令所需的状态。有关更多指导和详细信息,请使用here

我为Netware开发了ntp,同样的命令也适用于所有unix风格,因为ntp一直是一个开源项目。

答案 1 :(得分:0)

以下是我使用的确切代码,因为几年后,您可以试一试,但我发现没有可能使其正常工作的重大差异,而不是:

private static final String URL = "user@yourmachine.com";
private static final String PASSWORD = "password";

public static String getQueryShell(String p_sCommand)
{
    StringBuilder sbResponse = null;

    try
    {
        JSch jsch=new JSch();  

        String host = URL;
        String user=host.substring(0, host.indexOf('@'));
        host = host.substring(host.indexOf('@')+1);
        String password = PASSWORD;

        Session session=jsch.getSession(user,host,22);

        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking","no");
        session.setConfig(config);
        // username and password will be given via UserInfo interface.
        session.setPassword(password);
        session.connect();

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

        channel.setInputStream(null);

        ((ChannelExec)channel).setErrStream(System.err);

        InputStream in=channel.getInputStream();

        channel.connect();

        byte[] tmp=new byte[1024];

        sbResponse = new StringBuilder();

        while(true)
        {
            while(in.available()>0)
            {
                int i=in.read(tmp, 0, 1024);

                if(i<0)break;

                sbResponse.append(new String(tmp, 0, i));
            }
            if(channel.isClosed())
            {
                //System.out.println("exit-status: " + channel.getExitStatus());
                break;
            }

            try
            {
                Thread.sleep(1000);
            }
            catch(Exception ee)
            {

            }
        }
        channel.disconnect();
        session.disconnect();
    }
    catch(Exception e)
    {
        System.out.println(e);
    }

    return sbResponse.toString();
}

答案 2 :(得分:0)

您可以比较&#34; which ntpq&#34;的输出。从您的Java应用程序和实际运行&#34; ntpq &#34;来自已知的ssh客户端(如putty)。

如果两者都指向不同的二进制文件,则必须在java应用程序中指定完整路径。