ssh_client.pas
来自「devent UniDAC 2.003 include sources」· PAS 代码 · 共 566 行 · 第 1/2 页
PAS
566 行
unit SSH_Client;
{$I ..\..\Base\SBDemo.inc}
interface
uses
Classes, SysUtils, DB,
Windows, Messages, Graphics, Controls, Forms, Dialogs,
DBCtrls, ExtCtrls, Grids, DBGrids, StdCtrls, ToolWin, ComCtrls,
Buttons, Spin, DemoFrame, MemDS, DBAccess, Uni, UniProvider,
UniDacVcl, ScBridge, ScSSHClient, ScSSHChannel, CRSSHIOHandler, CRVio,
{$IFNDEF CLR}
OracleUniProvider,
SQLServerUniProvider,
InterBaseUniProvider,
MySQLUniProvider,
PostgreSQLUniProvider
{$ELSE}
System.ComponentModel,
Devart.UniDac.Oracle.OracleUniProvider,
Devart.UniDac.SQLServer.SQLServerUniProvider,
Devart.UniDac.InterBase.InterBaseUniProvider,
Devart.UniDac.MySQL.MySQLUniProvider,
Devart.UniDac.PostgreSQL.PostgreSQLUniProvider
{$ENDIF}
;
type
TSSHClientFrame = class(TDemoFrame)
Panel1: TPanel;
Panel4: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Panel6: TPanel;
Panel7: TPanel;
Panel5: TPanel;
Label1: TLabel;
Label2: TLabel;
Label6: TLabel;
edSSHUserName: TEdit;
Label7: TLabel;
edSSHPassword: TEdit;
Label8: TLabel;
cbPrivateKey: TComboBox;
pnPassword: TPanel;
pnPrivateKey: TPanel;
rbLocalPF: TRadioButton;
rbDirect: TRadioButton;
btConnectDB: TSpeedButton;
btDisconnectDB: TSpeedButton;
DBGrid: TDBGrid;
btConnectSSH: TSpeedButton;
btDisconnectSSH: TSpeedButton;
ScSSHClient: TScSSHClient;
CRSSHIOHandler: TCRSSHIOHandler;
UniConnection: TUniConnection;
UniTable: TUniTable;
DataSource: TDataSource;
Label4: TLabel;
Label5: TLabel;
edSSHHost: TEdit;
edSSHPort: TEdit;
lbListenPort: TLabel;
Label10: TLabel;
edDBHost: TEdit;
Label11: TLabel;
Label12: TLabel;
edDBUserName: TEdit;
Label13: TLabel;
edDBPassword: TEdit;
Label14: TLabel;
Label3: TLabel;
rbPassword: TRadioButton;
rbPublicKey: TRadioButton;
Panel12: TPanel;
btKeyGen: TSpeedButton;
seDBPort: TSpinEdit;
ScFileStorage: TScFileStorage;
cbDBDatabase: TComboBox;
s: TPanel;
lbTableName: TLabel;
cbTableName: TComboBox;
Panel9: TPanel;
btOpen: TSpeedButton;
btClose: TSpeedButton;
DBNavigator: TDBNavigator;
Panel8: TPanel;
ScSSHChannel: TScSSHChannel;
seListenPort: TSpinEdit;
cbRandomization: TCheckBox;
lbProvider: TLabel;
cbProvider: TComboBox;
procedure rbLocalPFClick(Sender: TObject);
procedure rbDirectClick(Sender: TObject);
procedure rbPasswordClick(Sender: TObject);
procedure rbPublicKeyClick(Sender: TObject);
procedure edSSHUserNameChange(Sender: TObject);
procedure cbPrivateKeyDropDown(Sender: TObject);
procedure btConnectDBClick(Sender: TObject);
procedure btDisconnectDBClick(Sender: TObject);
procedure btConnectSSHClick(Sender: TObject);
procedure btDisconnectSSHClick(Sender: TObject);
procedure ScSSHClientAfterConnect(Sender: TObject);
procedure ScSSHClientAfterDisconnect(Sender: TObject);
procedure UniConnectionAfterConnect(Sender: TObject);
procedure UniConnectionAfterDisconnect(Sender: TObject);
procedure UniTableAfterClose(DataSet: TDataSet);
procedure UniTableAfterOpen(DataSet: TDataSet);
procedure btOpenClick(Sender: TObject);
procedure btCloseClick(Sender: TObject);
procedure cbTableNameDropDown(Sender: TObject);
procedure cbTableNameChange(Sender: TObject);
procedure edListenPortChange(Sender: TObject);
procedure cbPrivateKeyChange(Sender: TObject);
procedure btKeyGenClick(Sender: TObject);
procedure ScSSHClientServerKeyValidate(Sender: TObject;
NewServerKey: TScKey; var Accept: Boolean);
procedure cbDBDatabaseDropDown(Sender: TObject);
procedure cbDBDatabaseChange(Sender: TObject);
procedure UniConnectionBeforeConnect(Sender: TObject);
procedure ScSSHClientBeforeConnect(Sender: TObject);
private
procedure CheckRandomize;
procedure ShowPasswordAuth(pa: boolean);
procedure ShowSSHButtons;
procedure ShowDBButtons;
procedure EnableLPFComponents(Enabled: boolean);
{$IFDEF MSWINDOWS}
function LoadState: boolean;
function SaveState: boolean;
function KeyPath: string;
{$ENDIF}
public
destructor Destroy; override;
procedure DisconnectAll;
procedure Initialize; override;
procedure Finalize; override;
end;
var
SSHClientFrame: TSSHClientFrame;
implementation
{$IFDEF CLR}
{$R *.nfm}
{$ENDIF}
{$IFDEF WIN32}
{$R *.dfm}
{$ENDIF}
uses
{$IFDEF MSWINDOWS}
Registry,
{$ENDIF}
ScSSHUtil, ScConsts, SSHDacDemoForm;
destructor TSSHClientFrame.Destroy;
begin
DisconnectAll;
inherited;
end;
procedure TSSHClientFrame.Initialize;
begin
inherited;
{$IFDEF MSWINDOWS}
LoadState;
{$ENDIF}
EnableLPFComponents(rbLocalPF.Checked);
edSSHHost.Text := ScSSHClient.HostName;
edSSHPort.Text := IntToStr(ScSSHClient.Port);
edSSHUserName.Text := ScSSHClient.User;
UniProviders.GetProviderNames(cbProvider.Items);
end;
procedure TSSHClientFrame.Finalize;
begin
{$IFDEF MSWINDOWS}
SaveState;
{$ENDIF}
inherited;
end;
procedure TSSHClientFrame.CheckRandomize;
begin
if not SSHDacForm.Randomized and not cbRandomization.Checked then begin
SSHDacForm.Randomize;
if not SSHDacForm.Randomized and not cbRandomization.Checked then
raise Exception.Create('Data for the random generator has not been generated');
end;
end;
procedure TSSHClientFrame.DisconnectAll;
begin
UniConnection.Close;
ScSSHChannel.Disconnect;
ScSSHClient.Disconnect;
ShowSSHButtons;
end;
procedure TSSHClientFrame.ShowSSHButtons;
begin
btConnectSSH.Enabled := not ScSSHClient.Connected;
btDisconnectSSH.Enabled := ScSSHClient.Connected;
btConnectDB.Enabled := ScSSHClient.Connected and not UniConnection.Connected;
end;
procedure TSSHClientFrame.ShowDBButtons;
begin
btConnectDB.Enabled := not UniConnection.Connected;
btDisconnectDB.Enabled := UniConnection.Connected;
btOpen.Enabled := UniConnection.Connected and (cbTableName.Text <> '');
cbTableName.Enabled := UniConnection.Connected;
end;
procedure TSSHClientFrame.ScSSHClientAfterConnect(Sender: TObject);
begin
ShowSSHButtons;
end;
procedure TSSHClientFrame.ScSSHClientAfterDisconnect(Sender: TObject);
begin
ShowSSHButtons;
ScSSHChannel.Disconnect;
end;
procedure TSSHClientFrame.btConnectSSHClick(Sender: TObject);
var
OldCursor: TCursor;
begin
OldCursor := Screen.Cursor;
try
Screen.Cursor := crHourGlass;
ScSSHClient.Connect;
finally
Screen.Cursor := OldCursor;
end;
end;
procedure TSSHClientFrame.btDisconnectSSHClick(Sender: TObject);
begin
DisconnectAll;
end;
procedure TSSHClientFrame.EnableLPFComponents(Enabled: boolean);
begin
lbListenPort.Enabled := Enabled;
seListenPort.Enabled := Enabled;
end;
procedure TSSHClientFrame.rbLocalPFClick(Sender: TObject);
begin
EnableLPFComponents(True);
UniConnection.Disconnect;
end;
procedure TSSHClientFrame.rbDirectClick(Sender: TObject);
begin
EnableLPFComponents(False);
UniConnection.Disconnect;
end;
procedure TSSHClientFrame.edListenPortChange(Sender: TObject);
begin
UniConnection.Disconnect;
ScSSHChannel.Disconnect;
end;
procedure TSSHClientFrame.ShowPasswordAuth(pa: boolean);
begin
pnPassword.Visible := pa;
pnPrivateKey.Visible := not pa;
Repaint;
end;
procedure TSSHClientFrame.rbPasswordClick(Sender: TObject);
begin
ShowPasswordAuth(True);
DisconnectAll;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?