tags:

views:

4186

answers:

8

Scenerio: I'd like to run commands on remote machines from a Java program over ssh (I am using OpenSSH on my development machine). I'd also like to make the ssh connection by passing the password rather than setting up keys as I would with 'expect'.
Problem: When trying to do the 'expect' like password login the Process that is created with ProcessBuilder cannot seem to see the password prompt. When running regular non-ssh commands (e.g 'ls') I can get the streams and interact with them just fine. I am combining standard error and standard out into one stream with redirectErrorStream(true); so I am not missing it in standard error...When I run ssh with the '-v' option, I see all of the logging in the stream but I do not see the prompt. This is my first time trying to use ProcessBuilder for something like this. I know it would be easier to use Python, Perl or good ol' expect but my boss wants to utilize what we are trying to get back (remote log files and running scripts) within an existing Java program so I am kind of stuck.

Thanks in advance for the help!

+9  A: 

The prompt might only be shown when ssh is connected to a TTY, which it isn't in the case of Java.

There's probably a way to supply the password on the command-line in your ssh application. That will be the way to get past the prompt.

Alternately, consider connecting directly to the host server from native Java code rather than running an external application. There's a million libraries that will do this.

Jason Cohen
+2 for the Alternately, -1 for not going there first (calling it "alternately". Net is still a +1 :)
Bill K
I'd recommend paramiko for java, cleverly called jaramiko - http://www.lag.net/jaramiko/ . originally in Python, has been ported to Java. will make it easier to use python version when boss lets up :)
popcnt
+2  A: 

Most security minded programs don't use stdin/stdout for capturing passwords, they capture the TTY or some equivalent method.

Ryan Graham
+6  A: 

Rather than using an external ssh program, why not use a Java ssh library:

Are two I found with google - that'll avoid the problem that openssh will be working very hard to prevent entering the password on stdin - it'll be opening the terminal directly. expect has to work very hard to simulate a tty in order to work.

Douglas Leeder
+3  A: 

Why not use a Java ssh client? This one is BSD-licensed, and there are more clients listed here.

Jason Day
+1  A: 

I've used the trilead ssh client with a lot of success. I have also tried jsch (another java ssh client) and tunneling to the native ssh client under linux. Trilead was by far the best.

A: 

You can run commands using edtFTPj/PRO, as well as performing file transfers via SFTP. It's Java.

Bruce Blackshaw
A: 

Take a look at the very recently released SSHD, which is based on the Apache MINA project.

lupefiasco
A: 

plug: see this example of executing a command over ssh using sshj

shikhar