Search in sources :

Example 11 with ChannelExec

use of com.jcraft.jsch.ChannelExec in project azure-sdk-for-java by Azure.

the class TestVirtualMachineCustomData method createResource.

@Override
public VirtualMachine createResource(VirtualMachines virtualMachines) throws Exception {
    final String vmName = "vm" + this.testId;
    final String publicIpDnsLabel = SdkContext.randomResourceName("abc", 16);
    // Prepare the custom data
    //
    String cloudInitFilePath = getClass().getClassLoader().getResource("cloud-init").getPath();
    // In Windows remove leading slash
    cloudInitFilePath = cloudInitFilePath.replaceFirst("^/(.:/)", "$1");
    byte[] cloudInitAsBytes = Files.readAllBytes(Paths.get(cloudInitFilePath));
    byte[] cloudInitEncoded = Base64.encodeBase64(cloudInitAsBytes);
    String cloudInitEncodedString = new String(cloudInitEncoded);
    PublicIPAddress pip = pips.define(publicIpDnsLabel).withRegion(Region.US_EAST).withNewResourceGroup().withLeafDomainLabel(publicIpDnsLabel).create();
    VirtualMachine vm = virtualMachines.define(vmName).withRegion(pip.regionName()).withExistingResourceGroup(pip.resourceGroupName()).withNewPrimaryNetwork("10.0.0.0/28").withPrimaryPrivateIPAddressDynamic().withExistingPrimaryPublicIPAddress(pip).withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_16_04_LTS).withRootUsername("testuser").withRootPassword("12NewPA$$w0rd!").withCustomData(cloudInitEncodedString).withSize(VirtualMachineSizeTypes.STANDARD_D3_V2).create();
    pip.refresh();
    Assert.assertTrue(pip.hasAssignedNetworkInterface());
    if (!MockIntegrationTestBase.IS_MOCKED) {
        JSch jsch = new JSch();
        Session session = null;
        ChannelExec channel = null;
        try {
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session = jsch.getSession("testuser", publicIpDnsLabel + "." + "eastus.cloudapp.azure.com", 22);
            session.setPassword("12NewPA$$w0rd!");
            session.setConfig(config);
            session.connect();
            // Try running the package installed via init script
            //
            channel = (ChannelExec) session.openChannel("exec");
            BufferedReader in = new BufferedReader(new InputStreamReader(channel.getInputStream()));
            channel.setCommand("pwgen;");
            channel.connect();
            String msg;
            while ((msg = in.readLine()) != null) {
                Assert.assertFalse(msg.startsWith("The program 'pwgen' is currently not installed"));
            }
        } catch (Exception e) {
            Assert.fail("SSH connection failed" + e.getMessage());
        } finally {
            if (channel != null) {
                channel.disconnect();
            }
            if (session != null) {
                session.disconnect();
            }
        }
    }
    return vm;
}
Also used : InputStreamReader(java.io.InputStreamReader) PublicIPAddress(com.microsoft.azure.management.network.PublicIPAddress) JSch(com.jcraft.jsch.JSch) ChannelExec(com.jcraft.jsch.ChannelExec) BufferedReader(java.io.BufferedReader) VirtualMachine(com.microsoft.azure.management.compute.VirtualMachine) Session(com.jcraft.jsch.Session)

Example 12 with ChannelExec

use of com.jcraft.jsch.ChannelExec in project GNS by MobilityFirst.

the class SSHClient method scpTo.

/**
   *
   * @param user
   * @param host
   * @param keyFile
   * @param lfile
   * @param rfile
   */
