Here is example code. Tested against Linux run OpenSSH.
@ Ehud, I wasn't able to get it to work with openChannel("session").
Any ideas why?
import java.io.InputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class SuExample {
public static void main(String[] arg) throws Exception {
JSch jsch = new JSch();
String host = "host";
// user we intially connect as
String user1 = "user1";
String password1 = "XXXXXXX";
// user we want to su - to.
String user2 = "user2";
String password2 = "YYYYYYY";
Session session = jsch.getSession(user1, host, 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(password1);
session.connect();
Channel channel = session.openChannel("shell");
// create the IO streams to send input to remote session.
PipedOutputStream commandIO = new PipedOutputStream();
InputStream sessionInput = new PipedInputStream(commandIO);
// this set's the InputStream the remote server will read from.
channel.setInputStream(sessionInput);
// this will have the STDOUT from server.
InputStream sessionOutput = channel.getInputStream();
// this will have the STDERR from server
InputStream sessionError = channel.getExtInputStream();
channel.connect();
String command;
command = "su - " + user2 + "\n";
commandIO.write(command.getBytes());
commandIO.flush();
// Read input until we get the 'Password:' prompt
byte[] tmp = new byte[1024];
String stdOut = "";
String stdErr = "";
int i;
while (true) {
if (sessionError.available() > 0) {
i = sessionError.read(tmp, 0, tmp.length);
if (i < 0) {
System.err.println("input stream closed
earlier than expected");
System.exit(1);
}
stdErr += new String(tmp, 0, i);
}
if (sessionOutput.available() > 0) {
i = sessionOutput.read(tmp, 0, tmp.length);
if (i < 0) {
System.err.println("input stream closed
earlier than expected");
System.exit(1);
}
stdOut += new String(tmp, 0, i);
}
if (stdOut.contains("assword")) {
break;
}
Thread.sleep(1000);
}
command = password2 + "\n";
commandIO.write(command.getBytes());
commandIO.flush();
// The rest of the commands are just for dem
commandIO.write("whoami\n".getBytes());
commandIO.flush();
// logout from user2
commandIO.write("exit\n".getBytes());
commandIO.write("whoami\n".getBytes());
// logout from user1
commandIO.write("exit\n".getBytes());
// read and print output.
while ((i = sessionOutput.read(tmp, 0, tmp.length)) != -1) {
System.out.println(new String(tmp, 0, i));
}
// cleanup.
commandIO.close();
sessionInput.close();
channel.disconnect();
session.disconnect();
}
}
On Tue, Apr 27, 2010 at 3:32 PM, Vivien Duparc <[email protected]> wrote:
>
> Is there no way to connect remote host with a user and when connected made a
> 'su - user2' command (command that need to give a password) without asking
> anything to the application user ?
> I begin to believe it's impossible.
> Thanks for your help.
>
> Le 24 avr. 2010 à 01:47, Keith Alan Richardson <[email protected]> a
> écrit :
>
> There is no documentation. Look at the examples directory
>
> For running commands remotely, even su, look at Exec.java in the examples
> directory
>
> On Apr 23, 2010 2:41 PM, "Vivien Duparc" <[email protected]> wrote:
>
> Hi,
>
> I'm a new user of api jsch and i have two question please
>
> First, is There any doc anywhere ? Or the only help for beginner are
> examples ?
>
> Second, do you know how to execute an su command please ?
>
> Thx.
>
>
> ------------------------------------------------------------------------------
> _______________________________________________
> JSch-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/jsch-users
------------------------------------------------------------------------------
_______________________________________________
JSch-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jsch-users