Sample code for 30+ languages & platforms
Visual FoxPro

Release an SSH Channel's Local Resources

See more SSH Examples

Demonstrates the Chilkat Ssh.ChannelRelease method, which releases Chilkat's retained local resources for a channel after all output and exit information has been retrieved. The only argument is the channel number.

Background: Chilkat retains a channel's buffered output and exit information after the channel closes, so you can still read a command's final output. That retention costs memory, and a long-running program that opens many channels should release each one when finished with it. Note this is not a channel-closing method — it sends neither EOF nor CLOSE. Retrieve everything you need first, because releasing discards it.

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loSsh
LOCAL lnSshPort
LOCAL lcPassword
LOCAL lnChannelNum
LOCAL lcOutput

lnSuccess = 0

*  Demonstrates the Ssh.ChannelRelease method, which releases Chilkat's retained local resources
*  for a channel after all output and exit information has been retrieved.  The only argument is
*  the channel number.

loSsh = CreateObject('Chilkat.Ssh')

lnSshPort = 22
lnSuccess = loSsh.Connect("ssh.example.com",lnSshPort)
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

*  Open a session channel.  A negative return value indicates failure.
lnChannelNum = loSsh.OpenSessionChannel()
IF (lnChannelNum < 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

lnSuccess = loSsh.SendReqExec(lnChannelNum,"uname -a")
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

*  Retrieve everything of interest before releasing the channel.
lnSuccess = loSsh.ChannelReceiveToClose(lnChannelNum)
IF (lnSuccess = 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

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

? lcOutput

*  Release the retained local resources.  This does not send EOF or CLOSE.
loSsh.ChannelRelease(lnChannelNum)

loSsh.Disconnect()

RELEASE loSsh