public static void scpTo(String user, String host, File keyFile, String lfile, String rfile) {
    if (verbose) {
        System.out.println("Remote copy file from " + lfile + " to " + host + "@" + user + ":" + rfile);
    }
    FileInputStream fis = null;
    try {
        JSch jsch = new JSch();
        Session session = authenticateWithKey(jsch, user, host, keyFile);
        // username and password will be given via UserInfo interface.
        UserInfo ui = new UserInfoPrompted();
        session.setUserInfo(ui);
        session.connect();
        boolean ptimestamp = true;
        // exec 'scp -t rfile' remotely
        String command = "scp " + (ptimestamp ? "-p" : "") + " -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();
        int ack = checkAck(in);
        if (ack != 0) {
            System.out.println("ACK was " + ack);
            return;
        }
        File _lfile = new File(lfile);
        if (ptimestamp) {
            command = "T " + (_lfile.lastModified() / 1000) + " 0";
            // The access time should be sent here,
            // but it is not accessible with JavaAPI ;-<
            command += (" " + (_lfile.lastModified() / 1000) + " 0\n");
            out.write(command.getBytes());
            out.flush();
            ack = checkAck(in);
            if (ack != 0) {
                System.out.println("ACK was " + ack);
                return;
            }
        }
        // send "C0644 filesize filename", where filename should not include '/'
        long filesize = _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();
        ack = checkAck(in);
        if (ack != 0) {
            System.out.println("ACK was " + ack);
            return;
        }
        // send a content of lfile
        fis = new FileInputStream(lfile);
        byte[] buf = new byte[1024];
        while (true) {
            int len = fis.read(buf, 0, buf.length);
            if (len <= 0) {
                break;
            }
            //out.flush();
            out.write(buf, 0, len);
        }
        fis.close();
        fis = null;
        // send '\0'
        buf[0] = 0;
        out.write(buf, 0, 1);
        out.flush();
        ack = checkAck(in);
        if (ack != 0) {
            System.out.println("ACK was " + ack);
            return;
        }
        out.close();
        channel.disconnect();
        session.disconnect();
    } catch (JSchException | IOException e) {
        GNSConfig.getLogger().severe(e.toString());
        try {
            if (fis != null) {
                fis.close();
            }
        } catch (Exception ee) {
        }
    }
}
Also used : JSchException(com.jcraft.jsch.JSchException) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) Channel(com.jcraft.jsch.Channel) OutputStream(java.io.OutputStream) UserInfo(com.jcraft.jsch.UserInfo) IOException(java.io.IOException) JSch(com.jcraft.jsch.JSch) FileInputStream(java.io.FileInputStream) ChannelExec(com.jcraft.jsch.ChannelExec) IOException(java.io.IOException) JSchException(com.jcraft.jsch.JSchException) File(java.io.File) Session(com.jcraft.jsch.Session)

Example 13 with ChannelExec

use of com.jcraft.jsch.ChannelExec in project GNS by MobilityFirst.

the class SSHClient method exec.

/**
   *
   * @param user
   * @param host
   * @param keyFile
   * @param command
   * @param useSudo
   * @param sudoPasswd
   */
public static void exec(String user, String host, File keyFile, String command, boolean useSudo, String sudoPasswd) {
    if (verbose) {
        System.out.println("Remote execute command on " + host + (useSudo ? " as root user: " : " as user " + user + ": ") + command);
    }
    try {
        JSch jsch = new JSch();
        Session session = authenticateWithKey(jsch, user, host, keyFile);
        // username and password will be given via UserInfo interface.
        UserInfo ui = new UserInfoPrompted();
        session.setUserInfo(ui);
        session.connect();
        if (command == null) {
            command = JOptionPane.showInputDialog("Enter command", "set|grep SSH");
        }
        Channel channel = session.openChannel("exec");
        if (useSudo && sudoPasswd != null) {
            ((ChannelExec) channel).setCommand("sudo -S -p '' " + command);
        } else if (useSudo) {
            ((ChannelExec) channel).setCommand("sudo -p '' " + command);
        } else {
            ((ChannelExec) channel).setCommand(command);
        }
        //      if (useSudo) {
        //        ((ChannelExec) channel).setCommand("sudo -S -p '' " + command);
        //      } else {
        //        ((ChannelExec) channel).setCommand(command);
        //      }
        // ??? NOT SURE WHY THIS IS HERE
        channel.setInputStream(null);
        InputStream in = channel.getInputStream();
        // prep the out channel so we can give a password if it is needed
        OutputStream out = null;
        if (useSudo && sudoPasswd != null) {
            out = channel.getOutputStream();
        }
        ((ChannelExec) channel).setErrStream(System.err);
        // WESTY ADDED THIS *****
        if (useSudo) {
            // fixes "you must have a tty to sudo" problem
            ((ChannelExec) channel).setPty(true);
        }
        channel.connect();
        // suppply the password for sudo
        if (out != null) {
            out.write((sudoPasswd + "\n").getBytes());
            out.flush();
        }
        byte[] tmp = new byte[MAXCOMMANDBYTES];
        while (true) {
            while (in.available() > 0) {
                int i = in.read(tmp, 0, MAXCOMMANDBYTES);
                if (i < 0) {
                    break;
                }
                if (!verbose) {
                    System.out.print("o");
                } else {
                    System.out.print(new String(tmp, 0, i));
                }
            }
            if (channel.isClosed()) {
                GNSConfig.getLogger().log(Level.FINE, "exit status: {0}", channel.getExitStatus());
                break;
            }
            try {
                Thread.sleep(1000);
            } catch (Exception ee) {
            }
        }
        channel.disconnect();
        session.disconnect();
    } catch (JSchException | IOException e) {
        e.printStackTrace();
        GNSConfig.getLogger().severe(e.toString());
    }
}
Also used : JSchException(com.jcraft.jsch.JSchException) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) Channel(com.jcraft.jsch.Channel) OutputStream(java.io.OutputStream) UserInfo(com.jcraft.jsch.UserInfo) IOException(java.io.IOException) JSch(com.jcraft.jsch.JSch) ChannelExec(com.jcraft.jsch.ChannelExec) IOException(java.io.IOException) JSchException(com.jcraft.jsch.JSchException) Session(com.jcraft.jsch.Session)

