Выполнить команду ntpq -p с помощью jsch

Я разрабатываю веб-приложение JSP, которое будет использоваться для мониторинга системных параметров различных серверов HP-ux и Linux в моем офисе. Я использую jsch для выполнения команд в удаленных системах. Моя проблема в том, что jsch возвращает null для таких команд, как ntpq -p.

Я пытаюсь получить сервер, с которым синхронизируется система, с помощью команды ntpq -p | tail -1 | awk '{ print $1 }'. Но он возвращает ноль. Но такие команды, как 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;

}

person varun    schedule 13.12.2012    source источник
comment
Можете ли вы просто указать, что возвращает null ? (переменная) пожалуйста.   -  person Alexandre Lavoie    schedule 13.12.2012
comment
функция getntp(boolean) возвращает значение null. Он получает значение из функции getdata(string), где переменная result инициализируется нулевым значением. Он возвращает значение null, поскольку команда jsch не выполняется должным образом.   -  person varun    schedule 13.12.2012
comment
Я сравнил ваш код с моим, который я сейчас использую, и проверил ваши команды, и они работают. Ваш код кажется почти таким же. Вы можете проверить в журнале ssh правильность подключения, а также проверить, например, whoami.   -  person Alexandre Lavoie    schedule 13.12.2012
comment
любой свет на то, что я мог бы делать неправильно ..? Я также проверил журналы ssh и правильность подключения ...!   -  person varun    schedule 14.12.2012


Ответы (3)


Синхронизация времени осуществляется двумя способами. Slam или Slew. Затем вы устанавливаете время на своем клиенте времени на основе того, что он получает от сервера. Но некоторые приложения не могут справиться с внезапными изменениями времени. Так что вам нужно повернуть (постепенно изменить его на исправление).

Чтобы хлопнуть, вам нужно использовать ntpdate как команду.

Чтобы убить вас, вам нужно использовать демон под названием ntpd (или xntpd). Чтобы запустить это, вам нужно настроить ntp.conf и иметь server dns/ip в файле conf. А затем загрузите ntpd (или xntpd).

Когда он вращается, для исправления требуется время, поэтому для отслеживания хода исправления времени необходимо использовать команду ntpq (запрос ntp). Не используйте ntpq для синхронизации.

ntpq — это инструмент командной строки. Чтобы получить статус, вам нужно запустить команду ntpq. Для получения дополнительных инструкций и подробностей используйте здесь

Я разработал ntp для Netware, и те же самые команды подходят и для всех разновидностей Unix, поскольку ntp всегда был проектом с открытым исходным кодом.

person Siddharth    schedule 13.12.2012
comment
спасибо Сидхарт за ответ. Но я действительно не хочу синхронизировать серверы. я просто хочу выполнить команду ntpq -p | хвост -1 | awk '{ print $1 }' на удаленном сервере и получите результат. В настоящее время он не работает для меня. Любая работа для этого ..? - person varun; 13.12.2012
comment
-p перечисляет пиры. каждый одноранговый узел выполняет 8 вычислений синхронизации в течение 2-5 минут и, наконец, использует лучшие образцы для синхронизации времени. Так что вы пытаетесь сделать здесь? Вы пытаетесь выяснить, синхронизированы ли серверы? Каково ваше намерение? - person Siddharth; 13.12.2012
comment
да... моя цель - выяснить, синхронизирован ли сервер, и если да, то с каким сервером он синхронизирован...! - person varun; 14.12.2012

Вот точный код, который я использую уже пару лет, вы можете попробовать, но я не вижу существенных различий, которые могли бы заставить его работать, а ваш нет:

private static final String URL = "[email protected]";
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();
}
person Alexandre Lavoie    schedule 14.12.2012
comment
Спасибо Александр, я попробую ваш код. посмотрим, есть ли разница... :-) - person varun; 19.12.2012

Вы можете сравнить вывод «which ntpq» из вашего Java-приложения и фактического запуска «what ntpq» из известного клиента ssh (например, шпатлевки).

если оба указывают на разные двоичные файлы, вы должны указать полный путь в своем приложении Java.

person n32    schedule 25.07.2014