Sample code for 30+ languages & platforms
Visual FoxPro

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 Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loSsh
LOCAL lcHostname
LOCAL lnPort
LOCAL lcPassword
LOCAL lnChannelNum
LOCAL lcCmdOutput

lnSuccess = 0

*  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.

loSsh = CreateObject('Chilkat.Ssh')

lcHostname = "ssh.example.com"
lnPort = 22
lnSuccess = loSsh.Connect(lcHostname,lnPort)
IF (lnSuccess = 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

*  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.
lcPassword = "mySshPassword"

lnSuccess = loSsh.AuthenticatePw("mySshLogin",lcPassword)
IF (lnSuccess = 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

*  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.
loSsh.ReadTimeoutMs = 15000

*  ---- 1st command, on its own session channel ----
lnChannelNum = loSsh.OpenSessionChannel()
IF (lnChannelNum < 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

lnSuccess = loSsh.SendReqExec(lnChannelNum,"ls -al")
IF (lnSuccess = 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

lnSuccess = loSsh.ChannelReceiveToClose(lnChannelNum)
IF (lnSuccess = 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

lcCmdOutput = loSsh.GetReceivedText(lnChannelNum,"utf-8")
IF (loSsh.LastMethodSuccess = 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

? lcCmdOutput
? "----"

*  ---- 2nd command, on a NEW session channel over the same connection ----
lnChannelNum = loSsh.OpenSessionChannel()
IF (lnChannelNum < 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

lnSuccess = loSsh.SendReqExec(lnChannelNum,"nslookup chilkatsoft.com")
IF (lnSuccess = 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

lnSuccess = loSsh.ChannelReceiveToClose(lnChannelNum)
IF (lnSuccess = 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

lcCmdOutput = loSsh.GetReceivedText(lnChannelNum,"utf-8")
IF (loSsh.LastMethodSuccess = 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

? lcCmdOutput

loSsh.Disconnect()

RELEASE loSsh