求用jsch网络工具包通过ssh连接远程oracle数据库(数据库在unix上)java代码例子:为何jsch发送:sqlplususer/pwd@service此命令,却没有结果返回啊。下面是代码:publicclassSSHClienti...
求用jsch网络工具包通过ssh连接远程oracle数据库(数据库在unix上)java代码例子: 为何jsch发送:sqlplus user/pwd@service 此命令,却没有结果返回啊。下面是代码:
public class SSHClient implements ConnClient {
private Logger log=Logger.getLogger(SSHClient.class);
private int sessiontimeout = 6000;
private String addr;
private int port = 22;
private String username;
private String password;
Session session = null;
Channel channel = null;
ChannelExec execChannel = null;
public SSHClient(String addr) {
this.addr = addr;
}
public SSHClient(String addr, int port) {
this.addr = addr;
this.port = port;
}
public boolean connect(String username, String password) {
JSch jsch = new JSch();
try {
session = jsch.getSession(username, addr, port);
session.setUserInfo(new MyUserInfo(password));
session.setConfig("StrictHostKeyChecking", "no");
// session.setPassword(password);
session.connect(sessiontimeout);
} catch (JSchException e) {
log.error("SSHClient Connect Error :"+e.getMessage());
return false;
}
return true;
}
public String execcmd(String cmd) {
try {
channel = session.openChannel("exec");
execChannel = (ChannelExec) channel;
execChannel.setCommand(cmd);
execChannel.connect();
BufferedReader fromServer;
fromServer = new java.io.BufferedReader(new InputStreamReader(
(execChannel.getInputStream())));
StringBuffer sb = new StringBuffer();
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// while (fromServer.ready()) {
// String tt = fromServer.readLine();
// sb.append(tt + '\n');
// }
String tt=null;
while ((tt=fromServer.readLine())!=null) {
sb.append(tt + '\n');
}
fromServer.close();
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
execChannel.disconnect();
}
}
public void close() {
if (session != null) {
session.disconnect();
}
}
/**
* @param args
*/
public static void main(String[] args) {
SSHClient ssh = new SSHClient("192.168.4.126", 22);
ssh.connect("abc", "abc");
String ret = ssh.execcmd("ps -ef|grep java ");//这个可以返回结果,但连接oracle数据库sqlplus命令却无结果显示
System.out.println(ret);
ssh.close();
}
public static class MyUserInfo implements UserInfo {
MyUserInfo(String password){
this.passwd=password;
}
String passwd = null;
public String getPassword() {
return passwd;
}
public boolean promptYesNo(String str) {
return true;
}
public String getPassphrase() {
return null;
}
public boolean promptPassphrase(String message) {
return true;
}
public boolean promptPassword(String message) {
return true;
}
public void showMessage(String message) {
}
}
}
=======================问题我已解决
可以将要执行的oracle查询写到shell脚本中:
#!/bin/bash
. ${HOME}/.profile
sqlplus -s xx/yy@lc8 <
set linesize 1000;
select * from mon_type;
quit
!
然后读取此脚本转为字符串,
String cmdValue =readFile();
String ret = client.execcmd(cmdValue);
System.out.println("["+ret+"]");
这样就有返回结果了。
或者:
注意发送的shell命令的写法:注意加上环境配置的profile,并且以\n换行
String cmdValue = "cd;. ${HOME}/.profile;sqlplus monitor/monitor@lcims8 <
String ret = client.execcmd(cmdValue);
这样ret就有结果返回了。
sysbase写法:
cmdValue="cd;. ${HOME}/.profile;isql -Uxx -Pyy -SUSER_SERVER7 -w400<
select top 2 * from M_C00\ngo";
展开
jsch连接mysql_求用jsch网络工具包通过ssh连接远程oracle数据库并发送sql操作语句(数据库在unix上)java代码例子...