2016-09-26 2 views
0

J'ai besoin d'exécuter un script sur une machine distante pour cela J'utilise Jsch Je ne peux pas stocker le script dans une machine distante. ci-dessous est le scriptL'exécution d'iqisql à l'aide de JSch échoue avec "Une erreur s'est produite lors de la tentative d'allocation de structures liées à la localisation"

#!/bin/bash 
/eniq/sybase_iq/OCS-15_0/bin/iqisql -Uce -Pce -Sendb -b -n <<EOF! 

SELECT SUM(COUNTERS) FROM ADAPTER WHERE STARTTIME = "Aug 8 2016 11:30:00.000000PM" 

go 
exit 
EOF! 

si je lance le script dans la machine Linux, je suis en mesure d'obtenir le nécessaire outut

#: /eniq/sybase_iq/OCS-15_0/bin/iqisql -Uce -Pce -Sendb -b -n <<EOF! 
> SELECT SUM(COUNTERS) FROM ADAPTER WHERE STARTTIME = "Aug 8 2016 11:30:00.000000PM" 
> go 
> exit 
> EOF! 
            168002 

(1 row affected) 

Mais quand je suis en train d'exécuter le script en utilisant sous le code java -

package org.rhq.plugin.eniq;

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.Properties; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.ChannelExec; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 

public class JSchTest { 

    private final Log log = LogFactory.getLog(JSchTest.class); 

    public void executeCommand() { 
     try { 
      String command = "/eniq/sybase_iq/OCS-15_0/bin/iqisql -Uce -Pce -Sendb -b -n <<EOF!" + "\n" 
        + "SELECT SUM(COUNTERS) FROM ADAPTER WHERE STARTTIME = \"Aug 8 2016 11:30:00.000000PM\"" 
        + "\n" + 

        "go" + "\n" + "exit" + "\n" + "EOF!"; 
      String host = "107.250.237.13"; 
      String user = "dcuser"; 
      String password = "dcuser"; 

      JSch jsch = new JSch(); 
      Session session = jsch.getSession(user, host, 22); 
      Properties config = new Properties(); 
      config.put("StrictHostKeyChecking", "no"); 
      session.setConfig(config); 
      ; 
      session.setPassword(password); 
      session.connect(); 

      Channel channel = session.openChannel("exec"); 
      ((ChannelExec) channel).setCommand(command); 
      channel.setInputStream(null); 
      ((ChannelExec) channel).setErrStream(System.err); 

      InputStream input = channel.getInputStream(); 
      channel.connect(); 

      log.error("Channel Connected to machine " + host + " server with command: " + command); 

      try { 
       InputStreamReader inputReader = new InputStreamReader(input); 
       BufferedReader bufferedReader = new BufferedReader(inputReader); 
       String line = null; 

       while ((line = bufferedReader.readLine()) != null) { 
        log.error("Eniq DB Output line is " + line); 
       } 
       bufferedReader.close(); 
       inputReader.close(); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 

      channel.disconnect(); 
      session.disconnect(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

mais quand je lance ce que je reçois l'erreur ci-dessous comme outut- Une erreur est survenue lors d'une tentative d'affecter les structures liées à la localisation

est quelque chose à voir avec le nom de la locale « en_US.UTF-8 »? comment mettre en jsch

NB: Je ne peux pas utiliser les pilotes sybase dans le cadre en raison de l'exigence DonT permettre

Répondre

0

Selon cette réponse précédente StackOverflow

not able to run isql on cygwin

vous devriez faire

unset LANG 

avant d'exécuter isql. Alors peut-être même est vrai avant d'exécuter iqisql.

+0

Comment le faire en utilisant jsch – Avishek

+0

Chaîne commande = "unset LANG;/eniq/sybase_iq/OCS-15_0/bin/iqisql -Un nom d'utilisateur -Ppassword -Sdb -b -n << EOF!" + "\ n" + "SELECT SUM (Employee.Names) FROM DC.EMPLOYEES O JOIN JOININGDATE = \" 8 août 2016 11: 30: 00.000000PM \ "" + "\ n" + "go" + "\ n" + "exit" + "\ n" + "EOF!"; J'ai essayé de modifier de cette façon mais pas d'aide même erreur – Avishek