Sample code for 30+ languages & platforms
Visual FoxPro

Start SSH Tunnel Keyboard-Interactive Authentication

See more SSH Tunnel Examples

Demonstrates the Chilkat SshTunnel.StartKeyboardAuth method, which begins keyboard-interactive authentication. The only argument is the login name. It returns XML describing the server's prompts, which are answered with ContinueKeyboardAuth.

Background: Keyboard-interactive is the prompt-driven authentication method: the server sends one or more questions — a password, a one-time code, a security question — and the client answers each. This is how a tunnel supports two-factor and other challenge-response schemes. The returned XML says exactly what to ask and whether to mask the input.

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loTunnel
LOCAL lnSshPort
LOCAL lcInfoRequestXml
LOCAL lnWaitForThreadExit

lnSuccess = 0

*  Demonstrates the SshTunnel.StartKeyboardAuth method, which begins keyboard-interactive
*  authentication.  The only argument is the login name.  It returns XML describing the server's
*  prompts, which are answered with ContinueKeyboardAuth.

loTunnel = CreateObject('Chilkat.SshTunnel')

*  The tunnel forwards accepted local connections to this destination through the SSH server.
loTunnel.DestHostname = "db.internal.example.com"
loTunnel.DestPort = 5432

*  Connect to the SSH server.  This performs the TCP/proxy connection and SSH handshake, but
*  does not authenticate yet.
lnSshPort = 22
lnSuccess = loTunnel.Connect("ssh.example.com",lnSshPort)
IF (lnSuccess = 0) THEN
    ? loTunnel.LastErrorText
    RELEASE loTunnel
    CANCEL
ENDIF

*  Begin keyboard-interactive authentication.  The returned XML describes the server's prompts.
lcInfoRequestXml = loTunnel.StartKeyboardAuth("mySshLogin")
IF (loTunnel.LastMethodSuccess = 0) THEN
    ? loTunnel.LastErrorText
    RELEASE loTunnel
    CANCEL
ENDIF

? lcInfoRequestXml

*  Answer the prompt(s) with ContinueKeyboardAuth, then call BeginAccepting.

lnWaitForThreadExit = 1
lnSuccess = loTunnel.CloseTunnel(lnWaitForThreadExit)
IF (lnSuccess = 0) THEN
    ? loTunnel.LastErrorText
    RELEASE loTunnel
    CANCEL
ENDIF

RELEASE loTunnel