📄 ssh_client.pas
字号:
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -