java远程调用shell返回执行成功实际没执行。shell的脚本是一个清除一系列数据库临时表的脚本,清除语句后会打印清除成功,每清除一个表都会打印该表删除成功。操作系统是AIX5.3。直接登录运行没问题。但是用java调用脚本,再得到执行后操作系统打印的内容,和直接执行一样都显示每个表都清除成功。但实际上检查临时表没被删除。而直接登录执行shell是可以删除的。直接登录执行这个shell脚本大概要15分钟才能执行完。而用java调用则几秒钟就到最后一步了,打印最后一个表清除成功。怀疑是权限问题。但是用这个权限去连接控制的数据库查询、删除、插入操作均可执行。且直接登录的用户名就是java配置的中的用户名。请问有高手知道这是为什么么?代码恕小弟不能发出来。但据说是几个月前还可以的,一个多月前突然不知道为什么就不可以了。
解决方案 »
- Struts2运行错误:Error filterStart
- 新手求助,关于hbm.xml的问题
- 请问 ${}这个表达式是什么意思,哪里有介绍它的来源用法之类的文章
- hibernate问题
- 关于Ajax的使用
- Struts validation 的问题,请高手解说。
- Struts例子????
- 请问是否能把一个图片存入XML文档中,不是保存图片路径哟!是整个图片!
- 我的xml文件生成的jtree是通过TreeModel生成的结构,我想问一下如何把它转为DefaultTreeModel?谢谢
- 请问如何用java实现如图的整数类
- Ckeditor+Ckfinder网页编辑器上传路径如何设置
- 如何获取当年时间只显示年月日而不显示时分秒?
通过ssh登录,然后执行shell脚本么?shell脚本的stderr是重定向到stdout中?
什么代码这么神秘?敏感信息你可以去掉,用***代替嘛。
String[] result=new String[2];
MonitorCfg mc=MonitorCfg.getInstance();
TelnetNew telnet=new TelnetNew();
//是否连接成功标识
boolean flag=false;
try{
telnet.getDbTelnet();
flag=true;
}catch(Exception e){
//可能是超时,第二次连接
telnet.getDbTelnet();
flag=true;
}
if (flag) {
try {
// 执行shell命令
telnet.sendCmd(mc.getShellDir("db") + "/" + pm.getProcname()
+ " " + pm.getEtlDt());
String rInfo = "";
while ((rInfo = StringHelper.convertStringNull(telnet.getMsg()))
.indexOf("Fail") < 0
&& rInfo.indexOf("Succ") < 0) {
if (!rInfo.equals(""))
logger.info(rInfo);
continue;
}
logger.info(rInfo);
if (rInfo.trim().indexOf("Succ") > -1) {
result[0] = "1";
result[1] = "执行shell成功";
} else {
result[0] = "0";
result[1] = "执行shell失败";
}
} catch (IOException e) {
result[0] = "0";
result[1] = "执行shell失败";
logger.info("执行Shell发生异常:" + e.getMessage());
throw e;
} catch (InterruptedException e) {
result[0] = "0";
result[1] = "执行shell失败";
logger.info("执行Shell发生异常:" + e.getMessage());
throw e;
} finally {
if (telnet != null)
telnet.closeTelnet();
} pm.setSucc_flag(result[0]);
pm.setErrMsg(result[1]);
} else {
throw new Exception();
}
}
java远程执行,是通过ssh登录后执行的么?
private static Logger logger=Logger.getLogger(TelnetNew.class);
private TelnetWrapper tw=new TelnetWrapper();
/**
* 得到连接数据库服务器的TELNET类
* @throws IOException
*/
public void getDbTelnet() throws IOException{
MonitorCfg mc=MonitorCfg.getInstance();
try {
tw.connect(mc.getIp("db"),mc.getPort("db"));
tw.login(mc.getUser("db"), mc.getPassword("db"));
} catch (IOException e) {
logger.error("连接或登录主机发生异常:"+e.getMessage());
throw e;
}
}
/**
* 发送命令
* @param cmd
*/
public void sendCmd(String cmd) throws IOException{
try {
tw.send(cmd);
} catch (IOException e) {
logger.error("执行telnet命令发生异常:"+e.getMessage());
throw e;
}
}
/**
* 得到服务器信息
* @return
* @throws Exception
*/
public String getMsg() throws Exception{
String result="";
int readInt=0;
byte[] bytes=new byte[1024*50];
try {
Thread.sleep(300L);
readInt=tw.read(bytes);
result=new String(bytes,0,readInt);
} catch (Exception e) {
logger.error("得到服务器返回信息时发生异常:"+e.getMessage());
}
return result;
}
/**
* 关闭telnet
* @throws IOException
*/
public void closeTelnet() throws IOException{
try {
tw.disconnect();
} catch (IOException e) {
logger.error("关闭telnet时发生异常:"+e.getMessage());
}
}
输入:telnet
欢迎使用 Microsoft Telnet ClientEscape 字符是 'CTRL+]'Microsoft Telnet> open
( 到 )192.168.x.x
然后用户名,密码,执行shell。
2.我想看看你的shell脚本。
但是如果 通过 telnet 工具登陆到 AIX 服务器去执行该 shell 去调用程序向 数据库中插入数据是可以成功的。新手求指教