/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.common;
import com.jcraft.jsch.*;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
import java.io.InputStream;
/**
* Remote Execution of commands or any other utility on a remote machine.
*/
public class RemoteExecution {
static final Log LOG = LogFactory.
getLog(RemoteExecution.class);
static String rsaOrDsaFileName = "id_dsa";
public RemoteExecution() throws Exception {
}
/**
* Execute command at remoteNode.
* @param JotTracker Client HostName, username provided,
* command to be executed remotely.
* @return void
*/
public static void executeCommand(String jtClientHostName, String user,
String command) throws Exception {
JSch jsch = new JSch();
Session session = jsch.getSession(user, jtClientHostName, 22);
jsch.setKnownHosts("/homes/" + user + "/.ssh/known_hosts");
jsch.addIdentity("/homes/" + user + "/.ssh/" + rsaOrDsaFileName);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect(30000); // making a connection with timeout.
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);
InputStream in = channel.getInputStream();
channel.connect();
byte[] tmp = new byte[1024];
while(true) {
while(in.available()>0){
int i=in.read(tmp, 0, 1024);
if(i<0)break;
System.out.print(new String(tmp, 0, i));
LOG.info(new String(tmp, 0, i));
}
if(channel.isClosed()){
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
try{Thread.sleep(1000);}catch(Exception ee){ee.printStackTrace();}
}
channel.disconnect();
session.disconnect();
}
/**
* Execute command at remoteNode.
* @param JotTracker Client HostName, username provided,
* comamnd to be executed remotely, rsaOrDsaFileName to be found under .ssh.
* @return void
*/
public static void executeCommand(String jtClientHostName, String user,
String command, String rsaDsaFileName) throws Exception {
rsaOrDsaFileName = rsaDsaFileName;
executeCommand(jtClientHostName, user, command);
}
}