Platforms to show: All Mac Windows Linux Cross-Platform

/Network/SSH/SSH with Xojo Socket


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 with Xojo Socket

This example is the version from Mon, 19th Jan 2014.

Project "SSH with Xojo Socket.xojo_binary_project"
Class App Inherits ConsoleApplication
EventHandler Function Run(args() as String) As Integer const Address = "localhost" const username = "cs" const password = "test" const keyfile1 = "" const keyfile2 = "" dim hostAddr as string = System.Network.LookupIPAddress(Address) print hostAddr // create new socket dim sock as new MySocket sock.Address = hostAddr sock.port = 22 sock.Connect do app.DoEvents 10 if sock.GotError then print "Got error." Return 12 end if loop until sock.GotConnection //* 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(sock.Handle, false) dim session as new MySSH2SessionMBS(sock) session.tag = sock 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 //* Request a shell */ dim channel as SSH2ChannelMBS = session.OpenSession if channel = nil then print "Unable to open a session" Return 4 end if //* Some environment variables may be set, //* It's up to the server which ones it'll allow though channel.SetEnv "FOO", "bar" //* Request a terminal with 'vanilla' terminal emulation //* See /etc/termcap for more options channel.RequestPTY "vanilla" if channel.LastError <> 0 then print "Failed requesting pty" Return 5 end if // Open a SHELL on that pty // channel.Shell if channel.LastError <> 0 then print "Unable to request shell on allocated pty" Return 6 end if channel.SetBlocking false //* At this point the shell can be interacted with using //* libssh2_channel_read() //* libssh2_channel_read_stderr() //* libssh2_channel_write() //* libssh2_channel_write_stderr() //* //* Blocking mode may be (en|dis)abled with: libssh2_channel_set_blocking() //* If the server send EOF, libssh2_channel_eof() will return non-0 //* To send EOF to the server use: libssh2_channel_send_eof() //* A channel can be closed with: libssh2_channel_close() //* A channel can be freed with: libssh2_channel_free() app.DoEvents 10 // read greetings dim s as string = channel.Read(10000) print s app.DoEvents 10 call channel.Write "ls"+EndOfLine.UNIX do app.DoEvents 10 s = channel.Read(10000) if channel.LastError = session.kErrorEagain then // no answer yet Continue else print s exit end if loop channel.Close channel = nil 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
Class MySocket Inherits TCPSocket
EventHandler Sub Connected() GotConnection = true End EventHandler
EventHandler Sub Error() GotError = true End EventHandler
Property GotConnection As Boolean
Property GotError As Boolean
End Class
End Project

See also:

The items on this page are in the following plugins: MBS Network Plugin.


The biggest plugin in space...