Example 14 with ChannelExec

use of com.jcraft.jsch.ChannelExec in project voltdb by VoltDB.

the class SSHTools method ScpTo.

// The Jsch method for SCP to.
// This code is direcly copied from the Jsch SCP sample program.
public boolean ScpTo(String local_file, String user, String key, String host, String remote_file) {
    FileInputStream fis = null;
    try {
        boolean ptimestamp = true;
        String command = "scp " + (ptimestamp ? "-p" : "") + " -t " + remote_file;
        cmdLog.debug("CMD: '" + command + "'");
        JSch jsch = new JSch();
        // Set the private key
        if (null != key)
            jsch.addIdentity(key);
        Session session = jsch.getSession(user, host, 22);
        // To avoid the UnknownHostKey issue
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        // timeout after 5 seconds
        session.connect(5000);
        // exec 'scp -t rfile' remotely
        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();
        if (checkAck(in) != 0) {
            return false;
        }
        File _lfile = new File(local_file);
        if (ptimestamp) {
            command = "T " + (_lfile.lastModified() / 1000) + " 0";
            // The access time should be sent here,
            // but it is not accessible with JavaAPI ;-<
            command += (" " + (_lfile.lastModified() / 1000) + " 0\n");
            out.write(command.getBytes());
            out.flush();
            if (checkAck(in) != 0) {
                return false;
            }
        }
        // send "C0644 filesize filename", where filename should not include '/'
        long filesize = _lfile.length();
        command = "C0644 " + filesize + " ";
        if (local_file.lastIndexOf('/') > 0) {
            command += local_file.substring(local_file.lastIndexOf('/') + 1);
        } else {
            command += local_file;
        }
        command += "\n";
        out.write(command.getBytes());
        out.flush();
        if (checkAck(in) != 0) {
            return false;
        }
        // send a content of lfile
        fis = new FileInputStream(local_file);
        byte[] buf = new byte[1024];
        while (true) {
            int len = fis.read(buf, 0, buf.length);
            if (len <= 0)
                break;
            //out.flush();
            out.write(buf, 0, len);
        }
        fis.close();
        fis = null;
        // send '\0'
        buf[0] = 0;
        out.write(buf, 0, 1);
        out.flush();
        if (checkAck(in) != 0) {
            return false;
        }
        out.close();
        channel.disconnect();
        session.disconnect();
    } catch (Exception e) {
        System.out.println(e);
        try {
            if (fis != null)
                fis.close();
        } catch (Exception ee) {
        }
        return false;
    }
    return true;
}
Also used : FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) Channel(com.jcraft.jsch.Channel) OutputStream(java.io.OutputStream) FileOutputStream(java.io.FileOutputStream) JSch(com.jcraft.jsch.JSch) FileInputStream(java.io.FileInputStream) ChannelExec(com.jcraft.jsch.ChannelExec) IOException(java.io.IOException) File(java.io.File) Session(com.jcraft.jsch.Session)

Example 15 with ChannelExec

use of com.jcraft.jsch.ChannelExec in project voltdb by VoltDB.

the class SFTPSession method pipeListToShellCommand.

