0

为此我需要在远程机器上运行脚本我正在使用 Jsch 我无法将脚本存储在远程机器中。下面是脚本

#!/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!

如果我在 Linux 机器上运行脚本,我可以获得所需的输出

#: /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)

但是当我尝试使用下面的java代码运行脚本时 -

包 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();
        }
    }
}

但是当我运行它时,我得到以下错误作为输出-尝试分配与本地化相关的结构时发生错误

与语言环境名称“en_US.UTF-8”有关吗?如何在jsch中设置

注意:由于要求不允许,我不能在连接中使用 sybase 驱动程序

4

1 回答 1

0

根据this previous StackOverflow answer

无法在 cygwin 上运行 isql

你应该做

unset LANG

在运行之前isql。所以也许在运行之前也是如此iqisql

于 2016-09-26T23:00:23.557 回答