Sample code for 30+ languages & platforms
Tcl

SSH Keyboard Authentication

See more SSH Examples

Demonstrates how to implement keyboard authentication with an SSH server.

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

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

set ssh [new_CkSsh]

# Set some timeouts, in milliseconds:
CkSsh_put_ConnectTimeoutMs $ssh 5000
CkSsh_put_IdleTimeoutMs $ssh 15000

# Connect to the SSH server.  
# The standard SSH port = 22
# The hostname may be a hostname or IP address.
set hostname "sftp.example.com"
set port 22
set success [CkSsh_Connect $ssh $hostname $port]
if {$success != 1} then {
    puts [CkSsh_lastErrorText $ssh]
    delete_CkSsh $ssh
    exit
}

# Begin keyboard authentication..
set xmlResponse [CkSsh_startKeyboardAuth $ssh "myLogin"]
if {[CkSsh_get_LastMethodSuccess $ssh] != 1} then {
    puts [CkSsh_lastErrorText $ssh]
    delete_CkSsh $ssh
    exit
}

# If a user authentication banner was received, then your app
# may display it prior to prompting for the password.
puts "UserAuthBanner: [CkSsh_userAuthBanner $ssh]"

set xml [new_CkXml]

set success [CkXml_LoadXml $xml $xmlResponse]
# Assume LoadXml succeeds for the example..
if {[CkXml_HasChildWithTag $xml "success"] == 1} then {
    puts "No password required, already authenticated."
    delete_CkSsh $ssh
    delete_CkXml $xml
    exit
}

if {[CkXml_HasChildWithTag $xml "error"] == 1} then {
    puts "Authentication already failed."
    delete_CkSsh $ssh
    delete_CkXml $xml
    exit
}

# 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.
set xmlResponse [CkSsh_continueKeyboardAuth $ssh "myPassword"]
if {[CkSsh_get_LastMethodSuccess $ssh] != 1} then {
    puts [CkSsh_lastErrorText $ssh]
    delete_CkSsh $ssh
    delete_CkXml $xml
    exit
}

set success [CkXml_LoadXml $xml $xmlResponse]
# Assume LoadXml succeeds for the example..
if {[CkXml_HasChildWithTag $xml "success"] == 1} then {
    puts "SSH Keyboard Authentication Successful!"
    delete_CkSsh $ssh
    delete_CkXml $xml
    exit
}

if {[CkXml_HasChildWithTag $xml "error"] == 1} then {
    puts "Authentication failed."
    delete_CkSsh $ssh
    delete_CkXml $xml
    exit
}


delete_CkSsh $ssh
delete_CkXml $xml