/**
     * Executes the given command with the given list as its input
     *
     * @param list input
     * @param command command to execute on remote host
     * @return the output of the command as a list
     * @throws {@link SSHException} when an error occurs during SSH
     *   command performed by this method
     */
public List<String> pipeListToShellCommand(final Collection<String> list, final String command) {
    Preconditions.checkArgument(command != null && !command.trim().isEmpty(), "specified empty or null command string");
    Preconditions.checkState(m_channel != null, "stale session");
    ChannelExec e = null;
    BufferedReader sherr = null;
    BufferedReader shout = null;
    List<String> shellout = new ArrayList<String>();
    try {
        try {
            e = (ChannelExec) m_channel.getSession().openChannel("exec");
        } catch (JSchException jex) {
            throw new SSHException("opening ssh exec channel", jex);
        }
        try {
            shout = new BufferedReader(new InputStreamReader(e.getInputStream(), Charsets.UTF_8));
        } catch (IOException ioex) {
            throw new SSHException("geting exec channel input stream", ioex);
        }
        try {
            sherr = new BufferedReader(new InputStreamReader(e.getErrStream(), Charsets.UTF_8));
        } catch (IOException ioex) {
            throw new SSHException("getting exec channel error stream", ioex);
        }
        if (list != null && !list.isEmpty()) {
            e.setInputStream(listAsInputStream(list));
        }
        e.setCommand(command);
        try {
            e.connect(5000);
            int retries = 50;
            while (!e.isClosed() && retries-- > 0) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ignoreIt) {
                }
            }
            if (retries < 0) {
                throw new SSHException("'" + command + "' timed out");
            }
        } catch (JSchException jex) {
            throw new SSHException("executing '" + command + "'", jex);
        }
        try {
            String outputLine = shout.readLine();
            while (outputLine != null) {
                shellout.add(outputLine);
                outputLine = shout.readLine();
            }
        } catch (IOException ioex) {
            throw new SSHException("capturing '" + command + "' output", ioex);
        }
        if (e.getExitStatus() != 0) {
            try {
                String errorLine = sherr.readLine();
                while (errorLine != null) {
                    shellout.add(errorLine);
                    errorLine = sherr.readLine();
                }
            } catch (IOException ioex) {
                throw new SSHException("capturing '" + command + "' error", ioex);
            }
            throw new SSHException("error output from '" + command + "':\n\t" + join(shellout, "\n\t"));
        }
        if (m_log.isDebugEnabled()) {
            m_log.debug("SSH: " + command);
        }
    } finally {
        if (sherr != null)
            try {
                sherr.close();
            } catch (Exception ignoreIt) {
            }
        if (shout != null)
            try {
                shout.close();
            } catch (Exception ignoreIt) {
            }
    }
    return shellout;
}
Also used : JSchException(com.jcraft.jsch.JSchException) InputStreamReader(java.io.InputStreamReader) BufferedReader(java.io.BufferedReader) ArrayList(java.util.ArrayList) IOException(java.io.IOException) ChannelExec(com.jcraft.jsch.ChannelExec) SftpException(com.jcraft.jsch.SftpException) IOException(java.io.IOException) JSchException(com.jcraft.jsch.JSchException)

Aggregations

ChannelExec (com.jcraft.jsch.ChannelExec)16 InputStream (java.io.InputStream)11 JSch (com.jcraft.jsch.JSch)7 Session (com.jcraft.jsch.Session)7 IOException (java.io.IOException)7 Channel (com.jcraft.jsch.Channel)6 JSchException (com.jcraft.jsch.JSchException)6 BufferedReader (java.io.BufferedReader)6 InputStreamReader (java.io.InputStreamReader)6 FileInputStream (java.io.FileInputStream)5 OutputStream (java.io.OutputStream)5 UserInfo (com.jcraft.jsch.UserInfo)3 File (java.io.File)3 SftpException (com.jcraft.jsch.SftpException)2 FileOutputStream (java.io.FileOutputStream)2 MachineException (org.eclipse.che.api.machine.server.exception.MachineException)2 VirtualMachine (com.microsoft.azure.management.compute.VirtualMachine)1 PublicIPAddress (com.microsoft.azure.management.network.PublicIPAddress)1 UserInfoPrompted (edu.umass.cs.aws.networktools.UserInfoPrompted)1 HeadlessException (java.awt.HeadlessException)1