Hi,
I'm using jsch 0.1.37 and I have a class that does an SSHExec.
I basically want it to trap all stdout and stderr messages and pass them
along (with the exit status) to another client class.
The problem I'm having is that when I execute a shell script that does:
exit 1
jsch throws an Exception:
java.lang.Exception: An unknown error occured on the remote host while
running the command: ...
Is there a way to tell jsch not to throw an exception if exit status is 1?
I want it to throw other exceptions.... host not found, etc.
In my code, I've put some traces to see where the exception is being
throw, but I can't even figure that out.
Here's my code:
public class SSHExecRunner {
private static final int SSH_PORT = 22;
private static final int RETRY_INTERVAL = 1000;
private static final String TIMEOUT_MESSAGE = "Timeout period
exceeded, connection dropped.";
private SSHUserInfo userInfo;
private SSHExecVariable sshvars;
private String knownHosts;
private int port;
private Thread thread = null;
private SSHExecRunner() {
// private constructor
}
private SSHExecRunner(final SSHExecVariable _sshvars) {
this.sshvars = _sshvars;
this.userInfo = new SSHUserInfo();
userInfo.setKeyfile(sshvars.keyfile);
userInfo.setName(sshvars.username);
userInfo.setPassphrase(sshvars.passphrase);
userInfo.setPassword(sshvars.password);
userInfo.setTrust(sshvars.trust);
this.knownHosts = sshvars.knownhosts;
if (knownHosts == null || "".equals(knownHosts)) {
this.knownHosts = System.getProperty("user.home") +
"/.ssh/known_hosts";
}
this.port = SSH_PORT;
if (sshvars.port > -1) {
this.port = sshvars.port;
}
}
/**
* SSHExec.run performs the actual ssh connection and runs the
command on the remote host. It uses an SSHExecVariable for it's
configuration and
* returns results via an SSHExecResult
*
* @param sshvars
* the sshvars
*
* @return the sSH exec result
* @throws JSchException
*/
public static SSHExecResult run(final SSHExecVariable sshvars) throws
Exception {
System.out.println("ssh runner starting");
final SSHExecRunner runner = new SSHExecRunner(sshvars);
SSHExecResult result = null;
Session session = null;
try {
session = runner.openSession();
result = runner.executeCommand(session, sshvars.command);
} catch (final Exception e) {
System.out.println("caught exception in runner");
throw e;
} finally {
if (session != null && session.isConnected()) {
session.disconnect();
}
}
return result;
}
/**
* Open an ssh session.
*
* @return the opened session
* @throws JSchException
* on error
*/
private Session openSession() throws JSchException {
final JSch jsch = new JSch();
if (null != userInfo.getKeyfile()) {
jsch.addIdentity(userInfo.getKeyfile());
}
if (!userInfo.getTrust() && knownHosts != null) {
jsch.setKnownHosts(knownHosts);
}
final Session session = jsch.getSession(userInfo.getName(),
sshvars.host, port);
session.setUserInfo(userInfo);
session.connect();
return session;
}
private SSHExecResult executeCommand(final Session session, final
String cmd) throws Exception {
final ByteArrayOutputStream os = new ByteArrayOutputStream();
final ByteArrayOutputStream es = new ByteArrayOutputStream();
String out = "";
String err = "";
int ec = 0;
try {
System.out.println("trying to execute ssh command");
final ChannelExec channel;
session.setTimeout(sshvars.sshtimeout);
/* execute the command */
channel = (ChannelExec) session.openChannel("exec");
channel.setCommand(cmd);
channel.setOutputStream(os);
channel.setExtOutputStream(es);
channel.connect();
// wait for it to finish
thread = new Thread() {
@Override
public void run() {
while (!channel.isClosed()) {
if (thread == null) {
return;
}
try {
sleep(RETRY_INTERVAL);
} catch (final Exception e) {
System.out.println("error sleeping " + e.getMessage());
}
}
}
};
thread.start();
thread.join(sshvars.sshtimeout);
if (thread.isAlive()) {
// ran out of time
thread = null;
throw new Exception(TIMEOUT_MESSAGE);
} else {
// success
out = os.toString();
err = es.toString();
ec = channel.getExitStatus();
}
return new SSHExecResult(ec, out, err);
} catch (final Exception e) {
System.out.println("caught exception in wrapper");
throw e;
} finally {
if (os != null) {
os.close();
}
if (es != null) {
es.close();
}
}
}
}
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
JSch-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jsch-users