Sample code for 30+ languages & platforms
PureBasic

SSH Keyboard Authentication

See more SSH Examples

Demonstrates how to implement keyboard authentication with an SSH server.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkSsh.pb"
IncludeFile "CkXml.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This example assumes the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    ssh.i = CkSsh::ckCreate()
    If ssh.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Set some timeouts, in milliseconds:
    CkSsh::setCkConnectTimeoutMs(ssh, 5000)
    CkSsh::setCkIdleTimeoutMs(ssh, 15000)

    ; Connect to the SSH server.  
    ; The standard SSH port = 22
    ; The hostname may be a hostname or IP address.
    hostname.s = "sftp.example.com"
    port.i = 22
    success = CkSsh::ckConnect(ssh,hostname,port)
    If success <> 1
        Debug CkSsh::ckLastErrorText(ssh)
        CkSsh::ckDispose(ssh)
        ProcedureReturn
    EndIf

    ; Begin keyboard authentication..
    xmlResponse.s = CkSsh::ckStartKeyboardAuth(ssh,"myLogin")
    If CkSsh::ckLastMethodSuccess(ssh) <> 1
        Debug CkSsh::ckLastErrorText(ssh)
        CkSsh::ckDispose(ssh)
        ProcedureReturn
    EndIf

    ; If a user authentication banner was received, then your app
    ; may display it prior to prompting for the password.
    Debug "UserAuthBanner: " + CkSsh::ckUserAuthBanner(ssh)

    xml.i = CkXml::ckCreate()
    If xml.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkXml::ckLoadXml(xml,xmlResponse)
    ; Assume LoadXml succeeds for the example..
    If CkXml::ckHasChildWithTag(xml,"success") = 1
        Debug "No password required, already authenticated."
        CkSsh::ckDispose(ssh)
        CkXml::ckDispose(xml)
        ProcedureReturn
    EndIf

    If CkXml::ckHasChildWithTag(xml,"error") = 1
        Debug "Authentication already failed."
        CkSsh::ckDispose(ssh)
        CkXml::ckDispose(xml)
        ProcedureReturn
    EndIf

    ; See the online reference documentation for Chilkat SSH.
    ; The XML returned by StartKeyboardAuth will contain an infoRequest
    ; with one or more prompts that your application may choose to display.

    ; Call ContinueKeyboardAuth, passing in the whatever information is requires (such as the password).
    ; Typically, keyboard authentication requires one call to ContinueKeyboardAuth 
    ; using the password.  Theoretically, the SSH server could prompt for additional pieces
    ; of information.  The authentication is completed when the XML returned contains
    ; either a "success" or "error" child node.

    ; This example asumes only one call to ContinueKeyboardAuth is required.
    xmlResponse = CkSsh::ckContinueKeyboardAuth(ssh,"myPassword")
    If CkSsh::ckLastMethodSuccess(ssh) <> 1
        Debug CkSsh::ckLastErrorText(ssh)
        CkSsh::ckDispose(ssh)
        CkXml::ckDispose(xml)
        ProcedureReturn
    EndIf

    success = CkXml::ckLoadXml(xml,xmlResponse)
    ; Assume LoadXml succeeds for the example..
    If CkXml::ckHasChildWithTag(xml,"success") = 1
        Debug "SSH Keyboard Authentication Successful!"
        CkSsh::ckDispose(ssh)
        CkXml::ckDispose(xml)
        ProcedureReturn
    EndIf

    If CkXml::ckHasChildWithTag(xml,"error") = 1
        Debug "Authentication failed."
        CkSsh::ckDispose(ssh)
        CkXml::ckDispose(xml)
        ProcedureReturn
    EndIf



    CkSsh::ckDispose(ssh)
    CkXml::ckDispose(xml)


    ProcedureReturn
EndProcedure