I am in process to run shell script on remote server using Jsch where I managed to progress (Thanks for answered a question here) but my code still has couple of issue.
- It doesn't run commands in sequence and consistently given using printscreen.println() method.
- My program executes shell commands well in debug mode with some breakpoints but doesn't execute commands in run mode or without debug point(s).
commands in runScript method in ps.println() method which do not run in sequence consistently. also printResilt() method fails to print(execute) commands in run mode.
public void runScript(Channel channel) throws Exception {
// Gets an InputStream for this channel. All data arriving in as messages from the remote side can be read from this stream.
try {
OutputStream ops = channel.getOutputStream();
PrintStream ps = new PrintStream(ops, true);
channel.setOutputStream(System.out, true);
// Execute the command
channel.connect();
InputStream in = channel.getInputStream();
ps.println("sudo su - sudouser");
ps.println("ksh -x \"/path/to/script/shellscript.sh\" arg1 arg2 arg3 arg4 arg5 arg6 arg7");
ps.println("exit");
ps.close();
printResult(in, channel);
}
catch(IOException ioExp) {
ioExp.printStackTrace();
}
//retrieve the exit status of the remote command corresponding to this channel
//int exitStatus = channelExec.getExitStatus();
//Safely disconnect channel and disconnect session. If not done then it may cause resource leak
channel.disconnect();
session.disconnect();
}
/**
* @param input
* @param channel
*/
private static void printResult(InputStream in,
Channel channel) throws Exception
{
int SIZE = 1024;
byte[] tmp = new byte[SIZE];
while (true) {
try {
Thread.sleep(1000);
} catch (Exception ee) {}
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0)
break;
System.out.print(new String(tmp, 0, i));
}
if (channel.isClosed()) {
if(in.available() > 0) {
int i = in.read(tmp, 0, 1024);
System.out.print(new String(tmp, 0, i));
}
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
}
}
Main Method:
public class App
{
public static void main( String[] args ) throws Exception
{
try
{
SFTPUploader sftpUploader = new SFTPUploader();
ChannelSftp sftpChannel = sftpUploader.connectServer();
//close sftp channel after upload
sftpUploader.closeChannel(sftpChannel);
//open executable channel
Channel channel = sftpUploader.openChannel("shell");
//execute shell script
sftpUploader.runScript(channel);
}
catch(SftpException e) {
e.printStackTrace();
}
catch(JSchException jschExp) {
jschExp.printStackTrace();
}
}
}