Platforms to show: All Mac Windows Linux Cross-Platform
/Network/SSH/SSH tunnel for database
Required plugins for this example: MBS Network Plugin
You find this example project in your Plugins Download as a Xojo project file within the examples folder: /Network/SSH/SSH tunnel for database
This example is the version from Fri, 4th Mar 2021.
Project "SSH tunnel for database.xojo_binary_project"
Class App Inherits ConsoleApplication
Const kenn = ""
EventHandler Function Run(args() as String) As Integer
const Address = "1.2.3.4"
const username = "xxx"
const password = "xxx"
const keyfile1 = ""
const keyfile2 = ""
dim hostAddr as string = System.Network.LookupIPAddress(Address)
print hostAddr
//* Create a session instance and start it up. This will trade welcome
//* banners, exchange keys, and setup crypto, compression, and MAC layers
dim session as new MySSH2SessionMBS(hostAddr, 22)
session.MyPassword = password
if session.Handle = 0 then
print "Failed to connect socket!"
Return 1
end if
session.SessionHandshake
if session.lasterror<>0 then
print "Failure establishing SSH session"
Return 9
end if
//* At this point we havn't authenticated. The first thing to do is check
//* the hostkey's fingerprint against our known hosts Your app may have it
//* hard coded, may go to a file, may present it to the user, that's your
//* call
dim fingerprint as string = session.HostKeyHash(session.kHostKeyHashSHA1)
print "Fingerprint: "+EncodeHex(fingerprint)
//* check what authentication methods are available */
dim userauthlist as string = session.UserAuthList(username)
dim authPassword as Boolean = false
dim authKeyboardInteractive as Boolean = false
dim authPublickey as Boolean = false
print "Authentication methods: "+ userauthlist
if instr(userauthlist, "password")>0 then
authPassword = true
end if
if instr(userauthlist, "keyboard-interactive")>0 then
authKeyboardInteractive = true
end if
if instr(userauthlist, "publickey")>0 then
authPublickey = true
end if
if authPassword then
//* We could authenticate via password */
session.UserAuthPassword(username, password)
if session.LastError = 0 then
// ok
print "Authentication by password succeeded."
else
// failed
print "Authentication by password failed!"
Return 1
end if
elseif authKeyboardInteractive then
//* Or via keyboard-interactive */
session.UserAuthKeyboardInteractive username
if session.LastError <> 0 then
print "Authentication by keyboard-interactive failed!"
return 10
else
print "Authentication by keyboard-interactive succeeded."
end if
//* Or by public key */
elseif authPublickey then
session.UserAuthPublicKeyFromFile(username, keyfile1, keyfile2, password)
if session.LastError <> 0 then
print "Authentication by public key failed!"
Return 4
else
print "Authentication by public key succeeded."
end if
else
print "No supported authentication methods found!"
Return 3
end if
// here we are authorized
//* Open tunnel */
dim tunnel as new SSH2TunnelMBS(session)
tunnel.LocalAddress = "127.0.0.1"
tunnel.LocalPort = 3307
tunnel.RemoteAddress = "127.0.0.1"
tunnel.RemotePort = 3306
// avoid timeing out in Socket and SSH layers
tunnel.KeepAlive = True
session.ConfigureKeepAlive
// run it
tunnel.Run
// while it runs, connect to database server
// don't alter session while tunnel runs
// wait a bit to let things happen in background
app.DoEvents(50)
// print message for debugging
#if DebugBuild then
print tunnel.Messages
#endif
// now use it, e.g. with MySQL via Xojo's plugin
dim db as new MySQLCommunityServer
db.Host = "127.0.0.1"
db.DatabaseName = "xxx"
db.UserName = "xxx"
db.Password = "xxx"
db.Port = 3307
if db.Connect then
print "Connected"
else
print "Failed to connect: "+db.ErrorMessage
end if
// shutdown
db = nil
tunnel.Cancel = true
// wait for shutdown
do
app.DoEvents 10
loop until not tunnel.Running
print tunnel.Messages
session.Disconnect "Normal Shutdown, Thank you for playing"
session = nil
print "done"
Return 0
End EventHandler
End Class
Class MySSH2SessionMBS Inherits SSH2SessionMBS
EventHandler Sub KeyboardCallback(Name as string, Instruction as string, PromptCount as integer, Prompts() as SSH2UserAuthKeyboardInteractivePromptMBS, responses() as SSH2UserAuthKeyboardInteractiveResponseMBS)
print "Name: "+Name
print "Instruction: "+Instruction
for each p as SSH2UserAuthKeyboardInteractivePromptMBS in Prompts
print p.Text
next
if PromptCount = 1 then
responses(0).Text = MyPassword
end if
End EventHandler
Property MyPassword As string
End Class
End Project
See also:
The items on this page are in the following plugins: MBS Network Plugin.