1

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

我正在尝试使用命令获取与系统同步的服务器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;

}
4

3 回答 3

0

您可以比较“ which ntpq”来自您的 java 应用程序的输出,并通过实际运行来自已知 ssh 客户端(如 putty)的“ which ntpq ”。

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

于 2014-07-25T14:01:59.407 回答
0

时间同步有两种方式。大满贯或Slew。然后你猛击你根据从服务器接收到的时间在你的时间客户端上设置时间。但是有些应用程序无法处理突然的时间变化。因此,您需要旋转(逐渐将其更改为更正)。

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

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

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

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

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

于 2012-12-13T05:31:06.253 回答
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();
}
于 2012-12-14T18:21:53.597 回答