Sample code for 30+ languages & platforms
Xojo Plugin

Multiple SendReqExec on the Same Connection

See more SSH Examples

Demonstrates running a series of commands on one SSH connection using SendReqExec. Each exec request requires its own logical channel — this is not a separate SSH connection, just a new session channel on the existing one.

Background: An SSH session channel is single-use for an exec request: once the command runs and the server closes the channel, that channel cannot be reused. Opening a fresh channel per command is cheap, since the expensive work — the TCP connection, key exchange, and authentication — is done once and shared. This is why running ten commands over one connection is far faster than connecting ten times.

Chilkat Xojo Plugin Downloads

Xojo Plugin
Dim success As Boolean
success = False

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

//  Demonstrates running a series of commands on one SSH connection using SendReqExec.  Each exec
//  request requires its own logical channel.  This is not a new SSH connection -- it is simply a
//  new session channel on the existing one.

Dim ssh As New Chilkat.Ssh

Dim hostname As String
hostname = "ssh.example.com"
Dim port As Int32
port = 22
success = ssh.Connect(hostname,port)
If (success = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

//  Normally you would not hard-code the password in source.  You should instead obtain it
//  from an interactive prompt, environment variable, or a secrets vault.
Dim password As String
password = "mySshPassword"

success = ssh.AuthenticatePw("mySshLogin",password)
If (success = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

//  IMPORTANT: Set a read timeout.  ReadTimeoutMs defaults to 0, which means no limit -- without
//  it, this call waits forever if the server never sends channel close.
ssh.ReadTimeoutMs = 15000

//  ---- 1st command, on its own session channel ----
Dim channelNum As Int32
channelNum = ssh.OpenSessionChannel()
If (channelNum < 0) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

success = ssh.SendReqExec(channelNum,"ls -al")
If (success = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

success = ssh.ChannelReceiveToClose(channelNum)
If (success = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

Dim cmdOutput As String
cmdOutput = ssh.GetReceivedText(channelNum,"utf-8")
If (ssh.LastMethodSuccess = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

System.DebugLog(cmdOutput)
System.DebugLog("----")

//  ---- 2nd command, on a NEW session channel over the same connection ----
channelNum = ssh.OpenSessionChannel()
If (channelNum < 0) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

success = ssh.SendReqExec(channelNum,"nslookup chilkatsoft.com")
If (success = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

success = ssh.ChannelReceiveToClose(channelNum)
If (success = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

cmdOutput = ssh.GetReceivedText(channelNum,"utf-8")
If (ssh.LastMethodSuccess = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

System.DebugLog(cmdOutput)

ssh.Disconnect