此程序需要ganymed-ssh2-build210.jar包。
下载地址:
http://www.ganymed.ethz.ch/ssh2/
为了调试方便,可以将\ganymed-ssh2-build210\src下的代码直接拷贝到我们的工程里,
此源码的好处就是没有依赖很多其他的包,拷贝过来干干净净。
此程序的目的是执行远程机器上的Shell脚本。
远程机器IP:***.**.**.***
用户名:sshapp
密码:sshapp
登录后用pwd命令,显示当前目录为:/sshapp.
在/sshapp/myshell/目录下有myTest.sh文件,内容如下:
public
class
RmtShellExecutor
{
private
Connection conn;
private
String ip;
private
String usr;
private
String psword;
private
String charset
=
Charset.defaultCharset().toString();
private
static
final
int
TIME_OUT
=
1000
*
5
*
60
;
public
RmtShellExecutor(ShellParam param)
{
this
.ip
=
param.getIp();
this
.usr
=
param.getUsername();
this
.psword
=
param.getPassword();
}
public
RmtShellExecutor(String ip, String usr, String ps)
{
this
.ip
=
ip;
this
.usr
=
usr;
this
.psword
=
ps;
}
private
boolean
login()
throws
IOException
{
conn
=
new
Connection(ip);
conn.connect();
return
conn.authenticateWithPassword(usr, psword);
}
public
int
exec(String cmds)
throws
Exception
{
InputStream stdOut
=
null
;
InputStream stdErr
=
null
;
String outStr
=
""
;
String outErr
=
""
;
int
ret
=
-
1
;
try
{
if
(login())
{
//
Open a new {@link Session} on this connection
Session session
=
conn.openSession();
//
Execute a command on the remote machine.
session.execCommand(cmds);
stdOut
=
new
StreamGobbler(session.getStdout());
outStr
=
processStream(stdOut, charset);
stdErr
=
new
StreamGobbler(session.getStderr());
outErr
=
processStream(stdErr, charset);
session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);
System.out.println(
"
outStr=
"
+
outStr);
System.out.println(
"
outErr=
"
+
outErr);
ret
=
session.getExitStatus();
}
else
{
throw
new
AppException(
"
登录远程机器失败
"
+
ip);
//
自定义异常类 实现略
}
}
finally
{
if
(conn
!=
null
)
{
conn.close();
}
IOUtils.closeQuietly(stdOut);
IOUtils.closeQuietly(stdErr);
}
return
ret;
}
private
String processStream(InputStream in, String charset)
throws
Exception
{
byte
[] buf
=
new
byte
[
1024
];
StringBuilder sb
=
new
StringBuilder();
while
(in.read(buf)
!=
-
1
)
{
sb.append(
new
String(buf, charset));
}
return
sb.toString();
}
public
static
void
main(String args[])
throws
Exception
{
RmtShellExecutor exe
=
new
RmtShellExecutor(
"
***.**.**.***
"
,
"ssh
app
"
,
"sshapp
"
);
//
执行myTest.sh 参数为java Know dummy
System.out.println(exe.exec(
"
sh /webapp/myshell/myTest.sh java Know dummy
"
));
//
exe.exec("uname -a && date && uptime && who");
}
}
此方法通过远程命令取得Exit Code/status。但并不是每个server设计时都会返回这个值,如果没有则会返回null。
在调用getExitStatus时,要先调用WaitForCondition方法,通过ChannelCondition.java接口的定义可以看到每个条件的具体含义
而getExitStatus的返回值,可以认为是此次执行是否OK的标准。