/* * Copyright (C) 2004 Anthony Smith * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * ---------------------------------------------------------------------------- * TITLE $Id$ * --------------------------------------------------------------------------- * * --------------------------------------------------------------------------*/ import com.jcraft.jsch.*; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; /** * class description * * @author Anthony Smith * @version $Revision$ */ public class ScpTo { /** * DOCUMENT ME! * * @param arg DOCUMENT ME! */ public static void main(String[] arg) { if (arg.length != 2) { System.err.println("usage: java ScpTo file1 user@remotehost:file2"); System.exit(-1); } try { String lfile = arg[0]; String user = arg[1].substring(0, arg[1].indexOf('@')); arg[1] = arg[1].substring(arg[1].indexOf('@') + 1); String host = arg[1].substring(0, arg[1].indexOf(':')); String rfile = arg[1].substring(arg[1].indexOf(':') + 1); JSch jsch = new JSch(); Session session = jsch.getSession(user, host, 22); // username and password will be given via UserInfo interface. UserInfo ui = new MyUserInfo(); session.setUserInfo(ui); session.connect(); // exec 'scp -t rfile' remotely String command = "scp -t " + rfile; Channel channel = session.openChannel("exec"); ((ChannelExec) channel).setCommand(command); // get I/O streams for remote scp OutputStream out = channel.getOutputStream(); InputStream in = channel.getInputStream(); channel.connect(); byte[] tmp = new byte[1]; if (checkAck(in) != 0) { System.exit(0); } // send "C0644 filesize filename", where filename should not include '/' int filesize = (int) (new File(lfile)).length(); command = "C0644 " + filesize + " "; if (lfile.lastIndexOf('/') > 0) { command += lfile.substring(lfile.lastIndexOf('/') + 1); } else { command += lfile; } command += "\n"; out.write(command.getBytes()); out.flush(); if (checkAck(in) != 0) { System.exit(0); } // send a content of lfile FileInputStream fis = new FileInputStream(lfile); byte[] buf = new byte[1024]; while (true) { int len = fis.read(buf, 0, buf.length); if (len <= 0) { break; } out.write(buf, 0, len); out.flush(); } // send '\0' buf[0] = 0; out.write(buf, 0, 1); out.flush(); if (checkAck(in) != 0) { System.exit(0); } System.exit(0); } catch (Exception e) { System.out.println(e); } } static int checkAck(InputStream in) throws IOException { int b = in.read(); // b may be 0 for success, // 1 for error, // 2 for fatal error, // -1 if (b == 0) { return b; } if (b == -1) { return b; } if ((b == 1) || (b == 2)) { StringBuffer sb = new StringBuffer(); int c; do { c = in.read(); sb.append((char) c); } while (c != '\n'); if (b == 1) { // error System.out.print(sb.toString()); } if (b == 2) { // fatal error System.out.print(sb.toString()); } } return b; } /** * class description * * @author Anthony Smith * @version $Revision$ */ public static class MyUserInfo implements UserInfo { String passwd; JTextField passwordField = (JTextField) new JPasswordField(20); /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getPassword() { return passwd; } /** * DOCUMENT ME! * * @param str DOCUMENT ME! * * @return DOCUMENT ME! */ 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; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getPassphrase() { return null; } /** * DOCUMENT ME! * * @param message DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean promptPassphrase(String message) { return true; } /** * DOCUMENT ME! * * @param message DOCUMENT ME! * * @return DOCUMENT ME! */ 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; } } /** * DOCUMENT ME! * * @param message DOCUMENT ME! */ public void showMessage(String message) { JOptionPane.showMessageDialog(null, message); } } }