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

Use PuTTY Key for SFTP Authentication

See more SFTP Examples

Demonstrates how to authenticate with a username + .ppk PuTTY private key for SFTP authentication.

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.SFtp,
  Chilkat.SshKey;

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

procedure RunDemo;
var
  success: Boolean;
  sftp: TSFtp;
  puttyKey: TSshKey;
  ppkText: string;
  sshHostname: string;
  sshPort: Integer;

begin
  success := False;

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

  sftp := TSFtp.Create;

  //  Load a .ppk PuTTY private key.
  puttyKey := TSshKey.Create;
  ppkText := puttyKey.LoadText('qa_data/ppk/putty_private_secret.ppk');

  //  The ppkText contains this content:

  //  	PuTTY-User-Key-File-2: ssh-rsa
  //  	Encryption: aes256-cbc
  //  	Comment: rsa-key-20170126
  //  	Public-Lines: 6
  //  	AAAAB3NzaC1yc2EAAAABJQAAAQEAx+52s7vvaZ8rT2UdFZWlSUVDHDQ+5ZRFvgRW
  //  	6nm2sO1c9WqNg7u2PQL4jeKSDX2XWcMnpleALz2x8Rr4rMy5E1iZzvWov8VtFd8l
  //  	fa9HOkgEeJB3VFuYR3NlnD3eyCoYJYPVpHJHrIeui2WZs5vQ76HDe+th8+z5Ald4
  //  	zPw3p2c6ZJpBrkSBM67hWokoBDi23c7NhszDHhJBrv+B98cQxnagI1PUKqN7E8Vg
  //  	bNtBI8beIMHyI69up9G1AXSEi0cGIjYNx9RNUPau1mRk/SvfqxgWkAjM005lj7hc
  //  	bOsjbdKK3T2NtrKTaYjEiXlEXcj1iGuApsD/m73pYaEJB3Nd7w==
  //  	Private-Lines: 14
  //  	MoaDbq0owouN/7Z9Pga0favDhM2bSEgMErJBxdDmNUXIVVcUoLiD/Ps1RA+BeBBX
  //  	wxqKUt9PqLy/pnafPR/i2xjJiQtQ0CWkPxND16Gi1dqLzmbQYYl1ev4+LzuG0zNX
  //  	HDGMvRiwagY7mY+F1tUjBYfOL6z8XHw4m40YcY1QorOO+0MMzAVT5Hkg8YyXW209
  //  	B/V/LRADFMVA2BlL39y11cb5ZpFStPH/waYUMY+2w1ZmJZ7dcRoMjuKmY+YE/tUx
  //  	n9X3P0qTNSbw6e6sMG3Dhr1vfoJUQWApUliD6GpUiCeIvXBcVqG8Vsfq9XADsPl0
  //  	+nFAwjSZflywcB7/FwhGb7q5UmcJK06SzoMl7Og5e3g7NCs3yNNQIv+qCpDjhxrA
  //  	hpT03mbipu7OXCZDeUwUhMGJAmYHE5iqm1rPCsSVbaMgpxhCWf01Cx4gLx3aMvn4
  //  	MdylA31GuL3wSxcWTslrOI8+449lZN/qZEnGEZkYTrnlu123jTqsAWMMtuHSz2Ig
  //  	6GA89oTdlppkNflhNH3OJ85kMUrc3p/ZBMdndz8jTDTljmJjHR5oNMoShFof115A
  //  	nWjUHqBwCgcubLYyH3afDvBTOhtl0tJ9Oby0wJlOAGnCXiPSDbF/y7J7xml/PS9t
  //  	XlSVNxtAY15NDO6Fp96sBVfKuJsfJ90PzdBom4ikIuf7sMwtElrHHLuYfcXJQYLp
  //  	G5jBmqDgnirosVPEBIxlxFzz/HCRmdU+tsYg46gqI4R5UpKUe8WSaJoZkDGsrqhm
  //  	e+1SJaBuafR4v2bx/bV414Hg7LGQosK2S3crxH4UgZl+g02vWznZfBH+9CmHvKDR
  //  	AxfcKOTzsaILKJtQPV81lmJ45sARYMcB5jMiE4kBg56hiXouChsvKkm55WVcW1E+
  //  	Private-MAC: 17512c9f7582c1d9c3ae2b01b4d67a6b1dbd1d0e

  //  "secret" is the actual password for the above PPK.
  puttyKey.Password := 'secret';
  success := puttyKey.FromPuttyPrivateKey(ppkText);
  if (success <> True) then
    begin
      WriteLn(puttyKey.LastErrorText);
      Exit;
    end;

  sshHostname := 'sftp.example.com';
  sshPort := 22;

  //  Connect to an SSH/SFTP server
  success := sftp.Connect(sshHostname,sshPort);
  if (success <> True) then
    begin
      WriteLn(sftp.LastErrorText);
      Exit;
    end;

  //  Authenticate with the SSH server using a username + private key.
  //  (The private key serves as the password.  The username identifies
  //  the SSH user account on the server.)
  success := sftp.AuthenticatePk('mySshLogin',puttyKey);
  if (success <> True) then
    begin
      WriteLn(sftp.LastErrorText);
      Exit;
    end;

  WriteLn('OK, the connection and authentication with the SSH server is completed.');

  //  This example is only to show the connection + authentication using a PuTTY private key...


  sftp.Free;
  puttyKey.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.