SSH URL connection protocol implementation in Java for stateless calls
Handler.java
package sun.net.www.protocol.ssh;
import java.io.IOException;
import java.net.Proxy;
import java.net.URL;
import java.net.UnknownHostException;
public class Handler extends java.net.URLStreamHandler{
@Override protected URLConnection openConnection(URL u) throws UnknownHostException, IOException {
URLConnection result=new URLConnection(u);
return result;
}
@Override
protected URLConnection openConnection(URL u, Proxy p)
throws UnknownHostException, IOException {
URLConnection result = new URLConnection(u);
return result;
}
}
URLConnection.java
package sun.net.www.protocol.ssh;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.UnknownHostException;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
public class URLConnection extends java.net.URLConnection {
private Session session;
protected URLConnection(URL url$) throws UnknownHostException, IOException {
super(url$);
String userInfo = url$.getUserInfo();
if (userInfo == null)
userInfo = ":";
if (userInfo.length() == 0)
userInfo = ":";
String[] userPass = url$.getUserInfo().split("\\:");
try {
Connection connection = new Connection(url$.getHost(), url$
.getPort(), userPass[0], userPass[1]);
session = connection.openSession();
} catch (Throwable t) {
throw new IOException("Failed to connect to ssh://" + userPass[0]
+ "@" + url$.getHost() + ":" + url$.getPort());
}
}
@Override
public void connect() {
try {
session.execCommand(getURL().getQuery());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public InputStream getInputStream() {
return session.getStdout();
}
@Override
public OutputStream getOutputStream() {
return session.getStdin();
}
public InputStream getErrorStream() {
return session.getStderr();
}
}
usage.java
URL url = new URL(
"ssh://user:password@host?ksh -c ls");
URLConnection c=url.openConnection();
c.connect();
InputStream is=c.getInputStream();
for(;;) {
int i=is.read();
if(i<0)break;
}