Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Open a direct-tcpip Channel (SSH Port Forwarding)

See more SSH Examples

Demonstrates the Chilkat Ssh.OpenDirectTcpIpChannel method, which opens a direct-tcpip channel through the SSH server to a target host and port. The first argument is the target hostname and the second is the target port. It returns the channel number, or -1 on failure.

Background: This is SSH local port forwarding at the API level: the channel carries ordinary TCP traffic to a service that may be reachable only from the SSH server's network — a database, an internal web app, a message broker. The key detail is that the server resolves the target name, not your machine, so it must resolve and be reachable there. Supplying a numeric IPv4 address avoids remote DNS resolution entirely.

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Ssh;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  ssh: TSsh;
  sshPort: Integer;
  password: string;
  targetHostname: string;
  targetPort: Integer;
  channelNum: Integer;

begin
  success := False;

  //  Demonstrates the Ssh.OpenDirectTcpIpChannel method, which opens a direct-tcpip channel
  //  through the SSH server to a target host and port.  The 1st argument is the target hostname
  //  and the 2nd is the target port.  It returns the channel number, or -1 on failure.

  ssh := TSsh.Create;

  sshPort := 22;
  success := ssh.Connect('ssh.example.com',sshPort);
  if (success = False) then
    begin
      WriteLn(ssh.LastErrorText);
      Exit;
    end;

  //  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.
  password := 'mySshPassword';

  success := ssh.AuthenticatePw('mySshLogin',password);
  if (success = False) then
    begin
      WriteLn(ssh.LastErrorText);
      Exit;
    end;

  //  The target name is resolved by the SSH server, not by this computer, so it must be
  //  reachable from the server's network.
  targetHostname := 'db.internal.example.com';
  targetPort := 5432;
  channelNum := ssh.OpenDirectTcpIpChannel(targetHostname,targetPort);
  if (channelNum < 0) then
    begin
      WriteLn(ssh.LastErrorText);
      Exit;
    end;

  WriteLn('Opened direct-tcpip channel: ' + channelNum);

  //  The channel now carries ordinary TCP data to the target, tunneled over SSH.

  ssh.Disconnect();


  ssh.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.