Sample code for 30+ languages & platforms
Dart

SSH Tunnel Thread Activity Log

See more SSH Tunnel Examples

Demonstrates the tunnel-log properties KeepTunnelLog, TunnelLog, and TunnelLogPath, which record the activity of the SSH tunnel and client-manager threads.

Note: The log paths are relative to the application's current working directory. Absolute paths may also be used.

Background: This is the counterpart to the accept log, covering the SSH side rather than the listener: the tunnel and client-manager threads that actually move data. As with the accept log, KeepTunnelLog enables the in-memory TunnelLog while TunnelLogPath writes a separate file. Together the two logs let you localize a problem to either the accepting side or the forwarding side.

Chilkat Dart Downloads

Dart
import 'package:chilkat/chilkat.dart';

void main() {
  // Demonstrates the SshTunnel tunnel-log properties KeepTunnelLog, TunnelLog, and TunnelLogPath.
  // 
  // These log the activity of the SSH tunnel and client-manager threads.

  final tunnel = CkSshTunnel();

  // Retain the SSH tunnel-thread activity in memory so it can be read from the TunnelLog property.
  tunnel.keepTunnelLog = true;

  // Optionally also write the tunnel-thread activity to a file (separate from the in-memory log).
  tunnel.tunnelLogPath = 'qa_output/tunnel.log';

  tunnel.destHostname = 'db.internal.example.com';
  tunnel.destPort = 5432;

  final sshPort = 22;
  try {
    tunnel.connect('ssh.example.com', sshPort);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    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.
  final password = 'mySshPassword';

  try {
    tunnel.authenticatePw('mySshLogin', password);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  final listenPort = 1080;
  try {
    tunnel.beginAccepting(listenPort);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // ... clients transfer data through the tunnel ...

  // Read the accumulated in-memory tunnel log.
  print(tunnel.tunnelLog);

  final waitForThreadExit = true;
  try {
    tunnel.closeTunnel(waitForThreadExit);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }
}