Sample code for 30+ languages & platforms
Objective-C

Multi-Hop SSH (SSH Through SSH)

See more SSH Examples

Demonstrates how to SSH through one SSH server to get to another SSH server. The scheme looks like this:
Application => ServerSSH1 => ServerSSH2

The ConnectThroughSsh method is added in Chilkat version 9.5.0.55 to accomplish this task. Technically, it should be possible to chain any number of servers using the ConnectThroughSsh multiple times:

Application => ServerSSH1 => ServerSSH2 ==> ServerSSH3 => ... => ServerSSHN

Chilkat Objective-C Downloads

Objective-C
#import <CkoSsh.h>
#import <NSString.h>

BOOL success = NO;

// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

CkoSsh *ssh1 = [[CkoSsh alloc] init];

// Hostname may be an IP address or domain name:
NSString *hostname = @"192.168.1.108";
NSString *port = 22;

// Connect directly to the 1st SSH server:
success = [ssh1 Connect: hostname port: port];
if (success != YES) {
    NSLog(@"%@",ssh1.LastErrorText);
    return;
}

// Wait a max of 15 seconds when reading responses..
ssh1.IdleTimeoutMs = [NSNumber numberWithInt:15000];

// Authenticate using login/password:
success = [ssh1 AuthenticatePw: @"myLogin" password: @"myPassword"];
if (success != YES) {
    NSLog(@"%@",ssh1.LastErrorText);
    return;
}

// Connect through the 1st SSH connection to reach a 2nd SSH server.
// Note: Any number of SSH connections may be simultaneously tunneled through a single
// existing SSH connection.
CkoSsh *ssh2 = [[CkoSsh alloc] init];
success = [ssh2 ConnectThroughSsh: ssh1 hostname: @"someremoteserver.com" port: [NSNumber numberWithInt: 22]];
if (success != YES) {
    NSLog(@"%@",ssh2.LastErrorText);
    return;
}

ssh2.IdleTimeoutMs = [NSNumber numberWithInt:15000];

// Authenticate with ssh2...
success = [ssh2 AuthenticatePw: @"myLogin2" password: @"myPassword2"];
if (success != YES) {
    NSLog(@"%@",ssh2.LastErrorText);
    return;
}

// The application may now is connected and authenticated with ssh2.
// The application can do whatever it desires just as if it was directly
// connected to ssh2.   For example, the application might open
// a session channel to send commands or start a remote shell..
int channelNum = [[ssh2 OpenSessionChannel] intValue];
if (channelNum < 0) {
    NSLog(@"%@",ssh2.LastErrorText);
    return;
}

// ...
// ...
// ...

// Close the connection with ssh2.  (This closes the the tunnel through ssh1.)
// The connection with ssh1 is still alive, and may be used for more connections.
[ssh2 Disconnect];

// ...
// ...
// ...

[ssh1 Disconnect];