Sample code for 30+ languages & platforms
PureBasic

SSH Quick/Simple Shell Session

See more SSH Examples

Demonstrates the simplified way to run multiple commands in a shell session on an SSH server.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkSsh.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This example requires 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

    port.i = 22
    success = CkSsh::ckConnect(ssh,"the-ssh-server.com",port)
    If success = 0
        Debug CkSsh::ckLastErrorText(ssh)
        CkSsh::ckDispose(ssh)
        ProcedureReturn
    EndIf

    ; Authenticate using login/password:
    success = CkSsh::ckAuthenticatePw(ssh,"theSshLogin","theSshPassword")
    If success = 0
        Debug CkSsh::ckLastErrorText(ssh)
        CkSsh::ckDispose(ssh)
        ProcedureReturn
    EndIf

    ; Start a shell session.
    channelNum.i = CkSsh::ckQuickShell(ssh)
    If channelNum < 0
        Debug CkSsh::ckLastErrorText(ssh)
        CkSsh::ckDispose(ssh)
        ProcedureReturn
    EndIf

    ; Construct a StringBuilder with multiple commands, one per line.
    ; Note: The line-endings are potentially important.  Some SSH servers may
    ; require either LF or CRLF line endings.  (Unix/Linux/OSX servers typically
    ; use bare-LF line endings.  Windows servers likely use CRLF line endings.)
    sbCommands.i = CkStringBuilder::ckCreate()
    If sbCommands.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkStringBuilder::ckAppend(sbCommands,"echo hello world" + Chr(10))
    CkStringBuilder::ckAppend(sbCommands,"date" + Chr(10))
    CkStringBuilder::ckAppend(sbCommands,"df" + Chr(10))

    ; For our last command, we're going to echo a marker string that
    ; we'll use in ChannelReceiveUntilMatch below.
    ; The use of single quotes around 'IS' is a trick so that the output
    ; of the command is "THIS IS THE END OF THE SCRIPT", but the terminal echo
    ; includes the single quotes.  This allows us to read until we see the actual
    ; output of the last command.
    CkStringBuilder::ckAppend(sbCommands,"echo THIS 'IS' THE END OF THE SCRIPT" + Chr(10))

    ; Send the commands..
    success = CkSsh::ckChannelSendString(ssh,channelNum,CkStringBuilder::ckGetAsString(sbCommands),"ansi")
    If success = 0
        Debug CkSsh::ckLastErrorText(ssh)
        CkSsh::ckDispose(ssh)
        CkStringBuilder::ckDispose(sbCommands)
        ProcedureReturn
    EndIf

    ; Receive output up to our marker.
    success = CkSsh::ckChannelReceiveUntilMatch(ssh,channelNum,"THIS IS THE END OF THE SCRIPT","ansi",1)

    ; Send an EOF to indicate no more commands will be sent.
    ; For brevity, we're not checking the return values of each method call.
    ; Your code should check the success/failure of each call.
    success = CkSsh::ckChannelSendEof(ssh,channelNum)

    ; Close the channel.
    ; It is important to close the channel only after receiving the desired output.
    success = CkSsh::ckChannelSendClose(ssh,channelNum)

    ; Get any remaining output..
    success = CkSsh::ckChannelReceiveToClose(ssh,channelNum)

    ; Get the complete output for all the commands in the session.
    Debug "--- output ----"
    Debug CkSsh::ckGetReceivedText(ssh,channelNum,"ansi")

    ; Here's our actual sample output:

    ; 	Last login: Thu Dec 22 20:19:09 2016 from chilkat13
    ; 
    ; 	echo hello world
    ; 	date
    ; 	df
    ; 	echo THIS 'IS' THE END OF THE SCRIPT
    ; 	chilkatosx:~ chilkat$ echo hello world
    ; 	hello world
    ; 	chilkatosx:~ chilkat$ date
    ; 	Thu Dec 22 20:30:48 CST 2016
    ; 	chilkatosx:~ chilkat$ df
    ; 	Filesystem    512-blocks      Used  Available Capacity  iused     ifree %iused  Mounted on
    ; 	/dev/disk2    2176716032 265768928 1910435104    13% 33285114 238804388   12%   /
    ; 	devfs                383       383          0   100%      664         0  100%   /dev
    ; 	map -hosts             0         0          0   100%        0         0  100%   /net
    ; 	map auto_home          0         0          0   100%        0         0  100%   /home
    ; 	/dev/disk3s2      374668    374668          0   100%    93665         0  100%   /Volumes/Google Chrome
    ; 	chilkatosx:~ chilkat$ echo THIS 'IS' THE END OF THE SCRIPT
    ; 	THIS IS THE END OF THE SCRIPT
    ; 	chilkatosx:~ chilkat$ 


    CkSsh::ckDispose(ssh)
    CkStringBuilder::ckDispose(sbCommands)


    ProcedureReturn
EndProcedure