| /* |
| * |
| * 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. |
| * |
| */ |
| |
| /** |
| * User: AmilaJ (amilaj@apache.org) |
| * Date: 8/6/13 |
| * Time: 1:08 PM |
| */ |
| |
| |
| |
| /* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */ |
| /** |
| * This program will demonstrate remote exec. |
| * $ CLASSPATH=.:../build javac Exec.java |
| * $ CLASSPATH=.:../build java Exec |
| * You will be asked username, hostname, displayname, passwd and command. |
| * If everything works fine, given command will be invoked |
| * on the remote side and outputs will be printed out. |
| * |
| */ |
| |
| import com.jcraft.jsch.*; |
| import org.apache.airavata.gsi.ssh.jsch.ExtendedJSch; |
| |
| import javax.swing.*; |
| import java.awt.*; |
| import java.io.InputStream; |
| |
| /** |
| * A main class that demonstrates GSI-SSH execution. |
| */ |
| public class SSHDemo { |
| |
| static { |
| JSch.setConfig("gssapi-with-mic.x509", "org.apache.airavata.gsi.ssh.GSSContextX509"); |
| JSch.setConfig("userauth.gssapi-with-mic", "com.jcraft.jsch.UserAuthGSSAPIWithMICGSSCredentials"); |
| System.setProperty("X509_CERT_DIR", |
| "/Users/thejaka/development/apache/airavata/sandbox/grid-tools/certificates"); |
| } |
| |
| public static void main(String[] arg) { |
| try { |
| |
| JSch jsch = new ExtendedJSch(); |
| |
| String host; |
| int port = 22; |
| |
| String inputString = JOptionPane.showInputDialog("Enter username@hostname:port", |
| "ogce@trestles.sdsc.edu"); |
| String user = inputString.substring(0, inputString.indexOf('@')); |
| |
| if (inputString.contains(":")) { |
| host = inputString.substring(inputString.indexOf('@') + 1, inputString.indexOf(':')); |
| String strPort = inputString.substring(inputString.indexOf(':') + 1); |
| port = Integer.parseInt(strPort); |
| |
| } else { |
| host = inputString.substring(inputString.indexOf('@') + 1); |
| } |
| |
| Session session = jsch.getSession(user, host, port); |
| |
| java.util.Properties config = new java.util.Properties(); |
| config.put("StrictHostKeyChecking", "no"); |
| session.setConfig(config); |
| |
| session.connect(); |
| |
| String command = JOptionPane.showInputDialog("Enter command", |
| "echo \"Hello World\""); |
| |
| Channel channel = session.openChannel("exec"); |
| ((ChannelExec) channel).setCommand(command); |
| |
| // X Forwarding |
| // channel.setXForwarding(true); |
| |
| //channel.setInputStream(System.in); |
| channel.setInputStream(null); |
| |
| //channel.setOutputStream(System.out); |
| |
| //FileOutputStream fos=new FileOutputStream("/tmp/stderr"); |
| //((ChannelExec)channel).setErrStream(fos); |
| ((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)); |
| } |
| if (channel.isClosed()) { |
| System.out.println("exit-status: " + channel.getExitStatus()); |
| break; |
| } |
| try { |
| Thread.sleep(1000); |
| } catch (Exception ignored) { |
| } |
| } |
| channel.disconnect(); |
| session.disconnect(); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| System.out.println(e); |
| } |
| } |
| |
| public static class MyUserInfo implements UserInfo, UIKeyboardInteractive { |
| public String getPassword() { |
| return passwd; |
| } |
| |
| public boolean promptYesNo(String str) { |
| Object[] options = {"yes", "no"}; |
| int foo = JOptionPane.showOptionDialog(null, |
| str, |
| "Warning", |
| JOptionPane.DEFAULT_OPTION, |
| JOptionPane.WARNING_MESSAGE, |
| null, options, options[0]); |
| return foo == 0; |
| } |
| |
| String passwd; |
| JTextField passwordField = (JTextField) new JPasswordField(20); |
| |
| public String getPassphrase() { |
| return null; |
| } |
| |
| public boolean promptPassphrase(String message) { |
| return true; |
| } |
| |
| public boolean promptPassword(String message) { |
| Object[] ob = {passwordField}; |
| int result = |
| JOptionPane.showConfirmDialog(null, ob, message, |
| JOptionPane.OK_CANCEL_OPTION); |
| if (result == JOptionPane.OK_OPTION) { |
| passwd = passwordField.getText(); |
| return true; |
| } else { |
| return false; |
| } |
| } |
| |
| public void showMessage(String message) { |
| JOptionPane.showMessageDialog(null, message); |
| } |
| |
| final GridBagConstraints gbc = |
| new GridBagConstraints(0, 0, 1, 1, 1, 1, |
| GridBagConstraints.NORTHWEST, |
| GridBagConstraints.NONE, |
| new Insets(0, 0, 0, 0), 0, 0); |
| private Container panel; |
| |
| public String[] promptKeyboardInteractive(String destination, |
| String name, |
| String instruction, |
| String[] prompt, |
| boolean[] echo) { |
| panel = new JPanel(); |
| panel.setLayout(new GridBagLayout()); |
| |
| gbc.weightx = 1.0; |
| gbc.gridwidth = GridBagConstraints.REMAINDER; |
| gbc.gridx = 0; |
| panel.add(new JLabel(instruction), gbc); |
| gbc.gridy++; |
| |
| gbc.gridwidth = GridBagConstraints.RELATIVE; |
| |
| JTextField[] texts = new JTextField[prompt.length]; |
| for (int i = 0; i < prompt.length; i++) { |
| gbc.fill = GridBagConstraints.NONE; |
| gbc.gridx = 0; |
| gbc.weightx = 1; |
| panel.add(new JLabel(prompt[i]), gbc); |
| |
| gbc.gridx = 1; |
| gbc.fill = GridBagConstraints.HORIZONTAL; |
| gbc.weighty = 1; |
| if (echo[i]) { |
| texts[i] = new JTextField(20); |
| } else { |
| texts[i] = new JPasswordField(20); |
| } |
| panel.add(texts[i], gbc); |
| gbc.gridy++; |
| } |
| |
| if (JOptionPane.showConfirmDialog(null, panel, |
| destination + ": " + name, |
| JOptionPane.OK_CANCEL_OPTION, |
| JOptionPane.QUESTION_MESSAGE) |
| == JOptionPane.OK_OPTION) { |
| String[] response = new String[prompt.length]; |
| for (int i = 0; i < prompt.length; i++) { |
| response[i] = texts[i].getText(); |
| } |
| return response; |
| } else { |
| return null; // cancel |
| } |
| } |
| } |
| |
| |
| } |