Sample code for 30+ languages & platforms
Java

Start a Remote Shell with QuickShell

See more SSH Examples

Demonstrates the Chilkat Ssh.QuickShell method, which starts a remote shell using the simplified sequence OpenSessionChannel → SendReqPty → SendReqShell. It takes no arguments and returns the shell channel number, or -1 on failure. The default PTY size is 80 columns by 24 rows.

Background: Note that QuickShell does allocate a PTY, so unlike a bare SendReqShell the remote shell runs interactively: it prints a command prompt, echoes the commands you send, and runs interactive login scripts. That is convenient for terminal-style work but means the output contains prompts and echoed input that scripted parsing must tolerate. The method returns as soon as the shell request is accepted — it does not consume the initial login text or prompt, so read and discard that before relying on command output.

Chilkat Java Downloads

Chilkat2 Java
import com.chilkatsoft.chilkat2.ChilkatException;
import com.chilkatsoft.chilkat2.Ssh;

public class ChilkatExample {

    public static void main(String[] args) {
        // Demonstrates the Ssh.QuickShell method, which starts a remote shell using the simplified
        // sequence OpenSessionChannel, SendReqPty, and SendReqShell.  It takes no arguments and returns
        // the shell channel number, or -1 on failure.  The default PTY size is 80 columns by 24 rows.

        Ssh ssh = new Ssh();

        int sshPort = 22;
        try {
            ssh.connect("ssh.example.com", sshPort);
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        // Normally you would not hard-code the password in source.  You should instead obtain it
        // from an interactive prompt, environment variable, or a secrets vault.
        String password = "mySshPassword";

        try {
            ssh.authenticatePw("mySshLogin", password);
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        // Start the shell.  Note that QuickShell allocates a PTY, so the remote shell runs
        // interactively: it prints a command prompt and echoes the commands that are sent to it.
        int channelNum = ssh.quickShell();
        if (channelNum < 0) {
            System.out.println(ssh.getLastErrorText());
            return;
        }

        // QuickShell returns as soon as the shell request is accepted -- it does not wait for or
        // consume the initial login text or prompt.
        try {
            ssh.channelSendString(channelNum, "uname -a; echo DONE_MARKER\n", "utf-8");
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        // IMPORTANT: Set a read timeout before receiving until a match.  ReadTimeoutMs defaults to 0,
        // which means no limit -- without it, this call waits forever if the received data never
        // contains a match.
        ssh.setReadTimeoutMs(15000);

        boolean caseSensitive = false;
        String output;
        try {
            ssh.channelReceiveUntilMatch(channelNum, "DONE_MARKER", "utf-8", caseSensitive);

            output = ssh.getReceivedText(channelNum, "utf-8");
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        System.out.println(output);

        ssh.disconnect();
    }
}